Remove the service template parameters, and the corresponding classes.

For example, instead of basic_socket<Protocol, SocketService> we now have
simply basic_socket<Protocol>. The old interface can be enabled by defining
the ASIO_ENABLE_OLD_SERVICES macro.
diff --git a/asio/include/asio.hpp b/asio/include/asio.hpp
index 8dcf273..7cbf667 100644
--- a/asio/include/asio.hpp
+++ b/asio/include/asio.hpp
@@ -99,6 +99,7 @@
 #include "asio/placeholders.hpp"
 #include "asio/posix/basic_descriptor.hpp"
 #include "asio/posix/basic_stream_descriptor.hpp"
+#include "asio/posix/descriptor.hpp"
 #include "asio/posix/descriptor_base.hpp"
 #include "asio/posix/stream_descriptor.hpp"
 #include "asio/posix/stream_descriptor_service.hpp"
@@ -133,6 +134,7 @@
 #include "asio/windows/basic_stream_handle.hpp"
 #include "asio/windows/object_handle.hpp"
 #include "asio/windows/object_handle_service.hpp"
+#include "asio/windows/overlapped_handle.hpp"
 #include "asio/windows/overlapped_ptr.hpp"
 #include "asio/windows/random_access_handle.hpp"
 #include "asio/windows/random_access_handle_service.hpp"
diff --git a/asio/include/asio/basic_datagram_socket.hpp b/asio/include/asio/basic_datagram_socket.hpp
index d9748ee..f72ebbf 100644
--- a/asio/include/asio/basic_datagram_socket.hpp
+++ b/asio/include/asio/basic_datagram_socket.hpp
@@ -37,14 +37,19 @@
  * @e Distinct @e objects: Safe.@n
  * @e Shared @e objects: Unsafe.
  */
-template <typename Protocol,
-    typename DatagramSocketService = datagram_socket_service<Protocol> >
+template <typename Protocol
+    ASIO_SVC_TPARAM_DEF1(= datagram_socket_service<Protocol>)>
 class basic_datagram_socket
-  : public basic_socket<Protocol, DatagramSocketService>
+  : public basic_socket<Protocol ASIO_SVC_TARG>
 {
 public:
   /// The native representation of a socket.
-  typedef typename DatagramSocketService::native_handle_type native_handle_type;
+#if defined(GENERATING_DOCUMENTATION)
+  typedef implementation_defined native_handle_type;
+#else
+  typedef typename basic_socket<
+    Protocol ASIO_SVC_TARG>::native_handle_type native_handle_type;
+#endif
 
   /// The protocol type.
   typedef Protocol protocol_type;
@@ -62,7 +67,7 @@
    * socket.
    */
   explicit basic_datagram_socket(asio::io_context& io_context)
-    : basic_socket<Protocol, DatagramSocketService>(io_context)
+    : basic_socket<Protocol ASIO_SVC_TARG>(io_context)
   {
   }
 
@@ -80,7 +85,7 @@
    */
   basic_datagram_socket(asio::io_context& io_context,
       const protocol_type& protocol)
-    : basic_socket<Protocol, DatagramSocketService>(io_context, protocol)
+    : basic_socket<Protocol ASIO_SVC_TARG>(io_context, protocol)
   {
   }
 
@@ -102,7 +107,7 @@
    */
   basic_datagram_socket(asio::io_context& io_context,
       const endpoint_type& endpoint)
-    : basic_socket<Protocol, DatagramSocketService>(io_context, endpoint)
+    : basic_socket<Protocol ASIO_SVC_TARG>(io_context, endpoint)
   {
   }
 
@@ -123,7 +128,7 @@
    */
   basic_datagram_socket(asio::io_context& io_context,
       const protocol_type& protocol, const native_handle_type& native_socket)
-    : basic_socket<Protocol, DatagramSocketService>(
+    : basic_socket<Protocol ASIO_SVC_TARG>(
         io_context, protocol, native_socket)
   {
   }
@@ -140,8 +145,7 @@
    * constructed using the @c basic_datagram_socket(io_context&) constructor.
    */
   basic_datagram_socket(basic_datagram_socket&& other)
-    : basic_socket<Protocol, DatagramSocketService>(
-        ASIO_MOVE_CAST(basic_datagram_socket)(other))
+    : basic_socket<Protocol ASIO_SVC_TARG>(std::move(other))
   {
   }
 
@@ -158,8 +162,7 @@
    */
   basic_datagram_socket& operator=(basic_datagram_socket&& other)
   {
-    basic_socket<Protocol, DatagramSocketService>::operator=(
-        ASIO_MOVE_CAST(basic_datagram_socket)(other));
+    basic_socket<Protocol ASIO_SVC_TARG>::operator=(std::move(other));
     return *this;
   }
 
@@ -174,13 +177,11 @@
    * @note Following the move, the moved-from object is in the same state as if
    * constructed using the @c basic_datagram_socket(io_context&) constructor.
    */
-  template <typename Protocol1, typename DatagramSocketService1>
+  template <typename Protocol1 ASIO_SVC_TPARAM1>
   basic_datagram_socket(
-      basic_datagram_socket<Protocol1, DatagramSocketService1>&& other,
+      basic_datagram_socket<Protocol1 ASIO_SVC_TARG1>&& other,
       typename enable_if<is_convertible<Protocol1, Protocol>::value>::type* = 0)
-    : basic_socket<Protocol, DatagramSocketService>(
-        ASIO_MOVE_CAST2(basic_datagram_socket<
-          Protocol1, DatagramSocketService1>)(other))
+    : basic_socket<Protocol ASIO_SVC_TARG>(std::move(other))
   {
   }
 
@@ -196,18 +197,25 @@
    * @note Following the move, the moved-from object is in the same state as if
    * constructed using the @c basic_datagram_socket(io_context&) constructor.
    */
-  template <typename Protocol1, typename DatagramSocketService1>
+  template <typename Protocol1 ASIO_SVC_TPARAM1>
   typename enable_if<is_convertible<Protocol1, Protocol>::value,
       basic_datagram_socket>::type& operator=(
-        basic_datagram_socket<Protocol1, DatagramSocketService1>&& other)
+        basic_datagram_socket<Protocol1 ASIO_SVC_TARG1>&& other)
   {
-    basic_socket<Protocol, DatagramSocketService>::operator=(
-        ASIO_MOVE_CAST2(basic_datagram_socket<
-          Protocol1, DatagramSocketService1>)(other));
+    basic_socket<Protocol ASIO_SVC_TARG>::operator=(std::move(other));
     return *this;
   }
 #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
 
+  /// Destroys the socket.
+  /**
+   * This function destroys the socket, cancelling any outstanding asynchronous
+   * operations associated with the socket as if by calling @c cancel.
+   */
+  ~basic_datagram_socket()
+  {
+  }
+
   /// Send some data on a connected socket.
   /**
    * This function is used to send data on the datagram socket. The function
@@ -338,8 +346,18 @@
     // not meet the documented type requirements for a WriteHandler.
     ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_send(this->get_implementation(),
         buffers, 0, ASIO_MOVE_CAST(WriteHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<WriteHandler,
+      void (asio::error_code, std::size_t)> init(handler);
+
+    this->get_service().async_send(this->get_implementation(),
+        buffers, 0, init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 
   /// Start an asynchronous send on a connected socket.
@@ -381,8 +399,18 @@
     // not meet the documented type requirements for a WriteHandler.
     ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_send(this->get_implementation(),
         buffers, flags, ASIO_MOVE_CAST(WriteHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<WriteHandler,
+      void (asio::error_code, std::size_t)> init(handler);
+
+    this->get_service().async_send(this->get_implementation(),
+        buffers, flags, init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 
   /// Send a datagram to the specified endpoint.
@@ -521,9 +549,20 @@
     // not meet the documented type requirements for a WriteHandler.
     ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_send_to(
         this->get_implementation(), buffers, destination, 0,
         ASIO_MOVE_CAST(WriteHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<WriteHandler,
+      void (asio::error_code, std::size_t)> init(handler);
+
+    this->get_service().async_send_to(
+        this->get_implementation(), buffers, destination, 0,
+        init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 
   /// Start an asynchronous send.
@@ -564,9 +603,20 @@
     // not meet the documented type requirements for a WriteHandler.
     ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_send_to(
         this->get_implementation(), buffers, destination, flags,
         ASIO_MOVE_CAST(WriteHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<WriteHandler,
+      void (asio::error_code, std::size_t)> init(handler);
+
+    this->get_service().async_send_to(
+        this->get_implementation(), buffers, destination, flags,
+        init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 
   /// Receive some data on a connected socket.
@@ -704,8 +754,18 @@
     // not meet the documented type requirements for a ReadHandler.
     ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_receive(this->get_implementation(),
         buffers, 0, ASIO_MOVE_CAST(ReadHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<ReadHandler,
+      void (asio::error_code, std::size_t)> init(handler);
+
+    this->get_service().async_receive(this->get_implementation(),
+        buffers, 0, init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 
   /// Start an asynchronous receive on a connected socket.
@@ -747,8 +807,18 @@
     // not meet the documented type requirements for a ReadHandler.
     ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_receive(this->get_implementation(),
         buffers, flags, ASIO_MOVE_CAST(ReadHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<ReadHandler,
+      void (asio::error_code, std::size_t)> init(handler);
+
+    this->get_service().async_receive(this->get_implementation(),
+        buffers, flags, init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 
   /// Receive a datagram with the endpoint of the sender.
@@ -887,9 +957,20 @@
     // not meet the documented type requirements for a ReadHandler.
     ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_receive_from(
         this->get_implementation(), buffers, sender_endpoint, 0,
         ASIO_MOVE_CAST(ReadHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<ReadHandler,
+      void (asio::error_code, std::size_t)> init(handler);
+
+    this->get_service().async_receive_from(
+        this->get_implementation(), buffers, sender_endpoint, 0,
+        init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 
   /// Start an asynchronous receive.
@@ -932,9 +1013,20 @@
     // not meet the documented type requirements for a ReadHandler.
     ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_receive_from(
         this->get_implementation(), buffers, sender_endpoint, flags,
         ASIO_MOVE_CAST(ReadHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<ReadHandler,
+      void (asio::error_code, std::size_t)> init(handler);
+
+    this->get_service().async_receive_from(
+        this->get_implementation(), buffers, sender_endpoint, flags,
+        init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 };
 
diff --git a/asio/include/asio/basic_deadline_timer.hpp b/asio/include/asio/basic_deadline_timer.hpp
index 030053e..24ddec2 100644
--- a/asio/include/asio/basic_deadline_timer.hpp
+++ b/asio/include/asio/basic_deadline_timer.hpp
@@ -26,6 +26,12 @@
 #include "asio/detail/handler_type_requirements.hpp"
 #include "asio/detail/throw_error.hpp"
 #include "asio/error.hpp"
+#include "asio/time_traits.hpp"
+
+#if !defined(ASIO_ENABLE_OLD_SERVICES)
+# include "asio/detail/deadline_timer_service.hpp"
+# define ASIO_SVC_T detail::deadline_timer_service<TimeTraits>
+#endif // !defined(ASIO_ENABLE_OLD_SERVICES)
 
 #include "asio/detail/push_options.hpp"
 
@@ -120,12 +126,15 @@
  * it contains the value asio::error::operation_aborted.
  */
 template <typename Time,
-    typename TimeTraits = asio::time_traits<Time>,
-    typename TimerService = deadline_timer_service<Time, TimeTraits> >
+    typename TimeTraits = asio::time_traits<Time>
+    ASIO_SVC_TPARAM_DEF2(= deadline_timer_service<Time, TimeTraits>)>
 class basic_deadline_timer
-  : public basic_io_object<TimerService>
+  : ASIO_SVC_ACCESS basic_io_object<ASIO_SVC_T>
 {
 public:
+  /// The type of the executor associated with the object.
+  typedef io_context::executor_type executor_type;
+
   /// The time traits type.
   typedef TimeTraits traits_type;
 
@@ -145,7 +154,7 @@
    * handlers for any asynchronous operations performed on the timer.
    */
   explicit basic_deadline_timer(asio::io_context& io_context)
-    : basic_io_object<TimerService>(io_context)
+    : basic_io_object<ASIO_SVC_T>(io_context)
   {
   }
 
@@ -161,7 +170,7 @@
    */
   basic_deadline_timer(asio::io_context& io_context,
       const time_type& expiry_time)
-    : basic_io_object<TimerService>(io_context)
+    : basic_io_object<ASIO_SVC_T>(io_context)
   {
     asio::error_code ec;
     this->get_service().expires_at(this->get_implementation(), expiry_time, ec);
@@ -180,7 +189,7 @@
    */
   basic_deadline_timer(asio::io_context& io_context,
       const duration_type& expiry_time)
-    : basic_io_object<TimerService>(io_context)
+    : basic_io_object<ASIO_SVC_T>(io_context)
   {
     asio::error_code ec;
     this->get_service().expires_from_now(
@@ -188,6 +197,55 @@
     asio::detail::throw_error(ec, "expires_from_now");
   }
 
+  /// Destroys the timer.
+  /**
+   * This function destroys the timer, cancelling any outstanding asynchronous
+   * wait operations associated with the timer as if by calling @c cancel.
+   */
+  ~basic_deadline_timer()
+  {
+  }
+
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+  // These functions are provided by basic_io_object<>.
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+#if !defined(ASIO_NO_DEPRECATED)
+  /// (Deprecated: Use get_executor().) Get the io_context associated with the
+  /// object.
+  /**
+   * This function may be used to obtain the io_context object that the I/O
+   * object uses to dispatch handlers for asynchronous operations.
+   *
+   * @return A reference to the io_context object that the I/O object will use
+   * to dispatch handlers. Ownership is not transferred to the caller.
+   */
+  asio::io_context& get_io_context()
+  {
+    return basic_io_object<ASIO_SVC_T>::get_io_context();
+  }
+
+  /// (Deprecated: Use get_executor().) Get the io_context associated with the
+  /// object.
+  /**
+   * This function may be used to obtain the io_context object that the I/O
+   * object uses to dispatch handlers for asynchronous operations.
+   *
+   * @return A reference to the io_context object that the I/O object will use
+   * to dispatch handlers. Ownership is not transferred to the caller.
+   */
+  asio::io_context& get_io_service()
+  {
+    return basic_io_object<ASIO_SVC_T>::get_io_service();
+  }
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+  /// Get the executor associated with the object.
+  executor_type get_executor() ASIO_NOEXCEPT
+  {
+    return basic_io_object<ASIO_SVC_T>::get_executor();
+  }
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
+
   /// Cancel any asynchronous operations that are waiting on the timer.
   /**
    * This function forces the completion of any pending asynchronous wait
@@ -506,8 +564,17 @@
     // not meet the documented type requirements for a WaitHandler.
     ASIO_WAIT_HANDLER_CHECK(WaitHandler, handler) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_wait(this->get_implementation(),
         ASIO_MOVE_CAST(WaitHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<WaitHandler,
+      void (asio::error_code)> init(handler);
+
+    this->get_service().async_wait(this->get_implementation(), init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 };
 
@@ -515,6 +582,10 @@
 
 #include "asio/detail/pop_options.hpp"
 
+#if !defined(ASIO_ENABLE_OLD_SERVICES)
+# undef ASIO_SVC_T
+#endif // !defined(ASIO_ENABLE_OLD_SERVICES)
+
 #endif // defined(ASIO_HAS_BOOST_DATE_TIME)
        // || defined(GENERATING_DOCUMENTATION)
 
diff --git a/asio/include/asio/basic_raw_socket.hpp b/asio/include/asio/basic_raw_socket.hpp
index 3ca392b..b66b75d 100644
--- a/asio/include/asio/basic_raw_socket.hpp
+++ b/asio/include/asio/basic_raw_socket.hpp
@@ -37,14 +37,19 @@
  * @e Distinct @e objects: Safe.@n
  * @e Shared @e objects: Unsafe.
  */
-template <typename Protocol,
-    typename RawSocketService = raw_socket_service<Protocol> >
+template <typename Protocol
+    ASIO_SVC_TPARAM_DEF1(= raw_socket_service<Protocol>)>
 class basic_raw_socket
-  : public basic_socket<Protocol, RawSocketService>
+  : public basic_socket<Protocol ASIO_SVC_TARG>
 {
 public:
   /// The native representation of a socket.
-  typedef typename RawSocketService::native_handle_type native_handle_type;
+#if defined(GENERATING_DOCUMENTATION)
+  typedef implementation_defined native_handle_type;
+#else
+  typedef typename basic_socket<
+    Protocol ASIO_SVC_TARG>::native_handle_type native_handle_type;
+#endif
 
   /// The protocol type.
   typedef Protocol protocol_type;
@@ -62,7 +67,7 @@
    * socket.
    */
   explicit basic_raw_socket(asio::io_context& io_context)
-    : basic_socket<Protocol, RawSocketService>(io_context)
+    : basic_socket<Protocol ASIO_SVC_TARG>(io_context)
   {
   }
 
@@ -80,7 +85,7 @@
    */
   basic_raw_socket(asio::io_context& io_context,
       const protocol_type& protocol)
-    : basic_socket<Protocol, RawSocketService>(io_context, protocol)
+    : basic_socket<Protocol ASIO_SVC_TARG>(io_context, protocol)
   {
   }
 
@@ -102,7 +107,7 @@
    */
   basic_raw_socket(asio::io_context& io_context,
       const endpoint_type& endpoint)
-    : basic_socket<Protocol, RawSocketService>(io_context, endpoint)
+    : basic_socket<Protocol ASIO_SVC_TARG>(io_context, endpoint)
   {
   }
 
@@ -123,7 +128,7 @@
    */
   basic_raw_socket(asio::io_context& io_context,
       const protocol_type& protocol, const native_handle_type& native_socket)
-    : basic_socket<Protocol, RawSocketService>(
+    : basic_socket<Protocol ASIO_SVC_TARG>(
         io_context, protocol, native_socket)
   {
   }
@@ -140,8 +145,7 @@
    * constructed using the @c basic_raw_socket(io_context&) constructor.
    */
   basic_raw_socket(basic_raw_socket&& other)
-    : basic_socket<Protocol, RawSocketService>(
-        ASIO_MOVE_CAST(basic_raw_socket)(other))
+    : basic_socket<Protocol ASIO_SVC_TARG>(std::move(other))
   {
   }
 
@@ -157,8 +161,7 @@
    */
   basic_raw_socket& operator=(basic_raw_socket&& other)
   {
-    basic_socket<Protocol, RawSocketService>::operator=(
-        ASIO_MOVE_CAST(basic_raw_socket)(other));
+    basic_socket<Protocol ASIO_SVC_TARG>::operator=(std::move(other));
     return *this;
   }
 
@@ -172,12 +175,10 @@
    * @note Following the move, the moved-from object is in the same state as if
    * constructed using the @c basic_raw_socket(io_context&) constructor.
    */
-  template <typename Protocol1, typename RawSocketService1>
-  basic_raw_socket(basic_raw_socket<Protocol1, RawSocketService1>&& other,
+  template <typename Protocol1 ASIO_SVC_TPARAM1>
+  basic_raw_socket(basic_raw_socket<Protocol1 ASIO_SVC_TARG1>&& other,
       typename enable_if<is_convertible<Protocol1, Protocol>::value>::type* = 0)
-    : basic_socket<Protocol, RawSocketService>(
-        ASIO_MOVE_CAST2(basic_raw_socket<
-          Protocol1, RawSocketService1>)(other))
+    : basic_socket<Protocol ASIO_SVC_TARG>(std::move(other))
   {
   }
 
@@ -191,18 +192,25 @@
    * @note Following the move, the moved-from object is in the same state as if
    * constructed using the @c basic_raw_socket(io_context&) constructor.
    */
-  template <typename Protocol1, typename RawSocketService1>
+  template <typename Protocol1 ASIO_SVC_TPARAM1>
   typename enable_if<is_convertible<Protocol1, Protocol>::value,
       basic_raw_socket>::type& operator=(
-        basic_raw_socket<Protocol1, RawSocketService1>&& other)
+        basic_raw_socket<Protocol1 ASIO_SVC_TARG1>&& other)
   {
-    basic_socket<Protocol, RawSocketService>::operator=(
-        ASIO_MOVE_CAST2(basic_raw_socket<
-          Protocol1, RawSocketService1>)(other));
+    basic_socket<Protocol ASIO_SVC_TARG>::operator=(std::move(other));
     return *this;
   }
 #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
 
+  /// Destroys the socket.
+  /**
+   * This function destroys the socket, cancelling any outstanding asynchronous
+   * operations associated with the socket as if by calling @c cancel.
+   */
+  ~basic_raw_socket()
+  {
+  }
+
   /// Send some data on a connected socket.
   /**
    * This function is used to send data on the raw socket. The function call
@@ -330,8 +338,18 @@
     // not meet the documented type requirements for a WriteHandler.
     ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_send(this->get_implementation(),
         buffers, 0, ASIO_MOVE_CAST(WriteHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<WriteHandler,
+      void (asio::error_code, std::size_t)> init(handler);
+
+    this->get_service().async_send(this->get_implementation(),
+        buffers, 0, init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 
   /// Start an asynchronous send on a connected socket.
@@ -373,8 +391,18 @@
     // not meet the documented type requirements for a WriteHandler.
     ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_send(this->get_implementation(),
         buffers, flags, ASIO_MOVE_CAST(WriteHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<WriteHandler,
+      void (asio::error_code, std::size_t)> init(handler);
+
+    this->get_service().async_send(this->get_implementation(),
+        buffers, flags, init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 
   /// Send raw data to the specified endpoint.
@@ -513,8 +541,18 @@
     // not meet the documented type requirements for a WriteHandler.
     ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_send_to(this->get_implementation(),
         buffers, destination, 0, ASIO_MOVE_CAST(WriteHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<WriteHandler,
+      void (asio::error_code, std::size_t)> init(handler);
+
+    this->get_service().async_send_to(this->get_implementation(),
+        buffers, destination, 0, init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 
   /// Start an asynchronous send.
@@ -555,9 +593,20 @@
     // not meet the documented type requirements for a WriteHandler.
     ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_send_to(
         this->get_implementation(), buffers, destination, flags,
         ASIO_MOVE_CAST(WriteHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<WriteHandler,
+      void (asio::error_code, std::size_t)> init(handler);
+
+    this->get_service().async_send_to(
+        this->get_implementation(), buffers, destination, flags,
+        init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 
   /// Receive some data on a connected socket.
@@ -695,8 +744,18 @@
     // not meet the documented type requirements for a ReadHandler.
     ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_receive(this->get_implementation(),
         buffers, 0, ASIO_MOVE_CAST(ReadHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<ReadHandler,
+      void (asio::error_code, std::size_t)> init(handler);
+
+    this->get_service().async_receive(this->get_implementation(),
+        buffers, 0, init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 
   /// Start an asynchronous receive on a connected socket.
@@ -738,8 +797,18 @@
     // not meet the documented type requirements for a ReadHandler.
     ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_receive(this->get_implementation(),
         buffers, flags, ASIO_MOVE_CAST(ReadHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<ReadHandler,
+      void (asio::error_code, std::size_t)> init(handler);
+
+    this->get_service().async_receive(this->get_implementation(),
+        buffers, flags, init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 
   /// Receive raw data with the endpoint of the sender.
@@ -878,9 +947,20 @@
     // not meet the documented type requirements for a ReadHandler.
     ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_receive_from(
         this->get_implementation(), buffers, sender_endpoint, 0,
         ASIO_MOVE_CAST(ReadHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<ReadHandler,
+      void (asio::error_code, std::size_t)> init(handler);
+
+    this->get_service().async_receive_from(
+        this->get_implementation(), buffers, sender_endpoint, 0,
+        init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 
   /// Start an asynchronous receive.
@@ -923,9 +1003,20 @@
     // not meet the documented type requirements for a ReadHandler.
     ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_receive_from(
         this->get_implementation(), buffers, sender_endpoint, flags,
         ASIO_MOVE_CAST(ReadHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<ReadHandler,
+      void (asio::error_code, std::size_t)> init(handler);
+
+    this->get_service().async_receive_from(
+        this->get_implementation(), buffers, sender_endpoint, flags,
+        init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 };
 
diff --git a/asio/include/asio/basic_seq_packet_socket.hpp b/asio/include/asio/basic_seq_packet_socket.hpp
index 2271cea..ec2ab8f 100644
--- a/asio/include/asio/basic_seq_packet_socket.hpp
+++ b/asio/include/asio/basic_seq_packet_socket.hpp
@@ -36,15 +36,19 @@
  * @e Distinct @e objects: Safe.@n
  * @e Shared @e objects: Unsafe.
  */
-template <typename Protocol,
-    typename SeqPacketSocketService = seq_packet_socket_service<Protocol> >
+template <typename Protocol
+    ASIO_SVC_TPARAM_DEF1(= seq_packet_socket_service<Protocol>)>
 class basic_seq_packet_socket
-  : public basic_socket<Protocol, SeqPacketSocketService>
+  : public basic_socket<Protocol ASIO_SVC_TARG>
 {
 public:
   /// The native representation of a socket.
-  typedef typename SeqPacketSocketService::native_handle_type
-    native_handle_type;
+#if defined(GENERATING_DOCUMENTATION)
+  typedef implementation_defined native_handle_type;
+#else
+  typedef typename basic_socket<
+    Protocol ASIO_SVC_TARG>::native_handle_type native_handle_type;
+#endif
 
   /// The protocol type.
   typedef Protocol protocol_type;
@@ -63,7 +67,7 @@
    * the socket.
    */
   explicit basic_seq_packet_socket(asio::io_context& io_context)
-    : basic_socket<Protocol, SeqPacketSocketService>(io_context)
+    : basic_socket<Protocol ASIO_SVC_TARG>(io_context)
   {
   }
 
@@ -83,7 +87,7 @@
    */
   basic_seq_packet_socket(asio::io_context& io_context,
       const protocol_type& protocol)
-    : basic_socket<Protocol, SeqPacketSocketService>(io_context, protocol)
+    : basic_socket<Protocol ASIO_SVC_TARG>(io_context, protocol)
   {
   }
 
@@ -105,7 +109,7 @@
    */
   basic_seq_packet_socket(asio::io_context& io_context,
       const endpoint_type& endpoint)
-    : basic_socket<Protocol, SeqPacketSocketService>(io_context, endpoint)
+    : basic_socket<Protocol ASIO_SVC_TARG>(io_context, endpoint)
   {
   }
 
@@ -126,7 +130,7 @@
    */
   basic_seq_packet_socket(asio::io_context& io_context,
       const protocol_type& protocol, const native_handle_type& native_socket)
-    : basic_socket<Protocol, SeqPacketSocketService>(
+    : basic_socket<Protocol ASIO_SVC_TARG>(
         io_context, protocol, native_socket)
   {
   }
@@ -144,8 +148,7 @@
    * constructed using the @c basic_seq_packet_socket(io_context&) constructor.
    */
   basic_seq_packet_socket(basic_seq_packet_socket&& other)
-    : basic_socket<Protocol, SeqPacketSocketService>(
-        ASIO_MOVE_CAST(basic_seq_packet_socket)(other))
+    : basic_socket<Protocol ASIO_SVC_TARG>(std::move(other))
   {
   }
 
@@ -162,8 +165,7 @@
    */
   basic_seq_packet_socket& operator=(basic_seq_packet_socket&& other)
   {
-    basic_socket<Protocol, SeqPacketSocketService>::operator=(
-        ASIO_MOVE_CAST(basic_seq_packet_socket)(other));
+    basic_socket<Protocol ASIO_SVC_TARG>::operator=(std::move(other));
     return *this;
   }
 
@@ -179,13 +181,11 @@
    * @note Following the move, the moved-from object is in the same state as if
    * constructed using the @c basic_seq_packet_socket(io_context&) constructor.
    */
-  template <typename Protocol1, typename SeqPacketSocketService1>
+  template <typename Protocol1 ASIO_SVC_TPARAM1>
   basic_seq_packet_socket(
-      basic_seq_packet_socket<Protocol1, SeqPacketSocketService1>&& other,
+      basic_seq_packet_socket<Protocol1 ASIO_SVC_TARG1>&& other,
       typename enable_if<is_convertible<Protocol1, Protocol>::value>::type* = 0)
-    : basic_socket<Protocol, SeqPacketSocketService>(
-        ASIO_MOVE_CAST2(basic_seq_packet_socket<
-          Protocol1, SeqPacketSocketService1>)(other))
+    : basic_socket<Protocol ASIO_SVC_TARG>(std::move(other))
   {
   }
 
@@ -201,18 +201,25 @@
    * @note Following the move, the moved-from object is in the same state as if
    * constructed using the @c basic_seq_packet_socket(io_context&) constructor.
    */
-  template <typename Protocol1, typename SeqPacketSocketService1>
+  template <typename Protocol1 ASIO_SVC_TPARAM1>
   typename enable_if<is_convertible<Protocol1, Protocol>::value,
       basic_seq_packet_socket>::type& operator=(
-        basic_seq_packet_socket<Protocol1, SeqPacketSocketService1>&& other)
+        basic_seq_packet_socket<Protocol1 ASIO_SVC_TARG1>&& other)
   {
-    basic_socket<Protocol, SeqPacketSocketService>::operator=(
-        ASIO_MOVE_CAST2(basic_seq_packet_socket<
-          Protocol1, SeqPacketSocketService1>)(other));
+    basic_socket<Protocol ASIO_SVC_TARG>::operator=(std::move(other));
     return *this;
   }
 #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
 
+  /// Destroys the socket.
+  /**
+   * This function destroys the socket, cancelling any outstanding asynchronous
+   * operations associated with the socket as if by calling @c cancel.
+   */
+  ~basic_seq_packet_socket()
+  {
+  }
+
   /// Send some data on the socket.
   /**
    * This function is used to send data on the sequenced packet socket. The
@@ -317,8 +324,18 @@
     // not meet the documented type requirements for a WriteHandler.
     ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_send(this->get_implementation(),
         buffers, flags, ASIO_MOVE_CAST(WriteHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<WriteHandler,
+      void (asio::error_code, std::size_t)> init(handler);
+
+    this->get_service().async_send(this->get_implementation(),
+        buffers, flags, init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 
   /// Receive some data on the socket.
@@ -355,8 +372,13 @@
       socket_base::message_flags& out_flags)
   {
     asio::error_code ec;
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     std::size_t s = this->get_service().receive(
         this->get_implementation(), buffers, 0, out_flags, ec);
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    std::size_t s = this->get_service().receive_with_flags(
+        this->get_implementation(), buffers, 0, out_flags, ec);
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
     asio::detail::throw_error(ec, "receive");
     return s;
   }
@@ -402,8 +424,13 @@
       socket_base::message_flags& out_flags)
   {
     asio::error_code ec;
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     std::size_t s = this->get_service().receive(
         this->get_implementation(), buffers, in_flags, out_flags, ec);
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    std::size_t s = this->get_service().receive_with_flags(
+        this->get_implementation(), buffers, in_flags, out_flags, ec);
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
     asio::detail::throw_error(ec, "receive");
     return s;
   }
@@ -436,8 +463,13 @@
       socket_base::message_flags in_flags,
       socket_base::message_flags& out_flags, asio::error_code& ec)
   {
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().receive(this->get_implementation(),
         buffers, in_flags, out_flags, ec);
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    return this->get_service().receive_with_flags(this->get_implementation(),
+        buffers, in_flags, out_flags, ec);
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 
   /// Start an asynchronous receive.
@@ -489,9 +521,20 @@
     // not meet the documented type requirements for a ReadHandler.
     ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_receive(
         this->get_implementation(), buffers, 0, out_flags,
         ASIO_MOVE_CAST(ReadHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<ReadHandler,
+      void (asio::error_code, std::size_t)> init(handler);
+
+    this->get_service().async_receive_with_flags(
+        this->get_implementation(), buffers, 0, out_flags,
+        init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 
   /// Start an asynchronous receive.
@@ -548,9 +591,20 @@
     // not meet the documented type requirements for a ReadHandler.
     ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_receive(
         this->get_implementation(), buffers, in_flags, out_flags,
         ASIO_MOVE_CAST(ReadHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<ReadHandler,
+      void (asio::error_code, std::size_t)> init(handler);
+
+    this->get_service().async_receive_with_flags(
+        this->get_implementation(), buffers, in_flags, out_flags,
+        init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 };
 
diff --git a/asio/include/asio/basic_serial_port.hpp b/asio/include/asio/basic_serial_port.hpp
index e472117..15a7fb4 100644
--- a/asio/include/asio/basic_serial_port.hpp
+++ b/asio/include/asio/basic_serial_port.hpp
@@ -18,6 +18,8 @@
 
 #include "asio/detail/config.hpp"
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+
 #if defined(ASIO_HAS_SERIAL_PORT) \
   || defined(GENERATING_DOCUMENTATION)
 
@@ -676,4 +678,6 @@
 #endif // defined(ASIO_HAS_SERIAL_PORT)
        //   || defined(GENERATING_DOCUMENTATION)
 
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
+
 #endif // ASIO_BASIC_SERIAL_PORT_HPP
diff --git a/asio/include/asio/basic_signal_set.hpp b/asio/include/asio/basic_signal_set.hpp
index 642d10a..978fb36 100644
--- a/asio/include/asio/basic_signal_set.hpp
+++ b/asio/include/asio/basic_signal_set.hpp
@@ -17,6 +17,8 @@
 
 #include "asio/detail/config.hpp"
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+
 #include "asio/basic_io_object.hpp"
 #include "asio/detail/handler_type_requirements.hpp"
 #include "asio/detail/throw_error.hpp"
@@ -383,4 +385,6 @@
 
 #include "asio/detail/pop_options.hpp"
 
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
+
 #endif // ASIO_BASIC_SIGNAL_SET_HPP
diff --git a/asio/include/asio/basic_socket.hpp b/asio/include/asio/basic_socket.hpp
index 582982a..c4ae0df 100644
--- a/asio/include/asio/basic_socket.hpp
+++ b/asio/include/asio/basic_socket.hpp
@@ -25,6 +25,23 @@
 #include "asio/post.hpp"
 #include "asio/socket_base.hpp"
 
+#if defined(ASIO_HAS_MOVE)
+# include <utility>
+#endif // defined(ASIO_HAS_MOVE)
+
+#if !defined(ASIO_ENABLE_OLD_SERVICES)
+# if defined(ASIO_WINDOWS_RUNTIME)
+#  include "asio/detail/winrt_ssocket_service.hpp"
+#  define ASIO_SVC_T detail::winrt_ssocket_service<Protocol>
+# elif defined(ASIO_HAS_IOCP)
+#  include "asio/detail/win_iocp_socket_service.hpp"
+#  define ASIO_SVC_T detail::win_iocp_socket_service<Protocol>
+# else
+#  include "asio/detail/reactive_socket_service.hpp"
+#  define ASIO_SVC_T detail::reactive_socket_service<Protocol>
+# endif
+#endif // !defined(ASIO_ENABLE_OLD_SERVICES)
+
 #include "asio/detail/push_options.hpp"
 
 namespace asio {
@@ -38,14 +55,21 @@
  * @e Distinct @e objects: Safe.@n
  * @e Shared @e objects: Unsafe.
  */
-template <typename Protocol, typename SocketService>
+template <typename Protocol ASIO_SVC_TPARAM>
 class basic_socket
-  : public basic_io_object<SocketService>,
+  : ASIO_SVC_ACCESS basic_io_object<ASIO_SVC_T>,
     public socket_base
 {
 public:
+  /// The type of the executor associated with the object.
+  typedef io_context::executor_type executor_type;
+
   /// The native representation of a socket.
-  typedef typename SocketService::native_handle_type native_handle_type;
+#if defined(GENERATING_DOCUMENTATION)
+  typedef implementation_defined native_handle_type;
+#else
+  typedef typename ASIO_SVC_T::native_handle_type native_handle_type;
+#endif
 
   /// The protocol type.
   typedef Protocol protocol_type;
@@ -54,7 +78,7 @@
   typedef typename Protocol::endpoint endpoint_type;
 
   /// A basic_socket is always the lowest layer.
-  typedef basic_socket<Protocol, SocketService> lowest_layer_type;
+  typedef basic_socket<Protocol ASIO_SVC_TARG> lowest_layer_type;
 
   /// Construct a basic_socket without opening it.
   /**
@@ -64,7 +88,7 @@
    * dispatch handlers for any asynchronous operations performed on the socket.
    */
   explicit basic_socket(asio::io_context& io_context)
-    : basic_io_object<SocketService>(io_context)
+    : basic_io_object<ASIO_SVC_T>(io_context)
   {
   }
 
@@ -81,7 +105,7 @@
    */
   basic_socket(asio::io_context& io_context,
       const protocol_type& protocol)
-    : basic_io_object<SocketService>(io_context)
+    : basic_io_object<ASIO_SVC_T>(io_context)
   {
     asio::error_code ec;
     this->get_service().open(this->get_implementation(), protocol, ec);
@@ -105,7 +129,7 @@
    */
   basic_socket(asio::io_context& io_context,
       const endpoint_type& endpoint)
-    : basic_io_object<SocketService>(io_context)
+    : basic_io_object<ASIO_SVC_T>(io_context)
   {
     asio::error_code ec;
     const protocol_type protocol = endpoint.protocol();
@@ -130,7 +154,7 @@
    */
   basic_socket(asio::io_context& io_context,
       const protocol_type& protocol, const native_handle_type& native_socket)
-    : basic_io_object<SocketService>(io_context)
+    : basic_io_object<ASIO_SVC_T>(io_context)
   {
     asio::error_code ec;
     this->get_service().assign(this->get_implementation(),
@@ -150,8 +174,7 @@
    * constructed using the @c basic_socket(io_context&) constructor.
    */
   basic_socket(basic_socket&& other)
-    : basic_io_object<SocketService>(
-        ASIO_MOVE_CAST(basic_socket)(other))
+    : basic_io_object<ASIO_SVC_T>(std::move(other))
   {
   }
 
@@ -167,13 +190,12 @@
    */
   basic_socket& operator=(basic_socket&& other)
   {
-    basic_io_object<SocketService>::operator=(
-        ASIO_MOVE_CAST(basic_socket)(other));
+    basic_io_object<ASIO_SVC_T>::operator=(std::move(other));
     return *this;
   }
 
   // All sockets have access to each other's implementations.
-  template <typename Protocol1, typename SocketService1>
+  template <typename Protocol1 ASIO_SVC_TPARAM1>
   friend class basic_socket;
 
   /// Move-construct a basic_socket from a socket of another protocol type.
@@ -186,10 +208,10 @@
    * @note Following the move, the moved-from object is in the same state as if
    * constructed using the @c basic_socket(io_context&) constructor.
    */
-  template <typename Protocol1, typename SocketService1>
-  basic_socket(basic_socket<Protocol1, SocketService1>&& other,
+  template <typename Protocol1 ASIO_SVC_TPARAM1>
+  basic_socket(basic_socket<Protocol1 ASIO_SVC_TARG1>&& other,
       typename enable_if<is_convertible<Protocol1, Protocol>::value>::type* = 0)
-    : basic_io_object<SocketService>(other.get_service().get_io_context())
+    : basic_io_object<ASIO_SVC_T>(other.get_service().get_io_context())
   {
     this->get_service().template converting_move_construct<Protocol1>(
         this->get_implementation(), other.get_implementation());
@@ -205,19 +227,57 @@
    * @note Following the move, the moved-from object is in the same state as if
    * constructed using the @c basic_socket(io_context&) constructor.
    */
-  template <typename Protocol1, typename SocketService1>
+  template <typename Protocol1 ASIO_SVC_TPARAM1>
   typename enable_if<is_convertible<Protocol1, Protocol>::value,
       basic_socket>::type& operator=(
-        basic_socket<Protocol1, SocketService1>&& other)
+        basic_socket<Protocol1 ASIO_SVC_TARG1>&& other)
   {
-    basic_socket tmp(ASIO_MOVE_CAST2(basic_socket<
-            Protocol1, SocketService1>)(other));
-    basic_io_object<SocketService>::operator=(
-        ASIO_MOVE_CAST(basic_socket)(tmp));
+    basic_socket tmp(std::move(other));
+    basic_io_object<ASIO_SVC_T>::operator=(std::move(tmp));
     return *this;
   }
 #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+  // These functions are provided by basic_io_object<>.
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+#if !defined(ASIO_NO_DEPRECATED)
+  /// (Deprecated: Use get_executor().) Get the io_context associated with the
+  /// object.
+  /**
+   * This function may be used to obtain the io_context object that the I/O
+   * object uses to dispatch handlers for asynchronous operations.
+   *
+   * @return A reference to the io_context object that the I/O object will use
+   * to dispatch handlers. Ownership is not transferred to the caller.
+   */
+  asio::io_context& get_io_context()
+  {
+    return basic_io_object<ASIO_SVC_T>::get_io_context();
+  }
+
+  /// (Deprecated: Use get_executor().) Get the io_context associated with the
+  /// object.
+  /**
+   * This function may be used to obtain the io_context object that the I/O
+   * object uses to dispatch handlers for asynchronous operations.
+   *
+   * @return A reference to the io_context object that the I/O object will use
+   * to dispatch handlers. Ownership is not transferred to the caller.
+   */
+  asio::io_context& get_io_service()
+  {
+    return basic_io_object<ASIO_SVC_T>::get_io_service();
+  }
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+  /// Get the executor associated with the object.
+  executor_type get_executor() ASIO_NOEXCEPT
+  {
+    return basic_io_object<ASIO_SVC_T>::get_executor();
+  }
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
+
   /// Get a reference to the lowest layer.
   /**
    * This function returns a reference to the lowest layer in a stack of
@@ -758,8 +818,18 @@
       }
     }
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_connect(this->get_implementation(),
         peer_endpoint, ASIO_MOVE_CAST(ConnectHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<ConnectHandler,
+      void (asio::error_code)> init(handler);
+
+    this->get_service().async_connect(
+        this->get_implementation(), peer_endpoint, init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 
   /// Set an option on the socket.
@@ -1581,19 +1651,40 @@
     // not meet the documented type requirements for a WaitHandler.
     ASIO_WAIT_HANDLER_CHECK(WaitHandler, handler) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_wait(this->get_implementation(),
         w, ASIO_MOVE_CAST(WaitHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<WaitHandler,
+      void (asio::error_code)> init(handler);
+
+    this->get_service().async_wait(this->get_implementation(), w, init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 
 protected:
   /// Protected destructor to prevent deletion through this type.
+  /**
+   * This function destroys the socket, cancelling any outstanding asynchronous
+   * operations associated with the socket as if by calling @c cancel.
+   */
   ~basic_socket()
   {
   }
+
+  // Disallow copying and assignment.
+  basic_socket(const basic_socket&) ASIO_DELETED;
+  basic_socket& operator=(const basic_socket&) ASIO_DELETED;
 };
 
 } // namespace asio
 
 #include "asio/detail/pop_options.hpp"
 
+#if !defined(ASIO_ENABLE_OLD_SERVICES)
+# undef ASIO_SVC_T
+#endif // !defined(ASIO_ENABLE_OLD_SERVICES)
+
 #endif // ASIO_BASIC_SOCKET_HPP
diff --git a/asio/include/asio/basic_socket_acceptor.hpp b/asio/include/asio/basic_socket_acceptor.hpp
index 92d2c4b..3d8b7e5 100644
--- a/asio/include/asio/basic_socket_acceptor.hpp
+++ b/asio/include/asio/basic_socket_acceptor.hpp
@@ -25,6 +25,23 @@
 #include "asio/socket_acceptor_service.hpp"
 #include "asio/socket_base.hpp"
 
+#if defined(ASIO_HAS_MOVE)
+# include <utility>
+#endif // defined(ASIO_HAS_MOVE)
+
+#if !defined(ASIO_ENABLE_OLD_SERVICES)
+# if defined(ASIO_WINDOWS_RUNTIME)
+#  include "asio/detail/null_socket_service.hpp"
+#  define ASIO_SVC_T detail::null_socket_service<Protocol>
+# elif defined(ASIO_HAS_IOCP)
+#  include "asio/detail/win_iocp_socket_service.hpp"
+#  define ASIO_SVC_T detail::win_iocp_socket_service<Protocol>
+# else
+#  include "asio/detail/reactive_socket_service.hpp"
+#  define ASIO_SVC_T detail::reactive_socket_service<Protocol>
+# endif
+#endif // !defined(ASIO_ENABLE_OLD_SERVICES)
+
 #include "asio/detail/push_options.hpp"
 
 namespace asio {
@@ -49,15 +66,22 @@
  * acceptor.listen();
  * @endcode
  */
-template <typename Protocol,
-    typename SocketAcceptorService = socket_acceptor_service<Protocol> >
+template <typename Protocol
+    ASIO_SVC_TPARAM_DEF1(= socket_acceptor_service<Protocol>)>
 class basic_socket_acceptor
-  : public basic_io_object<SocketAcceptorService>,
+  : ASIO_SVC_ACCESS basic_io_object<ASIO_SVC_T>,
     public socket_base
 {
 public:
+  /// The type of the executor associated with the object.
+  typedef io_context::executor_type executor_type;
+
   /// The native representation of an acceptor.
-  typedef typename SocketAcceptorService::native_handle_type native_handle_type;
+#if defined(GENERATING_DOCUMENTATION)
+  typedef implementation_defined native_handle_type;
+#else
+  typedef typename ASIO_SVC_T::native_handle_type native_handle_type;
+#endif
 
   /// The protocol type.
   typedef Protocol protocol_type;
@@ -76,7 +100,7 @@
    * acceptor.
    */
   explicit basic_socket_acceptor(asio::io_context& io_context)
-    : basic_io_object<SocketAcceptorService>(io_context)
+    : basic_io_object<ASIO_SVC_T>(io_context)
   {
   }
 
@@ -94,7 +118,7 @@
    */
   basic_socket_acceptor(asio::io_context& io_context,
       const protocol_type& protocol)
-    : basic_io_object<SocketAcceptorService>(io_context)
+    : basic_io_object<ASIO_SVC_T>(io_context)
   {
     asio::error_code ec;
     this->get_service().open(this->get_implementation(), protocol, ec);
@@ -130,7 +154,7 @@
    */
   basic_socket_acceptor(asio::io_context& io_context,
       const endpoint_type& endpoint, bool reuse_addr = true)
-    : basic_io_object<SocketAcceptorService>(io_context)
+    : basic_io_object<ASIO_SVC_T>(io_context)
   {
     asio::error_code ec;
     const protocol_type protocol = endpoint.protocol();
@@ -166,7 +190,7 @@
    */
   basic_socket_acceptor(asio::io_context& io_context,
       const protocol_type& protocol, const native_handle_type& native_acceptor)
-    : basic_io_object<SocketAcceptorService>(io_context)
+    : basic_io_object<ASIO_SVC_T>(io_context)
   {
     asio::error_code ec;
     this->get_service().assign(this->get_implementation(),
@@ -186,8 +210,7 @@
    * constructed using the @c basic_socket_acceptor(io_context&) constructor.
    */
   basic_socket_acceptor(basic_socket_acceptor&& other)
-    : basic_io_object<SocketAcceptorService>(
-        ASIO_MOVE_CAST(basic_socket_acceptor)(other))
+    : basic_io_object<ASIO_SVC_T>(std::move(other))
   {
   }
 
@@ -203,13 +226,12 @@
    */
   basic_socket_acceptor& operator=(basic_socket_acceptor&& other)
   {
-    basic_io_object<SocketAcceptorService>::operator=(
-        ASIO_MOVE_CAST(basic_socket_acceptor)(other));
+    basic_io_object<ASIO_SVC_T>::operator=(std::move(other));
     return *this;
   }
 
   // All socket acceptors have access to each other's implementations.
-  template <typename Protocol1, typename SocketAcceptorService1>
+  template <typename Protocol1 ASIO_SVC_TPARAM1>
   friend class basic_socket_acceptor;
 
   /// Move-construct a basic_socket_acceptor from an acceptor of another
@@ -223,11 +245,11 @@
    * @note Following the move, the moved-from object is in the same state as if
    * constructed using the @c basic_socket(io_context&) constructor.
    */
-  template <typename Protocol1, typename SocketAcceptorService1>
+  template <typename Protocol1 ASIO_SVC_TPARAM1>
   basic_socket_acceptor(
-      basic_socket_acceptor<Protocol1, SocketAcceptorService1>&& other,
+      basic_socket_acceptor<Protocol1 ASIO_SVC_TARG1>&& other,
       typename enable_if<is_convertible<Protocol1, Protocol>::value>::type* = 0)
-    : basic_io_object<SocketAcceptorService>(
+    : basic_io_object<ASIO_SVC_T>(
         other.get_service().get_io_context())
   {
     this->get_service().template converting_move_construct<Protocol1>(
@@ -245,19 +267,67 @@
    * @note Following the move, the moved-from object is in the same state as if
    * constructed using the @c basic_socket(io_context&) constructor.
    */
-  template <typename Protocol1, typename SocketAcceptorService1>
+  template <typename Protocol1 ASIO_SVC_TPARAM1>
   typename enable_if<is_convertible<Protocol1, Protocol>::value,
       basic_socket_acceptor>::type& operator=(
-        basic_socket_acceptor<Protocol1, SocketAcceptorService1>&& other)
+        basic_socket_acceptor<Protocol1 ASIO_SVC_TARG1>&& other)
   {
-    basic_socket_acceptor tmp(ASIO_MOVE_CAST2(basic_socket_acceptor<
-            Protocol1, SocketAcceptorService1>)(other));
-    basic_io_object<SocketAcceptorService>::operator=(
-        ASIO_MOVE_CAST(basic_socket_acceptor)(tmp));
+    basic_socket_acceptor tmp(std::move(other));
+    basic_io_object<ASIO_SVC_T>::operator=(std::move(tmp));
     return *this;
   }
 #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
 
+  /// Destroys the acceptor.
+  /**
+   * This function destroys the acceptor, cancelling any outstanding
+   * asynchronous operations associated with the acceptor as if by calling
+   * @c cancel.
+   */
+  ~basic_socket_acceptor()
+  {
+  }
+
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+  // These functions are provided by basic_io_object<>.
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+#if !defined(ASIO_NO_DEPRECATED)
+  /// (Deprecated: Use get_executor().) Get the io_context associated with the
+  /// object.
+  /**
+   * This function may be used to obtain the io_context object that the I/O
+   * object uses to dispatch handlers for asynchronous operations.
+   *
+   * @return A reference to the io_context object that the I/O object will use
+   * to dispatch handlers. Ownership is not transferred to the caller.
+   */
+  asio::io_context& get_io_context()
+  {
+    return basic_io_object<ASIO_SVC_T>::get_io_context();
+  }
+
+  /// (Deprecated: Use get_executor().) Get the io_context associated with the
+  /// object.
+  /**
+   * This function may be used to obtain the io_context object that the I/O
+   * object uses to dispatch handlers for asynchronous operations.
+   *
+   * @return A reference to the io_context object that the I/O object will use
+   * to dispatch handlers. Ownership is not transferred to the caller.
+   */
+  asio::io_context& get_io_service()
+  {
+    return basic_io_object<ASIO_SVC_T>::get_io_service();
+  }
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+  /// Get the executor associated with the object.
+  executor_type get_executor() ASIO_NOEXCEPT
+  {
+    return basic_io_object<ASIO_SVC_T>::get_executor();
+  }
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
+
   /// Open the acceptor using the specified protocol.
   /**
    * This function opens the socket acceptor so that it will use the specified
@@ -983,8 +1053,17 @@
     // not meet the documented type requirements for a WaitHandler.
     ASIO_WAIT_HANDLER_CHECK(WaitHandler, handler) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_wait(this->get_implementation(),
         w, ASIO_MOVE_CAST(WaitHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<WaitHandler,
+      void (asio::error_code)> init(handler);
+
+    this->get_service().async_wait(this->get_implementation(), w, init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 
   /// Accept a new connection.
@@ -1005,9 +1084,15 @@
    * acceptor.accept(socket);
    * @endcode
    */
+#if defined(ASIO_ENABLE_OLD_SERVICES)
   template <typename Protocol1, typename SocketService>
   void accept(basic_socket<Protocol1, SocketService>& peer,
       typename enable_if<is_convertible<Protocol, Protocol1>::value>::type* = 0)
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+  template <typename Protocol1>
+  void accept(basic_socket<Protocol1>& peer,
+      typename enable_if<is_convertible<Protocol, Protocol1>::value>::type* = 0)
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   {
     asio::error_code ec;
     this->get_service().accept(this->get_implementation(),
@@ -1038,11 +1123,18 @@
    * }
    * @endcode
    */
+#if defined(ASIO_ENABLE_OLD_SERVICES)
   template <typename Protocol1, typename SocketService>
   asio::error_code accept(
       basic_socket<Protocol1, SocketService>& peer,
       asio::error_code& ec,
       typename enable_if<is_convertible<Protocol, Protocol1>::value>::type* = 0)
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+  template <typename Protocol1>
+  asio::error_code accept(
+      basic_socket<Protocol1>& peer, asio::error_code& ec,
+      typename enable_if<is_convertible<Protocol, Protocol1>::value>::type* = 0)
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   {
     return this->get_service().accept(this->get_implementation(),
         peer, static_cast<endpoint_type*>(0), ec);
@@ -1086,20 +1178,39 @@
    * acceptor.async_accept(socket, accept_handler);
    * @endcode
    */
+#if defined(ASIO_ENABLE_OLD_SERVICES)
   template <typename Protocol1, typename SocketService, typename AcceptHandler>
   ASIO_INITFN_RESULT_TYPE(AcceptHandler,
       void (asio::error_code))
   async_accept(basic_socket<Protocol1, SocketService>& peer,
       ASIO_MOVE_ARG(AcceptHandler) handler,
       typename enable_if<is_convertible<Protocol, Protocol1>::value>::type* = 0)
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+  template <typename Protocol1, typename AcceptHandler>
+  ASIO_INITFN_RESULT_TYPE(AcceptHandler,
+      void (asio::error_code))
+  async_accept(basic_socket<Protocol1>& peer,
+      ASIO_MOVE_ARG(AcceptHandler) handler,
+      typename enable_if<is_convertible<Protocol, Protocol1>::value>::type* = 0)
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   {
     // If you get an error on the following line it means that your handler does
     // not meet the documented type requirements for a AcceptHandler.
     ASIO_ACCEPT_HANDLER_CHECK(AcceptHandler, handler) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_accept(this->get_implementation(),
         peer, static_cast<endpoint_type*>(0),
         ASIO_MOVE_CAST(AcceptHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<AcceptHandler,
+      void (asio::error_code)> init(handler);
+
+    this->get_service().async_accept(this->get_implementation(),
+        peer, static_cast<endpoint_type*>(0), init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 
   /// Accept a new connection and obtain the endpoint of the peer
@@ -1125,9 +1236,13 @@
    * acceptor.accept(socket, endpoint);
    * @endcode
    */
+#if defined(ASIO_ENABLE_OLD_SERVICES)
   template <typename SocketService>
   void accept(basic_socket<protocol_type, SocketService>& peer,
       endpoint_type& peer_endpoint)
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+  void accept(basic_socket<protocol_type>& peer, endpoint_type& peer_endpoint)
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   {
     asio::error_code ec;
     this->get_service().accept(this->get_implementation(),
@@ -1163,10 +1278,15 @@
    * }
    * @endcode
    */
+#if defined(ASIO_ENABLE_OLD_SERVICES)
   template <typename SocketService>
   asio::error_code accept(
       basic_socket<protocol_type, SocketService>& peer,
       endpoint_type& peer_endpoint, asio::error_code& ec)
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+  asio::error_code accept(basic_socket<protocol_type>& peer,
+      endpoint_type& peer_endpoint, asio::error_code& ec)
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   {
     return this->get_service().accept(
         this->get_implementation(), peer, &peer_endpoint, ec);
@@ -1198,18 +1318,36 @@
    * of the handler will be performed in a manner equivalent to using
    * asio::io_context::post().
    */
+#if defined(ASIO_ENABLE_OLD_SERVICES)
   template <typename SocketService, typename AcceptHandler>
   ASIO_INITFN_RESULT_TYPE(AcceptHandler,
       void (asio::error_code))
   async_accept(basic_socket<protocol_type, SocketService>& peer,
       endpoint_type& peer_endpoint, ASIO_MOVE_ARG(AcceptHandler) handler)
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+  template <typename AcceptHandler>
+  ASIO_INITFN_RESULT_TYPE(AcceptHandler,
+      void (asio::error_code))
+  async_accept(basic_socket<protocol_type>& peer,
+      endpoint_type& peer_endpoint, ASIO_MOVE_ARG(AcceptHandler) handler)
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   {
     // If you get an error on the following line it means that your handler does
     // not meet the documented type requirements for a AcceptHandler.
     ASIO_ACCEPT_HANDLER_CHECK(AcceptHandler, handler) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_accept(this->get_implementation(), peer,
         &peer_endpoint, ASIO_MOVE_CAST(AcceptHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<AcceptHandler,
+      void (asio::error_code)> init(handler);
+
+    this->get_service().async_accept(this->get_implementation(),
+        peer, &peer_endpoint, init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 
 #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
@@ -1321,10 +1459,22 @@
     ASIO_MOVE_ACCEPT_HANDLER_CHECK(MoveAcceptHandler,
         handler, typename Protocol::socket) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_accept(
         this->get_implementation(), static_cast<asio::io_context*>(0),
         static_cast<endpoint_type*>(0),
         ASIO_MOVE_CAST(MoveAcceptHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<MoveAcceptHandler,
+      void (asio::error_code,
+        typename Protocol::socket)> init(handler);
+
+    this->get_service().async_accept(
+        this->get_implementation(), static_cast<asio::io_context*>(0),
+        static_cast<endpoint_type*>(0), init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 
   /// Accept a new connection.
@@ -1447,9 +1597,20 @@
     ASIO_MOVE_ACCEPT_HANDLER_CHECK(MoveAcceptHandler,
         handler, typename Protocol::socket) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_accept(this->get_implementation(),
         &io_context, static_cast<endpoint_type*>(0),
         ASIO_MOVE_CAST(MoveAcceptHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<MoveAcceptHandler,
+      void (asio::error_code,
+        typename Protocol::socket)> init(handler);
+
+    this->get_service().async_accept(this->get_implementation(),
+        &io_context, static_cast<endpoint_type*>(0), init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 
   /// Accept a new connection.
@@ -1577,9 +1738,20 @@
     ASIO_MOVE_ACCEPT_HANDLER_CHECK(MoveAcceptHandler,
         handler, typename Protocol::socket) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_accept(this->get_implementation(),
         static_cast<asio::io_context*>(0), &peer_endpoint,
         ASIO_MOVE_CAST(MoveAcceptHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<MoveAcceptHandler,
+      void (asio::error_code,
+        typename Protocol::socket)> init(handler);
+
+    this->get_service().async_accept(this->get_implementation(),
+        static_cast<asio::io_context*>(0), &peer_endpoint, init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 
   /// Accept a new connection.
@@ -1720,9 +1892,20 @@
     ASIO_MOVE_ACCEPT_HANDLER_CHECK(MoveAcceptHandler,
         handler, typename Protocol::socket) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_accept(
         this->get_implementation(), &io_context, &peer_endpoint,
         ASIO_MOVE_CAST(MoveAcceptHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<MoveAcceptHandler,
+      void (asio::error_code,
+        typename Protocol::socket)> init(handler);
+
+    this->get_service().async_accept(this->get_implementation(),
+        &io_context, &peer_endpoint, init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
 };
@@ -1731,4 +1914,8 @@
 
 #include "asio/detail/pop_options.hpp"
 
+#if !defined(ASIO_ENABLE_OLD_SERVICES)
+# undef ASIO_SVC_T
+#endif // !defined(ASIO_ENABLE_OLD_SERVICES)
+
 #endif // ASIO_BASIC_SOCKET_ACCEPTOR_HPP
diff --git a/asio/include/asio/basic_socket_iostream.hpp b/asio/include/asio/basic_socket_iostream.hpp
index 12a008b..2f89269 100644
--- a/asio/include/asio/basic_socket_iostream.hpp
+++ b/asio/include/asio/basic_socket_iostream.hpp
@@ -33,8 +33,8 @@
 //   explicit basic_socket_iostream(T1 x1, ..., Tn xn)
 //     : std::basic_iostream<char>(
 //         &this->detail::socket_iostream_base<
-//           Protocol, StreamSocketService, Time,
-//           TimeTraits, TimerService>::streambuf_)
+//           Protocol ASIO_SVC_TARG, Time,
+//           TimeTraits ASIO_SVC_TARG1>::streambuf_)
 //   {
 //     if (rdbuf()->connect(x1, ..., xn) == 0)
 //       this->setstate(std::ios_base::failbit);
@@ -46,8 +46,8 @@
   explicit basic_socket_iostream(ASIO_VARIADIC_BYVAL_PARAMS(n)) \
     : std::basic_iostream<char>( \
         &this->detail::socket_iostream_base< \
-          Protocol, StreamSocketService, Time, \
-          TimeTraits, TimerService>::streambuf_) \
+          Protocol ASIO_SVC_TARG, Time, \
+          TimeTraits ASIO_SVC_TARG1>::streambuf_) \
   { \
     this->setf(std::ios_base::unitbuf); \
     if (rdbuf()->connect(ASIO_VARIADIC_BYVAL_ARGS(n)) == 0) \
@@ -82,33 +82,33 @@
 
 // A separate base class is used to ensure that the streambuf is initialised
 // prior to the basic_socket_iostream's basic_iostream base class.
-template <typename Protocol, typename StreamSocketService,
-    typename Time, typename TimeTraits, typename TimerService>
+template <typename Protocol ASIO_SVC_TPARAM,
+    typename Time, typename TimeTraits ASIO_SVC_TPARAM1>
 class socket_iostream_base
 {
 protected:
-  basic_socket_streambuf<Protocol, StreamSocketService,
-    Time, TimeTraits, TimerService> streambuf_;
+  basic_socket_streambuf<Protocol ASIO_SVC_TARG,
+    Time, TimeTraits ASIO_SVC_TARG1> streambuf_;
 };
 
-}
+} // namespace detail
 
 /// Iostream interface for a socket.
-template <typename Protocol,
-    typename StreamSocketService = stream_socket_service<Protocol>,
+template <typename Protocol
+    ASIO_SVC_TPARAM_DEF1(= stream_socket_service<Protocol>),
 #if defined(ASIO_HAS_BOOST_DATE_TIME) \
   || defined(GENERATING_DOCUMENTATION)
     typename Time = boost::posix_time::ptime,
-    typename TimeTraits = asio::time_traits<Time>,
-    typename TimerService = deadline_timer_service<Time, TimeTraits> >
+    typename TimeTraits = asio::time_traits<Time>
+    ASIO_SVC_TPARAM1_DEF2(= deadline_timer_service<Time, TimeTraits>)>
 #else
     typename Time = steady_timer::clock_type,
-    typename TimeTraits = steady_timer::traits_type,
-    typename TimerService = steady_timer::service_type>
+    typename TimeTraits = steady_timer::traits_type
+    ASIO_SVC_TPARAM1_DEF1(= steady_timer::service_type)>
 #endif
 class basic_socket_iostream
-  : private detail::socket_iostream_base<Protocol,
-        StreamSocketService, Time, TimeTraits, TimerService>,
+  : private detail::socket_iostream_base<Protocol
+        ASIO_SVC_TARG, Time, TimeTraits ASIO_SVC_TARG1>,
     public std::basic_iostream<char>
 {
 private:
@@ -149,8 +149,8 @@
   basic_socket_iostream()
     : std::basic_iostream<char>(
         &this->detail::socket_iostream_base<
-          Protocol, StreamSocketService, Time,
-          TimeTraits, TimerService>::streambuf_)
+          Protocol ASIO_SVC_TARG, Time,
+          TimeTraits ASIO_SVC_TARG1>::streambuf_)
   {
     this->setf(std::ios_base::unitbuf);
   }
@@ -169,8 +169,8 @@
   explicit basic_socket_iostream(T... x)
     : std::basic_iostream<char>(
         &this->detail::socket_iostream_base<
-          Protocol, StreamSocketService, Time,
-          TimeTraits, TimerService>::streambuf_)
+          Protocol ASIO_SVC_TARG, Time,
+          TimeTraits ASIO_SVC_TARG1>::streambuf_)
   {
     this->setf(std::ios_base::unitbuf);
     if (rdbuf()->connect(x...) == 0)
@@ -208,14 +208,14 @@
   }
 
   /// Return a pointer to the underlying streambuf.
-  basic_socket_streambuf<Protocol, StreamSocketService,
-    Time, TimeTraits, TimerService>* rdbuf() const
+  basic_socket_streambuf<Protocol ASIO_SVC_TARG,
+    Time, TimeTraits ASIO_SVC_TARG1>* rdbuf() const
   {
-    return const_cast<basic_socket_streambuf<Protocol, StreamSocketService,
-      Time, TimeTraits, TimerService>*>(
+    return const_cast<basic_socket_streambuf<Protocol ASIO_SVC_TARG,
+      Time, TimeTraits ASIO_SVC_TARG1>*>(
         &this->detail::socket_iostream_base<
-          Protocol, StreamSocketService, Time,
-          TimeTraits, TimerService>::streambuf_);
+          Protocol ASIO_SVC_TARG, Time,
+          TimeTraits ASIO_SVC_TARG1>::streambuf_);
   }
 
   /// Get the last error associated with the stream.
diff --git a/asio/include/asio/basic_socket_streambuf.hpp b/asio/include/asio/basic_socket_streambuf.hpp
index 0a51459..9f13eb0 100644
--- a/asio/include/asio/basic_socket_streambuf.hpp
+++ b/asio/include/asio/basic_socket_streambuf.hpp
@@ -21,14 +21,13 @@
 
 #include <streambuf>
 #include "asio/basic_socket.hpp"
-#include "asio/deadline_timer_service.hpp"
 #include "asio/detail/array.hpp"
 #include "asio/detail/throw_error.hpp"
 #include "asio/io_context.hpp"
 #include "asio/stream_socket_service.hpp"
 
 #if defined(ASIO_HAS_BOOST_DATE_TIME)
-# include "asio/deadline_timer.hpp"
+# include "asio/deadline_timer_service.hpp"
 #else
 # include "asio/steady_timer.hpp"
 #endif
@@ -39,12 +38,10 @@
 
 // A macro that should expand to:
 //   template <typename T1, ..., typename Tn>
-//   basic_socket_streambuf<Protocol, StreamSocketService,
-//     Time, TimeTraits, TimerService>* connect(
-//       T1 x1, ..., Tn xn)
+//   basic_socket_streambuf* connect(T1 x1, ..., Tn xn)
 //   {
 //     init_buffers();
-//     this->basic_socket<Protocol, StreamSocketService>::close(ec_);
+//     this->basic_socket<Protocol ASIO_SVC_TARG>::close(ec_);
 //     typedef typename Protocol::resolver resolver_type;
 //     resolver_type resolver(detail::socket_streambuf_base::io_context_);
 //     connect_to_endpoints(
@@ -55,12 +52,10 @@
 
 # define ASIO_PRIVATE_CONNECT_DEF(n) \
   template <ASIO_VARIADIC_TPARAMS(n)> \
-  basic_socket_streambuf<Protocol, StreamSocketService, \
-    Time, TimeTraits, TimerService>* connect( \
-      ASIO_VARIADIC_BYVAL_PARAMS(n)) \
+  basic_socket_streambuf* connect(ASIO_VARIADIC_BYVAL_PARAMS(n)) \
   { \
     init_buffers(); \
-    this->basic_socket<Protocol, StreamSocketService>::close(ec_); \
+    this->basic_socket<Protocol ASIO_SVC_TARG>::close(ec_); \
     typedef typename Protocol::resolver resolver_type; \
     resolver_type resolver(detail::socket_streambuf_base::io_context_); \
     connect_to_endpoints( \
@@ -71,6 +66,10 @@
 
 #endif // !defined(ASIO_HAS_VARIADIC_TEMPLATES)
 
+#if !defined(ASIO_ENABLE_OLD_SERVICES)
+# define ASIO_SVC_T1 detail::deadline_timer_service<traits_helper>
+#endif // !defined(ASIO_ENABLE_OLD_SERVICES)
+
 #include "asio/detail/push_options.hpp"
 
 namespace asio {
@@ -87,22 +86,22 @@
 } // namespace detail
 
 /// Iostream streambuf for a socket.
-template <typename Protocol,
-    typename StreamSocketService = stream_socket_service<Protocol>,
+template <typename Protocol
+    ASIO_SVC_TPARAM_DEF1(= stream_socket_service<Protocol>),
 #if defined(ASIO_HAS_BOOST_DATE_TIME) \
   || defined(GENERATING_DOCUMENTATION)
     typename Time = boost::posix_time::ptime,
-    typename TimeTraits = asio::time_traits<Time>,
-    typename TimerService = deadline_timer_service<Time, TimeTraits> >
+    typename TimeTraits = asio::time_traits<Time>
+    ASIO_SVC_TPARAM1_DEF2(= deadline_timer_service<Time, TimeTraits>)>
 #else
     typename Time = steady_timer::clock_type,
-    typename TimeTraits = steady_timer::traits_type,
-    typename TimerService = steady_timer::service_type>
+    typename TimeTraits = steady_timer::traits_type
+    ASIO_SVC_TPARAM1_DEF1(= steady_timer::service_type)>
 #endif
 class basic_socket_streambuf
   : public std::streambuf,
     private detail::socket_streambuf_base,
-    public basic_socket<Protocol, StreamSocketService>
+    public basic_socket<Protocol ASIO_SVC_TARG>
 {
 private:
   // These typedefs are intended keep this class's implementation independent
@@ -140,7 +139,7 @@
 
   /// Construct a basic_socket_streambuf without establishing a connection.
   basic_socket_streambuf()
-    : basic_socket<Protocol, StreamSocketService>(
+    : basic_socket<Protocol ASIO_SVC_TARG>(
         this->detail::socket_streambuf_base::io_context_),
       unbuffered_(false),
       timer_service_(0),
@@ -165,13 +164,11 @@
    * @return \c this if a connection was successfully established, a null
    * pointer otherwise.
    */
-  basic_socket_streambuf<Protocol, StreamSocketService,
-    Time, TimeTraits, TimerService>* connect(
-      const endpoint_type& endpoint)
+  basic_socket_streambuf* connect(const endpoint_type& endpoint)
   {
     init_buffers();
 
-    this->basic_socket<Protocol, StreamSocketService>::close(ec_);
+    this->basic_socket<Protocol ASIO_SVC_TARG>::close(ec_);
 
     if (timer_state_ == timer_has_expired)
     {
@@ -180,7 +177,7 @@
     }
 
     io_handler handler = { this };
-    this->basic_socket<Protocol, StreamSocketService>::async_connect(
+    this->basic_socket<Protocol ASIO_SVC_TARG>::async_connect(
         endpoint, handler);
 
     ec_ = asio::error::would_block;
@@ -202,15 +199,13 @@
    * pointer otherwise.
    */
   template <typename T1, ..., typename TN>
-  basic_socket_streambuf<Protocol, StreamSocketService>* connect(
-      T1 t1, ..., TN tn);
+  basic_socket_streambuf* connect(T1 t1, ..., TN tn);
 #elif defined(ASIO_HAS_VARIADIC_TEMPLATES)
   template <typename... T>
-  basic_socket_streambuf<Protocol, StreamSocketService,
-    Time, TimeTraits, TimerService>* connect(T... x)
+  basic_socket_streambuf* connect(T... x)
   {
     init_buffers();
-    this->basic_socket<Protocol, StreamSocketService>::close(ec_);
+    this->basic_socket<Protocol ASIO_SVC_TARG>::close(ec_);
     typedef typename Protocol::resolver resolver_type;
     resolver_type resolver(detail::socket_streambuf_base::io_context_);
     connect_to_endpoints(resolver.resolve(x..., ec_));
@@ -225,11 +220,10 @@
    * @return \c this if a connection was successfully established, a null
    * pointer otherwise.
    */
-  basic_socket_streambuf<Protocol, StreamSocketService,
-    Time, TimeTraits, TimerService>* close()
+  basic_socket_streambuf* close()
   {
     sync();
-    this->basic_socket<Protocol, StreamSocketService>::close(ec_);
+    this->basic_socket<Protocol ASIO_SVC_TARG>::close(ec_);
     if (!ec_)
       init_buffers();
     return !ec_ ? this : 0;
@@ -305,26 +299,6 @@
    *
    * @param expiry_time The expiry time to be used for the timer.
    */
-  void expires_at(const duration& expiry_time)
-  {
-    construct_timer();
-
-    asio::error_code ec;
-    timer_service_->expires_from_now(timer_implementation_, expiry_time, ec);
-    asio::detail::throw_error(ec, "expires_from_now");
-
-    start_timer();
-  }
-
-  /// Set the stream buffer's expiry time relative to now.
-  /**
-   * This function sets the expiry time associated with the stream. Stream
-   * operations performed after this time (where the operations cannot be
-   * completed using the internal buffers) will fail with the error
-   * asio::error::operation_aborted.
-   *
-   * @param expiry_time The expiry time to be used for the timer.
-   */
   void expires_after(const duration& expiry_time)
   {
     construct_timer();
@@ -335,7 +309,7 @@
 #else // defined(ASIO_HAS_BOOST_DATE_TIME)
     timer_service_->expires_after(timer_implementation_, expiry_time, ec);
 #endif // defined(ASIO_HAS_BOOST_DATE_TIME)
-    asio::detail::throw_error(ec, "after");
+    asio::detail::throw_error(ec, "expires_after");
 
     start_timer();
   }
@@ -527,7 +501,7 @@
       ec_ = asio::error::host_not_found;
       while (ec_ && i != end)
       {
-        this->basic_socket<Protocol, StreamSocketService>::close(ec_);
+        this->basic_socket<Protocol ASIO_SVC_TARG>::close(ec_);
 
         if (timer_state_ == timer_has_expired)
         {
@@ -536,7 +510,7 @@
         }
 
         io_handler handler = { this };
-        this->basic_socket<Protocol, StreamSocketService>::async_connect(
+        this->basic_socket<Protocol ASIO_SVC_TARG>::async_connect(
             *i, handler);
 
         ec_ = asio::error::would_block;
@@ -590,7 +564,7 @@
       {
         this_->timer_state_ = timer_has_expired;
         asio::error_code ec;
-        this_->basic_socket<Protocol, StreamSocketService>::close(ec);
+        this_->basic_socket<Protocol ASIO_SVC_TARG>::close(ec);
       }
     }
   };
@@ -599,7 +573,7 @@
   {
     if (timer_service_ == 0)
     {
-      TimerService& timer_service = use_service<TimerService>(
+      ASIO_SVC_T1& timer_service = use_service<ASIO_SVC_T1>(
           detail::socket_streambuf_base::io_context_);
       timer_service.construct(timer_implementation_);
       timer_service_ = &timer_service;
@@ -628,8 +602,8 @@
   bool unbuffered_;
   asio::error_code ec_;
   std::size_t bytes_transferred_;
-  TimerService* timer_service_;
-  typename TimerService::implementation_type timer_implementation_;
+  ASIO_SVC_T1* timer_service_;
+  typename ASIO_SVC_T1::implementation_type timer_implementation_;
   enum state { no_timer, timer_is_pending, timer_has_expired } timer_state_;
 };
 
@@ -637,6 +611,10 @@
 
 #include "asio/detail/pop_options.hpp"
 
+#if !defined(ASIO_ENABLE_OLD_SERVICES)
+# undef ASIO_SVC_T1
+#endif // !defined(ASIO_ENABLE_OLD_SERVICES)
+
 #if !defined(ASIO_HAS_VARIADIC_TEMPLATES)
 # undef ASIO_PRIVATE_CONNECT_DEF
 #endif // !defined(ASIO_HAS_VARIADIC_TEMPLATES)
diff --git a/asio/include/asio/basic_stream_socket.hpp b/asio/include/asio/basic_stream_socket.hpp
index 4708786..c3eef8c 100644
--- a/asio/include/asio/basic_stream_socket.hpp
+++ b/asio/include/asio/basic_stream_socket.hpp
@@ -40,14 +40,19 @@
  * @par Concepts:
  * AsyncReadStream, AsyncWriteStream, Stream, SyncReadStream, SyncWriteStream.
  */
-template <typename Protocol,
-    typename StreamSocketService = stream_socket_service<Protocol> >
+template <typename Protocol
+    ASIO_SVC_TPARAM_DEF1(= stream_socket_service<Protocol>)>
 class basic_stream_socket
-  : public basic_socket<Protocol, StreamSocketService>
+  : public basic_socket<Protocol ASIO_SVC_TARG>
 {
 public:
   /// The native representation of a socket.
-  typedef typename StreamSocketService::native_handle_type native_handle_type;
+#if defined(GENERATING_DOCUMENTATION)
+  typedef implementation_defined native_handle_type;
+#else
+  typedef typename basic_socket<
+    Protocol ASIO_SVC_TARG>::native_handle_type native_handle_type;
+#endif
 
   /// The protocol type.
   typedef Protocol protocol_type;
@@ -65,7 +70,7 @@
    * dispatch handlers for any asynchronous operations performed on the socket.
    */
   explicit basic_stream_socket(asio::io_context& io_context)
-    : basic_socket<Protocol, StreamSocketService>(io_context)
+    : basic_socket<Protocol ASIO_SVC_TARG>(io_context)
   {
   }
 
@@ -83,7 +88,7 @@
    */
   basic_stream_socket(asio::io_context& io_context,
       const protocol_type& protocol)
-    : basic_socket<Protocol, StreamSocketService>(io_context, protocol)
+    : basic_socket<Protocol ASIO_SVC_TARG>(io_context, protocol)
   {
   }
 
@@ -104,7 +109,7 @@
    */
   basic_stream_socket(asio::io_context& io_context,
       const endpoint_type& endpoint)
-    : basic_socket<Protocol, StreamSocketService>(io_context, endpoint)
+    : basic_socket<Protocol ASIO_SVC_TARG>(io_context, endpoint)
   {
   }
 
@@ -124,7 +129,7 @@
    */
   basic_stream_socket(asio::io_context& io_context,
       const protocol_type& protocol, const native_handle_type& native_socket)
-    : basic_socket<Protocol, StreamSocketService>(
+    : basic_socket<Protocol ASIO_SVC_TARG>(
         io_context, protocol, native_socket)
   {
   }
@@ -141,8 +146,7 @@
    * constructed using the @c basic_stream_socket(io_context&) constructor.
    */
   basic_stream_socket(basic_stream_socket&& other)
-    : basic_socket<Protocol, StreamSocketService>(
-        ASIO_MOVE_CAST(basic_stream_socket)(other))
+    : basic_socket<Protocol ASIO_SVC_TARG>(std::move(other))
   {
   }
 
@@ -158,8 +162,7 @@
    */
   basic_stream_socket& operator=(basic_stream_socket&& other)
   {
-    basic_socket<Protocol, StreamSocketService>::operator=(
-        ASIO_MOVE_CAST(basic_stream_socket)(other));
+    basic_socket<Protocol ASIO_SVC_TARG>::operator=(std::move(other));
     return *this;
   }
 
@@ -174,13 +177,11 @@
    * @note Following the move, the moved-from object is in the same state as if
    * constructed using the @c basic_stream_socket(io_context&) constructor.
    */
-  template <typename Protocol1, typename StreamSocketService1>
+  template <typename Protocol1 ASIO_SVC_TPARAM1>
   basic_stream_socket(
-      basic_stream_socket<Protocol1, StreamSocketService1>&& other,
+      basic_stream_socket<Protocol1 ASIO_SVC_TARG1>&& other,
       typename enable_if<is_convertible<Protocol1, Protocol>::value>::type* = 0)
-    : basic_socket<Protocol, StreamSocketService>(
-        ASIO_MOVE_CAST2(basic_stream_socket<
-          Protocol1, StreamSocketService1>)(other))
+    : basic_socket<Protocol ASIO_SVC_TARG>(std::move(other))
   {
   }
 
@@ -194,18 +195,25 @@
    * @note Following the move, the moved-from object is in the same state as if
    * constructed using the @c basic_stream_socket(io_context&) constructor.
    */
-  template <typename Protocol1, typename StreamSocketService1>
+  template <typename Protocol1 ASIO_SVC_TPARAM1>
   typename enable_if<is_convertible<Protocol1, Protocol>::value,
       basic_stream_socket>::type& operator=(
-        basic_stream_socket<Protocol1, StreamSocketService1>&& other)
+        basic_stream_socket<Protocol1 ASIO_SVC_TARG1>&& other)
   {
-    basic_socket<Protocol, StreamSocketService>::operator=(
-        ASIO_MOVE_CAST2(basic_stream_socket<
-          Protocol1, StreamSocketService1>)(other));
+    basic_socket<Protocol ASIO_SVC_TARG>::operator=(std::move(other));
     return *this;
   }
 #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
 
+  /// Destroys the socket.
+  /**
+   * This function destroys the socket, cancelling any outstanding asynchronous
+   * operations associated with the socket as if by calling @c cancel.
+   */
+  ~basic_stream_socket()
+  {
+  }
+
   /// Send some data on the socket.
   /**
    * This function is used to send data on the stream socket. The function
@@ -350,9 +358,20 @@
     // not meet the documented type requirements for a WriteHandler.
     ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_send(
         this->get_implementation(), buffers, 0,
         ASIO_MOVE_CAST(WriteHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<WriteHandler,
+      void (asio::error_code, std::size_t)> init(handler);
+
+    this->get_service().async_send(
+        this->get_implementation(), buffers, 0,
+        init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 
   /// Start an asynchronous send.
@@ -403,9 +422,20 @@
     // not meet the documented type requirements for a WriteHandler.
     ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_send(
         this->get_implementation(), buffers, flags,
         ASIO_MOVE_CAST(WriteHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<WriteHandler,
+      void (asio::error_code, std::size_t)> init(handler);
+
+    this->get_service().async_send(
+        this->get_implementation(), buffers, flags,
+        init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 
   /// Receive some data on the socket.
@@ -560,8 +590,18 @@
     // not meet the documented type requirements for a ReadHandler.
     ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_receive(this->get_implementation(),
         buffers, 0, ASIO_MOVE_CAST(ReadHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<ReadHandler,
+      void (asio::error_code, std::size_t)> init(handler);
+
+    this->get_service().async_receive(this->get_implementation(),
+        buffers, 0, init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 
   /// Start an asynchronous receive.
@@ -614,8 +654,18 @@
     // not meet the documented type requirements for a ReadHandler.
     ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_receive(this->get_implementation(),
         buffers, flags, ASIO_MOVE_CAST(ReadHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<ReadHandler,
+      void (asio::error_code, std::size_t)> init(handler);
+
+    this->get_service().async_receive(this->get_implementation(),
+        buffers, flags, init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 
   /// Write some data to the socket.
@@ -723,8 +773,18 @@
     // not meet the documented type requirements for a WriteHandler.
     ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_send(this->get_implementation(),
         buffers, 0, ASIO_MOVE_CAST(WriteHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<WriteHandler,
+      void (asio::error_code, std::size_t)> init(handler);
+
+    this->get_service().async_send(this->get_implementation(),
+        buffers, 0, init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 
   /// Read some data from the socket.
@@ -836,8 +896,18 @@
     // not meet the documented type requirements for a ReadHandler.
     ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_receive(this->get_implementation(),
         buffers, 0, ASIO_MOVE_CAST(ReadHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<ReadHandler,
+      void (asio::error_code, std::size_t)> init(handler);
+
+    this->get_service().async_receive(this->get_implementation(),
+        buffers, 0, init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 };
 
diff --git a/asio/include/asio/basic_waitable_timer.hpp b/asio/include/asio/basic_waitable_timer.hpp
index 1a35370..e6032c3 100644
--- a/asio/include/asio/basic_waitable_timer.hpp
+++ b/asio/include/asio/basic_waitable_timer.hpp
@@ -24,6 +24,18 @@
 #include "asio/wait_traits.hpp"
 #include "asio/waitable_timer_service.hpp"
 
+#if defined(ASIO_HAS_MOVE)
+# include <utility>
+#endif // defined(ASIO_HAS_MOVE)
+
+#if !defined(ASIO_ENABLE_OLD_SERVICES)
+# include "asio/detail/chrono_time_traits.hpp"
+# include "asio/detail/deadline_timer_service.hpp"
+# define ASIO_SVC_T \
+    detail::deadline_timer_service< \
+      detail::chrono_time_traits<Clock, WaitTraits> >
+#endif // !defined(ASIO_ENABLE_OLD_SERVICES)
+
 #include "asio/detail/push_options.hpp"
 
 namespace asio {
@@ -121,12 +133,15 @@
  * it contains the value asio::error::operation_aborted.
  */
 template <typename Clock,
-    typename WaitTraits = asio::wait_traits<Clock>,
-    typename WaitableTimerService = waitable_timer_service<Clock, WaitTraits> >
+    typename WaitTraits = asio::wait_traits<Clock>
+    ASIO_SVC_TPARAM_DEF2(= waitable_timer_service<Clock, WaitTraits>)>
 class basic_waitable_timer
-  : public basic_io_object<WaitableTimerService>
+  : ASIO_SVC_ACCESS basic_io_object<ASIO_SVC_T>
 {
 public:
+  /// The type of the executor associated with the object.
+  typedef io_context::executor_type executor_type;
+
   /// The clock type.
   typedef Clock clock_type;
 
@@ -149,7 +164,7 @@
    * handlers for any asynchronous operations performed on the timer.
    */
   explicit basic_waitable_timer(asio::io_context& io_context)
-    : basic_io_object<WaitableTimerService>(io_context)
+    : basic_io_object<ASIO_SVC_T>(io_context)
   {
   }
 
@@ -165,7 +180,7 @@
    */
   basic_waitable_timer(asio::io_context& io_context,
       const time_point& expiry_time)
-    : basic_io_object<WaitableTimerService>(io_context)
+    : basic_io_object<ASIO_SVC_T>(io_context)
   {
     asio::error_code ec;
     this->get_service().expires_at(this->get_implementation(), expiry_time, ec);
@@ -184,7 +199,7 @@
    */
   basic_waitable_timer(asio::io_context& io_context,
       const duration& expiry_time)
-    : basic_io_object<WaitableTimerService>(io_context)
+    : basic_io_object<ASIO_SVC_T>(io_context)
   {
     asio::error_code ec;
     this->get_service().expires_after(
@@ -204,14 +219,14 @@
    * constructed using the @c basic_waitable_timer(io_context&) constructor.
    */
   basic_waitable_timer(basic_waitable_timer&& other)
-    : basic_io_object<WaitableTimerService>(
-        ASIO_MOVE_CAST(basic_waitable_timer)(other))
+    : basic_io_object<ASIO_SVC_T>(std::move(other))
   {
   }
 
   /// Move-assign a basic_waitable_timer from another.
   /**
-   * This assignment operator moves a timer from one object to another.
+   * This assignment operator moves a timer from one object to another. Cancels
+   * any outstanding asynchronous operations associated with the target object.
    *
    * @param other The other basic_waitable_timer object from which the move will
    * occur.
@@ -221,12 +236,60 @@
    */
   basic_waitable_timer& operator=(basic_waitable_timer&& other)
   {
-    basic_io_object<WaitableTimerService>::operator=(
-        ASIO_MOVE_CAST(basic_waitable_timer)(other));
+    basic_io_object<ASIO_SVC_T>::operator=(std::move(other));
     return *this;
   }
 #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
 
+  /// Destroys the timer.
+  /**
+   * This function destroys the timer, cancelling any outstanding asynchronous
+   * wait operations associated with the timer as if by calling @c cancel.
+   */
+  ~basic_waitable_timer()
+  {
+  }
+
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+  // These functions are provided by basic_io_object<>.
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+#if !defined(ASIO_NO_DEPRECATED)
+  /// (Deprecated: Use get_executor().) Get the io_context associated with the
+  /// object.
+  /**
+   * This function may be used to obtain the io_context object that the I/O
+   * object uses to dispatch handlers for asynchronous operations.
+   *
+   * @return A reference to the io_context object that the I/O object will use
+   * to dispatch handlers. Ownership is not transferred to the caller.
+   */
+  asio::io_context& get_io_context()
+  {
+    return basic_io_object<ASIO_SVC_T>::get_io_context();
+  }
+
+  /// (Deprecated: Use get_executor().) Get the io_context associated with the
+  /// object.
+  /**
+   * This function may be used to obtain the io_context object that the I/O
+   * object uses to dispatch handlers for asynchronous operations.
+   *
+   * @return A reference to the io_context object that the I/O object will use
+   * to dispatch handlers. Ownership is not transferred to the caller.
+   */
+  asio::io_context& get_io_service()
+  {
+    return basic_io_object<ASIO_SVC_T>::get_io_service();
+  }
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+  /// Get the executor associated with the object.
+  executor_type get_executor() ASIO_NOEXCEPT
+  {
+    return basic_io_object<ASIO_SVC_T>::get_executor();
+  }
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
+
   /// Cancel any asynchronous operations that are waiting on the timer.
   /**
    * This function forces the completion of any pending asynchronous wait
@@ -257,7 +320,9 @@
     return s;
   }
 
-  /// Cancel any asynchronous operations that are waiting on the timer.
+#if !defined(ASIO_NO_DEPRECATED)
+  /// (Deprecated: Use non-error_code overload.) Cancel any asynchronous
+  /// operations that are waiting on the timer.
   /**
    * This function forces the completion of any pending asynchronous wait
    * operations against the timer. The handler for each cancelled operation will
@@ -283,6 +348,7 @@
   {
     return this->get_service().cancel(this->get_implementation(), ec);
   }
+#endif // !defined(ASIO_NO_DEPRECATED)
 
   /// Cancels one asynchronous operation that is waiting on the timer.
   /**
@@ -317,7 +383,9 @@
     return s;
   }
 
-  /// Cancels one asynchronous operation that is waiting on the timer.
+#if !defined(ASIO_NO_DEPRECATED)
+  /// (Deprecated: Use non-error_code overload.) Cancels one asynchronous
+  /// operation that is waiting on the timer.
   /**
    * This function forces the completion of one pending asynchronous wait
    * operation against the timer. Handlers are cancelled in FIFO order. The
@@ -346,7 +414,6 @@
     return this->get_service().cancel_one(this->get_implementation(), ec);
   }
 
-#if !defined(ASIO_NO_DEPRECATED)
   /// (Deprecated: Use expiry().) Get the timer's expiry time as an absolute
   /// time.
   /**
@@ -400,7 +467,9 @@
     return s;
   }
 
-  /// Set the timer's expiry time as an absolute time.
+#if !defined(ASIO_NO_DEPRECATED)
+  /// (Deprecated: Use non-error_code overload.) Set the timer's expiry time as
+  /// an absolute time.
   /**
    * This function sets the expiry time. Any pending asynchronous wait
    * operations will be cancelled. The handler for each cancelled operation will
@@ -428,6 +497,7 @@
     return this->get_service().expires_at(
         this->get_implementation(), expiry_time, ec);
   }
+#endif // !defined(ASIO_NO_DEPRECATED)
 
   /// Set the timer's expiry time relative to now.
   /**
@@ -460,35 +530,6 @@
     return s;
   }
 
-  /// Set the timer's expiry time relative to now.
-  /**
-   * This function sets the expiry time. Any pending asynchronous wait
-   * operations will be cancelled. The handler for each cancelled operation will
-   * be invoked with the asio::error::operation_aborted error code.
-   *
-   * @param expiry_time The expiry time to be used for the timer.
-   *
-   * @param ec Set to indicate what error occurred, if any.
-   *
-   * @return The number of asynchronous operations that were cancelled.
-   *
-   * @note If the timer has already expired when expires_after() is called,
-   * then the handlers for asynchronous wait operations will:
-   *
-   * @li have already been invoked; or
-   *
-   * @li have been queued for invocation in the near future.
-   *
-   * These handlers can no longer be cancelled, and therefore are passed an
-   * error code that indicates the successful completion of the wait operation.
-   */
-  std::size_t expires_after(const duration& expiry_time,
-      asio::error_code& ec)
-  {
-    return this->get_service().expires_after(
-        this->get_implementation(), expiry_time, ec);
-  }
-
 #if !defined(ASIO_NO_DEPRECATED)
   /// (Deprecated: Use expiry().) Get the timer's expiry time relative to now.
   /**
@@ -622,13 +663,32 @@
     // not meet the documented type requirements for a WaitHandler.
     ASIO_WAIT_HANDLER_CHECK(WaitHandler, handler) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_wait(this->get_implementation(),
         ASIO_MOVE_CAST(WaitHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    async_completion<WaitHandler,
+      void (asio::error_code)> init(handler);
+
+    this->get_service().async_wait(this->get_implementation(), init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
+
+private:
+  // Disallow copying and assignment.
+  basic_waitable_timer(const basic_waitable_timer&) ASIO_DELETED;
+  basic_waitable_timer& operator=(
+      const basic_waitable_timer&) ASIO_DELETED;
 };
 
 } // namespace asio
 
 #include "asio/detail/pop_options.hpp"
 
+#if !defined(ASIO_ENABLE_OLD_SERVICES)
+# undef ASIO_SVC_T
+#endif // !defined(ASIO_ENABLE_OLD_SERVICES)
+
 #endif // ASIO_BASIC_WAITABLE_TIMER_HPP
diff --git a/asio/include/asio/connect.hpp b/asio/include/asio/connect.hpp
index f63f335..d43f321 100644
--- a/asio/include/asio/connect.hpp
+++ b/asio/include/asio/connect.hpp
@@ -86,8 +86,9 @@
  * tcp::socket s(io_context);
  * asio::connect(s, r.resolve(q)); @endcode
  */
-template <typename Protocol, typename SocketService, typename EndpointSequence>
-typename Protocol::endpoint connect(basic_socket<Protocol, SocketService>& s,
+template <typename Protocol ASIO_SVC_TPARAM, typename EndpointSequence>
+typename Protocol::endpoint connect(
+    basic_socket<Protocol ASIO_SVC_TARG>& s,
     const EndpointSequence& endpoints,
     typename enable_if<is_endpoint_sequence<
         EndpointSequence>::value>::type* = 0);
@@ -122,8 +123,9 @@
  *   // An error occurred.
  * } @endcode
  */
-template <typename Protocol, typename SocketService, typename EndpointSequence>
-typename Protocol::endpoint connect(basic_socket<Protocol, SocketService>& s,
+template <typename Protocol ASIO_SVC_TPARAM, typename EndpointSequence>
+typename Protocol::endpoint connect(
+    basic_socket<Protocol ASIO_SVC_TARG>& s,
     const EndpointSequence& endpoints, asio::error_code& ec,
     typename enable_if<is_endpoint_sequence<
         EndpointSequence>::value>::type* = 0);
@@ -153,8 +155,8 @@
  * Iterator represents the end of the sequence. This is a valid assumption for
  * iterator types such as @c asio::ip::tcp::resolver::iterator.
  */
-template <typename Protocol, typename SocketService, typename Iterator>
-Iterator connect(basic_socket<Protocol, SocketService>& s, Iterator begin,
+template <typename Protocol ASIO_SVC_TPARAM, typename Iterator>
+Iterator connect(basic_socket<Protocol ASIO_SVC_TARG>& s, Iterator begin,
     typename enable_if<!is_endpoint_sequence<Iterator>::value>::type* = 0);
 
 /// (Deprecated.) Establishes a socket connection by trying each endpoint in a
@@ -181,8 +183,8 @@
  * Iterator represents the end of the sequence. This is a valid assumption for
  * iterator types such as @c asio::ip::tcp::resolver::iterator.
  */
-template <typename Protocol, typename SocketService, typename Iterator>
-Iterator connect(basic_socket<Protocol, SocketService>& s,
+template <typename Protocol ASIO_SVC_TPARAM, typename Iterator>
+Iterator connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
     Iterator begin, asio::error_code& ec,
     typename enable_if<!is_endpoint_sequence<Iterator>::value>::type* = 0);
 #endif // !defined(ASIO_NO_DEPRECATED)
@@ -214,8 +216,8 @@
  * tcp::socket s(io_context);
  * asio::connect(s, e.begin(), e.end()); @endcode
  */
-template <typename Protocol, typename SocketService, typename Iterator>
-Iterator connect(basic_socket<Protocol, SocketService>& s,
+template <typename Protocol ASIO_SVC_TPARAM, typename Iterator>
+Iterator connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
     Iterator begin, Iterator end);
 
 /// Establishes a socket connection by trying each endpoint in a sequence.
@@ -251,8 +253,8 @@
  *   // An error occurred.
  * } @endcode
  */
-template <typename Protocol, typename SocketService, typename Iterator>
-Iterator connect(basic_socket<Protocol, SocketService>& s,
+template <typename Protocol ASIO_SVC_TPARAM, typename Iterator>
+Iterator connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
     Iterator begin, Iterator end, asio::error_code& ec);
 
 /// Establishes a socket connection by trying each endpoint in a sequence.
@@ -306,9 +308,10 @@
  *     r.resolve(q), my_connect_condition());
  * std::cout << "Connected to: " << e << std::endl; @endcode
  */
-template <typename Protocol, typename SocketService,
+template <typename Protocol ASIO_SVC_TPARAM,
     typename EndpointSequence, typename ConnectCondition>
-typename Protocol::endpoint connect(basic_socket<Protocol, SocketService>& s,
+typename Protocol::endpoint connect(
+    basic_socket<Protocol ASIO_SVC_TARG>& s,
     const EndpointSequence& endpoints, ConnectCondition connect_condition,
     typename enable_if<is_endpoint_sequence<
         EndpointSequence>::value>::type* = 0);
@@ -373,9 +376,10 @@
  *   std::cout << "Connected to: " << e << std::endl;
  * } @endcode
  */
-template <typename Protocol, typename SocketService,
+template <typename Protocol ASIO_SVC_TPARAM,
     typename EndpointSequence, typename ConnectCondition>
-typename Protocol::endpoint connect(basic_socket<Protocol, SocketService>& s,
+typename Protocol::endpoint connect(
+    basic_socket<Protocol ASIO_SVC_TARG>& s,
     const EndpointSequence& endpoints, ConnectCondition connect_condition,
     asio::error_code& ec,
     typename enable_if<is_endpoint_sequence<
@@ -417,9 +421,9 @@
  * Iterator represents the end of the sequence. This is a valid assumption for
  * iterator types such as @c asio::ip::tcp::resolver::iterator.
  */
-template <typename Protocol, typename SocketService,
+template <typename Protocol ASIO_SVC_TPARAM,
     typename Iterator, typename ConnectCondition>
-Iterator connect(basic_socket<Protocol, SocketService>& s,
+Iterator connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
     Iterator begin, ConnectCondition connect_condition,
     typename enable_if<!is_endpoint_sequence<Iterator>::value>::type* = 0);
 
@@ -458,9 +462,9 @@
  * Iterator represents the end of the sequence. This is a valid assumption for
  * iterator types such as @c asio::ip::tcp::resolver::iterator.
  */
-template <typename Protocol, typename SocketService,
+template <typename Protocol ASIO_SVC_TPARAM,
     typename Iterator, typename ConnectCondition>
-Iterator connect(basic_socket<Protocol, SocketService>& s, Iterator begin,
+Iterator connect(basic_socket<Protocol ASIO_SVC_TARG>& s, Iterator begin,
     ConnectCondition connect_condition, asio::error_code& ec,
     typename enable_if<!is_endpoint_sequence<Iterator>::value>::type* = 0);
 #endif // !defined(ASIO_NO_DEPRECATED)
@@ -519,9 +523,9 @@
  *     s, e.begin(), e.end(), my_connect_condition());
  * std::cout << "Connected to: " << i->endpoint() << std::endl; @endcode
  */
-template <typename Protocol, typename SocketService,
+template <typename Protocol ASIO_SVC_TPARAM,
     typename Iterator, typename ConnectCondition>
-Iterator connect(basic_socket<Protocol, SocketService>& s, Iterator begin,
+Iterator connect(basic_socket<Protocol ASIO_SVC_TARG>& s, Iterator begin,
     Iterator end, ConnectCondition connect_condition);
 
 /// Establishes a socket connection by trying each endpoint in a sequence.
@@ -587,9 +591,9 @@
  *   std::cout << "Connected to: " << i->endpoint() << std::endl;
  * } @endcode
  */
-template <typename Protocol, typename SocketService,
+template <typename Protocol ASIO_SVC_TPARAM,
     typename Iterator, typename ConnectCondition>
-Iterator connect(basic_socket<Protocol, SocketService>& s,
+Iterator connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
     Iterator begin, Iterator end, ConnectCondition connect_condition,
     asio::error_code& ec);
 
@@ -664,11 +668,11 @@
  *   // ...
  * } @endcode
  */
-template <typename Protocol, typename SocketService,
+template <typename Protocol ASIO_SVC_TPARAM,
     typename EndpointSequence, typename RangeConnectHandler>
 ASIO_INITFN_RESULT_TYPE(RangeConnectHandler,
     void (asio::error_code, typename Protocol::endpoint))
-async_connect(basic_socket<Protocol, SocketService>& s,
+async_connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
     const EndpointSequence& endpoints,
     ASIO_MOVE_ARG(RangeConnectHandler) handler,
     typename enable_if<is_endpoint_sequence<
@@ -710,11 +714,11 @@
  * Iterator represents the end of the sequence. This is a valid assumption for
  * iterator types such as @c asio::ip::tcp::resolver::iterator.
  */
-template <typename Protocol, typename SocketService,
+template <typename Protocol ASIO_SVC_TPARAM,
     typename Iterator, typename IteratorConnectHandler>
 ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler,
     void (asio::error_code, Iterator))
-async_connect(basic_socket<Protocol, SocketService>& s,
+async_connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
     Iterator begin, ASIO_MOVE_ARG(IteratorConnectHandler) handler,
     typename enable_if<!is_endpoint_sequence<Iterator>::value>::type* = 0);
 #endif // !defined(ASIO_NO_DEPRECATED)
@@ -768,11 +772,11 @@
  *   // ...
  * } @endcode
  */
-template <typename Protocol, typename SocketService,
+template <typename Protocol ASIO_SVC_TPARAM,
     typename Iterator, typename IteratorConnectHandler>
 ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler,
     void (asio::error_code, Iterator))
-async_connect(basic_socket<Protocol, SocketService>& s,
+async_connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
     Iterator begin, Iterator end,
     ASIO_MOVE_ARG(IteratorConnectHandler) handler);
 
@@ -871,11 +875,11 @@
  *   }
  * } @endcode
  */
-template <typename Protocol, typename SocketService, typename EndpointSequence,
+template <typename Protocol ASIO_SVC_TPARAM, typename EndpointSequence,
     typename ConnectCondition, typename RangeConnectHandler>
 ASIO_INITFN_RESULT_TYPE(RangeConnectHandler,
     void (asio::error_code, typename Protocol::endpoint))
-async_connect(basic_socket<Protocol, SocketService>& s,
+async_connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
     const EndpointSequence& endpoints, ConnectCondition connect_condition,
     ASIO_MOVE_ARG(RangeConnectHandler) handler,
     typename enable_if<is_endpoint_sequence<
@@ -928,11 +932,11 @@
  * Iterator represents the end of the sequence. This is a valid assumption for
  * iterator types such as @c asio::ip::tcp::resolver::iterator.
  */
-template <typename Protocol, typename SocketService, typename Iterator,
+template <typename Protocol ASIO_SVC_TPARAM, typename Iterator,
     typename ConnectCondition, typename IteratorConnectHandler>
 ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler,
     void (asio::error_code, Iterator))
-async_connect(basic_socket<Protocol, SocketService>& s, Iterator begin,
+async_connect(basic_socket<Protocol ASIO_SVC_TARG>& s, Iterator begin,
     ConnectCondition connect_condition,
     ASIO_MOVE_ARG(IteratorConnectHandler) handler,
     typename enable_if<!is_endpoint_sequence<Iterator>::value>::type* = 0);
@@ -1036,11 +1040,11 @@
  *   }
  * } @endcode
  */
-template <typename Protocol, typename SocketService, typename Iterator,
+template <typename Protocol ASIO_SVC_TPARAM, typename Iterator,
     typename ConnectCondition, typename IteratorConnectHandler>
 ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler,
     void (asio::error_code, Iterator))
-async_connect(basic_socket<Protocol, SocketService>& s,
+async_connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
     Iterator begin, Iterator end, ConnectCondition connect_condition,
     ASIO_MOVE_ARG(IteratorConnectHandler) handler);
 
diff --git a/asio/include/asio/datagram_socket_service.hpp b/asio/include/asio/datagram_socket_service.hpp
index 91fbdc9..e22d07f 100644
--- a/asio/include/asio/datagram_socket_service.hpp
+++ b/asio/include/asio/datagram_socket_service.hpp
@@ -16,6 +16,9 @@
 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
 
 #include "asio/detail/config.hpp"
+
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+
 #include <cstddef>
 #include "asio/async_result.hpp"
 #include "asio/detail/type_traits.hpp"
@@ -435,4 +438,6 @@
 
 #include "asio/detail/pop_options.hpp"
 
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
+
 #endif // ASIO_DATAGRAM_SOCKET_SERVICE_HPP
diff --git a/asio/include/asio/deadline_timer_service.hpp b/asio/include/asio/deadline_timer_service.hpp
index 5ef64c8..df87d54 100644
--- a/asio/include/asio/deadline_timer_service.hpp
+++ b/asio/include/asio/deadline_timer_service.hpp
@@ -17,6 +17,8 @@
 
 #include "asio/detail/config.hpp"
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+
 #if defined(ASIO_HAS_BOOST_DATE_TIME) \
   || defined(GENERATING_DOCUMENTATION)
 
@@ -25,7 +27,6 @@
 #include "asio/detail/deadline_timer_service.hpp"
 #include "asio/io_context.hpp"
 #include "asio/time_traits.hpp"
-#include "asio/detail/timer_queue_ptime.hpp"
 
 #include "asio/detail/push_options.hpp"
 
@@ -167,4 +168,6 @@
 #endif // defined(ASIO_HAS_BOOST_DATE_TIME)
        // || defined(GENERATING_DOCUMENTATION)
 
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
+
 #endif // ASIO_DEADLINE_TIMER_SERVICE_HPP
diff --git a/asio/include/asio/detail/config.hpp b/asio/include/asio/detail/config.hpp
index 01e499f..45a16b7 100644
--- a/asio/include/asio/detail/config.hpp
+++ b/asio/include/asio/detail/config.hpp
@@ -1153,4 +1153,31 @@
         //   || (defined(__MACH__) && defined(__APPLE__))
 #endif // !defined(ASIO_DISABLE_SSIZE_T)
 
+// Helper macros to manage the transition away from the old services-based API.
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+# define ASIO_SVC_TPARAM , typename Service
+# define ASIO_SVC_TPARAM_DEF1(d1) , typename Service d1
+# define ASIO_SVC_TPARAM_DEF2(d1, d2) , typename Service d1, d2
+# define ASIO_SVC_TARG , Service
+# define ASIO_SVC_T Service
+# define ASIO_SVC_TPARAM1 , typename Service1
+# define ASIO_SVC_TPARAM1_DEF1(d1) , typename Service1 d1
+# define ASIO_SVC_TPARAM1_DEF2(d1, d2) , typename Service1 d1, d2
+# define ASIO_SVC_TARG1 , Service1
+# define ASIO_SVC_T1 Service1
+# define ASIO_SVC_ACCESS public
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+# define ASIO_SVC_TPARAM
+# define ASIO_SVC_TPARAM_DEF1(d1)
+# define ASIO_SVC_TPARAM_DEF2(d1, d2)
+# define ASIO_SVC_TARG
+// ASIO_SVC_T is defined at each point of use.
+# define ASIO_SVC_TPARAM1
+# define ASIO_SVC_TPARAM1_DEF1(d1)
+# define ASIO_SVC_TPARAM1_DEF2(d1, d2)
+# define ASIO_SVC_TARG1
+// ASIO_SVC_T1 is defined at each point of use.
+# define ASIO_SVC_ACCESS protected
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
+
 #endif // ASIO_DETAIL_CONFIG_HPP
diff --git a/asio/include/asio/detail/deadline_timer_service.hpp b/asio/include/asio/detail/deadline_timer_service.hpp
index 13af0ff..f2caee0 100644
--- a/asio/include/asio/detail/deadline_timer_service.hpp
+++ b/asio/include/asio/detail/deadline_timer_service.hpp
@@ -26,6 +26,7 @@
 #include "asio/detail/socket_ops.hpp"
 #include "asio/detail/socket_types.hpp"
 #include "asio/detail/timer_queue.hpp"
+#include "asio/detail/timer_queue_ptime.hpp"
 #include "asio/detail/timer_scheduler.hpp"
 #include "asio/detail/wait_handler.hpp"
 #include "asio/detail/wait_op.hpp"
@@ -42,6 +43,7 @@
 
 template <typename Time_Traits>
 class deadline_timer_service
+  : public service_base<deadline_timer_service<Time_Traits> >
 {
 public:
   // The time type.
@@ -62,7 +64,8 @@
 
   // Constructor.
   deadline_timer_service(asio::io_context& io_context)
-    : scheduler_(asio::use_service<timer_scheduler>(io_context))
+    : service_base<deadline_timer_service<Time_Traits> >(io_context),
+      scheduler_(asio::use_service<timer_scheduler>(io_context))
   {
     scheduler_.init_task();
     scheduler_.add_timer_queue(timer_queue_);
@@ -170,6 +173,18 @@
     return impl.expiry;
   }
 
+  // Get the expiry time for the timer as an absolute time.
+  time_type expires_at(const implementation_type& impl) const
+  {
+    return impl.expiry;
+  }
+
+  // Get the expiry time for the timer relative to now.
+  duration_type expires_from_now(const implementation_type& impl) const
+  {
+    return Time_Traits::subtract(this->expiry(impl), Time_Traits::now());
+  }
+
   // Set the expiry time for the timer as an absolute time.
   std::size_t expires_at(implementation_type& impl,
       const time_type& expiry_time, asio::error_code& ec)
@@ -188,6 +203,14 @@
         Time_Traits::add(Time_Traits::now(), expiry_time), ec);
   }
 
+  // Set the expiry time for the timer relative to now.
+  std::size_t expires_from_now(implementation_type& impl,
+      const duration_type& expiry_time, asio::error_code& ec)
+  {
+    return expires_at(impl,
+        Time_Traits::add(Time_Traits::now(), expiry_time), ec);
+  }
+
   // Perform a blocking wait on the timer.
   void wait(implementation_type& impl, asio::error_code& ec)
   {
diff --git a/asio/include/asio/detail/descriptor_ops.hpp b/asio/include/asio/detail/descriptor_ops.hpp
index a620ec1..7706566 100644
--- a/asio/include/asio/detail/descriptor_ops.hpp
+++ b/asio/include/asio/detail/descriptor_ops.hpp
@@ -22,6 +22,7 @@
   && !defined(__CYGWIN__)
 
 #include <cstddef>
+#include "asio/error.hpp"
 #include "asio/error_code.hpp"
 #include "asio/detail/socket_types.hpp"
 
diff --git a/asio/include/asio/detail/impl/reactive_descriptor_service.ipp b/asio/include/asio/detail/impl/reactive_descriptor_service.ipp
index 849abe8..7f74c19 100644
--- a/asio/include/asio/detail/impl/reactive_descriptor_service.ipp
+++ b/asio/include/asio/detail/impl/reactive_descriptor_service.ipp
@@ -31,7 +31,8 @@
 
 reactive_descriptor_service::reactive_descriptor_service(
     asio::io_context& io_context)
-  : reactor_(asio::use_service<reactor>(io_context))
+  : service_base<reactive_descriptor_service>(io_context),
+    reactor_(asio::use_service<reactor>(io_context))
 {
   reactor_.init_task();
 }
diff --git a/asio/include/asio/detail/impl/reactive_serial_port_service.ipp b/asio/include/asio/detail/impl/reactive_serial_port_service.ipp
index d16c7cd..7756a7c 100644
--- a/asio/include/asio/detail/impl/reactive_serial_port_service.ipp
+++ b/asio/include/asio/detail/impl/reactive_serial_port_service.ipp
@@ -31,7 +31,8 @@
 
 reactive_serial_port_service::reactive_serial_port_service(
     asio::io_context& io_context)
-  : descriptor_service_(io_context)
+  : service_base<reactive_serial_port_service>(io_context),
+    descriptor_service_(io_context)
 {
 }
 
diff --git a/asio/include/asio/detail/impl/reactive_socket_service_base.ipp b/asio/include/asio/detail/impl/reactive_socket_service_base.ipp
index 2592093..9965945 100644
--- a/asio/include/asio/detail/impl/reactive_socket_service_base.ipp
+++ b/asio/include/asio/detail/impl/reactive_socket_service_base.ipp
@@ -35,7 +35,7 @@
   reactor_.init_task();
 }
 
-void reactive_socket_service_base::shutdown()
+void reactive_socket_service_base::base_shutdown()
 {
 }
 
diff --git a/asio/include/asio/detail/impl/resolver_service_base.ipp b/asio/include/asio/detail/impl/resolver_service_base.ipp
index 9b225b7..a55c4be 100644
--- a/asio/include/asio/detail/impl/resolver_service_base.ipp
+++ b/asio/include/asio/detail/impl/resolver_service_base.ipp
@@ -46,10 +46,10 @@
 
 resolver_service_base::~resolver_service_base()
 {
-  shutdown();
+  base_shutdown();
 }
 
-void resolver_service_base::shutdown()
+void resolver_service_base::base_shutdown()
 {
   work_.reset();
   if (work_io_context_.get())
@@ -64,7 +64,7 @@
   }
 }
 
-void resolver_service_base::notify_fork(
+void resolver_service_base::base_notify_fork(
     asio::io_context::fork_event fork_ev)
 {
   if (work_thread_.get())
diff --git a/asio/include/asio/detail/impl/signal_set_service.ipp b/asio/include/asio/detail/impl/signal_set_service.ipp
index f26fbe0..6492a5e 100644
--- a/asio/include/asio/detail/impl/signal_set_service.ipp
+++ b/asio/include/asio/detail/impl/signal_set_service.ipp
@@ -118,7 +118,8 @@
 
 signal_set_service::signal_set_service(
     asio::io_context& io_context)
-  : io_context_(asio::use_service<io_context_impl>(io_context)),
+  : service_base<signal_set_service>(io_context),
+    io_context_(asio::use_service<io_context_impl>(io_context)),
 #if !defined(ASIO_WINDOWS) \
   && !defined(ASIO_WINDOWS_RUNTIME) \
   && !defined(__CYGWIN__)
diff --git a/asio/include/asio/detail/impl/win_iocp_handle_service.ipp b/asio/include/asio/detail/impl/win_iocp_handle_service.ipp
index fbd7b94..f49d614 100644
--- a/asio/include/asio/detail/impl/win_iocp_handle_service.ipp
+++ b/asio/include/asio/detail/impl/win_iocp_handle_service.ipp
@@ -67,7 +67,8 @@
 
 win_iocp_handle_service::win_iocp_handle_service(
     asio::io_context& io_context)
-  : iocp_service_(asio::use_service<win_iocp_io_context>(io_context)),
+  : service_base<win_iocp_handle_service>(io_context),
+    iocp_service_(asio::use_service<win_iocp_io_context>(io_context)),
     mutex_(),
     impl_list_(0)
 {
diff --git a/asio/include/asio/detail/impl/win_iocp_serial_port_service.ipp b/asio/include/asio/detail/impl/win_iocp_serial_port_service.ipp
index 26a8e29..f4c556c 100644
--- a/asio/include/asio/detail/impl/win_iocp_serial_port_service.ipp
+++ b/asio/include/asio/detail/impl/win_iocp_serial_port_service.ipp
@@ -30,7 +30,8 @@
 
 win_iocp_serial_port_service::win_iocp_serial_port_service(
     asio::io_context& io_context)
-  : handle_service_(io_context)
+  : service_base<win_iocp_serial_port_service>(io_context),
+    handle_service_(io_context)
 {
 }
 
diff --git a/asio/include/asio/detail/impl/win_iocp_socket_service_base.ipp b/asio/include/asio/detail/impl/win_iocp_socket_service_base.ipp
index bae9702..fc0f836 100644
--- a/asio/include/asio/detail/impl/win_iocp_socket_service_base.ipp
+++ b/asio/include/asio/detail/impl/win_iocp_socket_service_base.ipp
@@ -37,7 +37,7 @@
 {
 }
 
-void win_iocp_socket_service_base::shutdown()
+void win_iocp_socket_service_base::base_shutdown()
 {
   // Close all implementations, causing all operations to complete.
   asio::detail::mutex::scoped_lock lock(mutex_);
diff --git a/asio/include/asio/detail/impl/win_object_handle_service.ipp b/asio/include/asio/detail/impl/win_object_handle_service.ipp
index 2e714b4..5a8291f 100644
--- a/asio/include/asio/detail/impl/win_object_handle_service.ipp
+++ b/asio/include/asio/detail/impl/win_object_handle_service.ipp
@@ -29,7 +29,8 @@
 
 win_object_handle_service::win_object_handle_service(
     asio::io_context& io_context)
-  : io_context_(asio::use_service<io_context_impl>(io_context)),
+  : service_base<win_object_handle_service>(io_context),
+    io_context_(asio::use_service<io_context_impl>(io_context)),
     mutex_(),
     impl_list_(0),
     shutdown_(false)
diff --git a/asio/include/asio/detail/impl/winrt_ssocket_service_base.ipp b/asio/include/asio/detail/impl/winrt_ssocket_service_base.ipp
index 4d75aaa..598d802 100644
--- a/asio/include/asio/detail/impl/winrt_ssocket_service_base.ipp
+++ b/asio/include/asio/detail/impl/winrt_ssocket_service_base.ipp
@@ -38,7 +38,7 @@
 {
 }
 
-void winrt_ssocket_service_base::shutdown()
+void winrt_ssocket_service_base::base_shutdown()
 {
   // Close all implementations, causing all operations to complete.
   asio::detail::mutex::scoped_lock lock(mutex_);
diff --git a/asio/include/asio/detail/null_socket_service.hpp b/asio/include/asio/detail/null_socket_service.hpp
index 0a5d945..8c6e40e 100644
--- a/asio/include/asio/detail/null_socket_service.hpp
+++ b/asio/include/asio/detail/null_socket_service.hpp
@@ -31,7 +31,8 @@
 namespace detail {
 
 template <typename Protocol>
-class null_socket_service
+class null_socket_service :
+  public service_base<null_socket_service<Protocol> >
 {
 public:
   // The protocol type.
@@ -50,7 +51,8 @@
 
   // Constructor.
   null_socket_service(asio::io_context& io_context)
-    : io_context_(io_context)
+    : service_base<null_socket_service<Protocol> >(io_context),
+      io_context_(io_context)
   {
   }
 
diff --git a/asio/include/asio/detail/reactive_descriptor_service.hpp b/asio/include/asio/detail/reactive_descriptor_service.hpp
index 5f37e16..6c915bf 100644
--- a/asio/include/asio/detail/reactive_descriptor_service.hpp
+++ b/asio/include/asio/detail/reactive_descriptor_service.hpp
@@ -41,7 +41,8 @@
 namespace asio {
 namespace detail {
 
-class reactive_descriptor_service
+class reactive_descriptor_service :
+  public service_base<reactive_descriptor_service>
 {
 public:
   // The native type of a descriptor.
diff --git a/asio/include/asio/detail/reactive_serial_port_service.hpp b/asio/include/asio/detail/reactive_serial_port_service.hpp
index e30a1fc..b121ebf 100644
--- a/asio/include/asio/detail/reactive_serial_port_service.hpp
+++ b/asio/include/asio/detail/reactive_serial_port_service.hpp
@@ -34,7 +34,8 @@
 namespace detail {
 
 // Extend reactive_descriptor_service to provide serial port support.
-class reactive_serial_port_service
+class reactive_serial_port_service :
+  public service_base<reactive_serial_port_service>
 {
 public:
   // The native type of a serial port.
diff --git a/asio/include/asio/detail/reactive_socket_service.hpp b/asio/include/asio/detail/reactive_socket_service.hpp
index 7994952..263adc8 100644
--- a/asio/include/asio/detail/reactive_socket_service.hpp
+++ b/asio/include/asio/detail/reactive_socket_service.hpp
@@ -45,6 +45,7 @@
 
 template <typename Protocol>
 class reactive_socket_service :
+  public service_base<reactive_socket_service<Protocol> >,
   public reactive_socket_service_base
 {
 public:
@@ -73,10 +74,17 @@
 
   // Constructor.
   reactive_socket_service(asio::io_context& io_context)
-    : reactive_socket_service_base(io_context)
+    : service_base<reactive_socket_service<Protocol> >(io_context),
+      reactive_socket_service_base(io_context)
   {
   }
 
+  // Destroy all user-defined handler objects owned by the service.
+  void shutdown()
+  {
+    this->base_shutdown();
+  }
+
   // Move-construct a new socket implementation.
   void move_construct(implementation_type& impl,
       implementation_type& other_impl)
@@ -194,6 +202,14 @@
     return endpoint;
   }
 
+  // Disable sends or receives on the socket.
+  asio::error_code shutdown(base_implementation_type& impl,
+      socket_base::shutdown_type what, asio::error_code& ec)
+  {
+    socket_ops::shutdown(impl.socket_, what, ec);
+    return ec;
+  }
+
   // Send a datagram to the specified endpoint. Returns the number of bytes
   // sent.
   template <typename ConstBufferSequence>
diff --git a/asio/include/asio/detail/reactive_socket_service_base.hpp b/asio/include/asio/detail/reactive_socket_service_base.hpp
index a938d9d..d79c7b1 100644
--- a/asio/include/asio/detail/reactive_socket_service_base.hpp
+++ b/asio/include/asio/detail/reactive_socket_service_base.hpp
@@ -66,7 +66,7 @@
       asio::io_context& io_context);
 
   // Destroy all user-defined handler objects owned by the service.
-  ASIO_DECL void shutdown();
+  ASIO_DECL void base_shutdown();
 
   // Construct a new socket implementation.
   ASIO_DECL void construct(base_implementation_type& impl);
@@ -163,14 +163,6 @@
     return ec;
   }
 
-  // Disable sends or receives on the socket.
-  asio::error_code shutdown(base_implementation_type& impl,
-      socket_base::shutdown_type what, asio::error_code& ec)
-  {
-    socket_ops::shutdown(impl.socket_, what, ec);
-    return ec;
-  }
-
   // Wait for the socket to become ready to read, ready to write, or to have
   // pending error conditions.
   asio::error_code wait(base_implementation_type& impl,
diff --git a/asio/include/asio/detail/resolver_service.hpp b/asio/include/asio/detail/resolver_service.hpp
index f1fc2b0..07525da 100644
--- a/asio/include/asio/detail/resolver_service.hpp
+++ b/asio/include/asio/detail/resolver_service.hpp
@@ -32,7 +32,9 @@
 namespace detail {
 
 template <typename Protocol>
-class resolver_service : public resolver_service_base
+class resolver_service :
+  public service_base<resolver_service<Protocol> >,
+  public resolver_service_base
 {
 public:
   // The implementation type of the resolver. A cancellation token is used to
@@ -50,10 +52,23 @@
 
   // Constructor.
   resolver_service(asio::io_context& io_context)
-    : resolver_service_base(io_context)
+    : service_base<resolver_service<Protocol> >(io_context),
+      resolver_service_base(io_context)
   {
   }
 
+  // Destroy all user-defined handler objects owned by the service.
+  void shutdown()
+  {
+    this->base_shutdown();
+  }
+
+  // Perform any fork-related housekeeping.
+  void notify_fork(asio::io_context::fork_event fork_ev)
+  {
+    this->base_notify_fork(fork_ev);
+  }
+
   // Resolve a query to a list of entries.
   results_type resolve(implementation_type&, const query_type& query,
       asio::error_code& ec)
diff --git a/asio/include/asio/detail/resolver_service_base.hpp b/asio/include/asio/detail/resolver_service_base.hpp
index fcd9bd1..329c490 100644
--- a/asio/include/asio/detail/resolver_service_base.hpp
+++ b/asio/include/asio/detail/resolver_service_base.hpp
@@ -45,10 +45,10 @@
   ASIO_DECL ~resolver_service_base();
 
   // Destroy all user-defined handler objects owned by the service.
-  ASIO_DECL void shutdown();
+  ASIO_DECL void base_shutdown();
 
   // Perform any fork-related housekeeping.
-  ASIO_DECL void notify_fork(
+  ASIO_DECL void base_notify_fork(
       asio::io_context::fork_event fork_ev);
 
   // Construct a new resolver implementation.
diff --git a/asio/include/asio/detail/signal_set_service.hpp b/asio/include/asio/detail/signal_set_service.hpp
index 6e498bb..71c839b 100644
--- a/asio/include/asio/detail/signal_set_service.hpp
+++ b/asio/include/asio/detail/signal_set_service.hpp
@@ -47,7 +47,8 @@
 
 extern "C" ASIO_DECL void asio_signal_handler(int signal_number);
 
-class signal_set_service
+class signal_set_service :
+  public service_base<signal_set_service>
 {
 public:
   // Type used for tracking an individual signal registration.
diff --git a/asio/include/asio/detail/win_iocp_handle_service.hpp b/asio/include/asio/detail/win_iocp_handle_service.hpp
index 02f84c2..b22e069 100644
--- a/asio/include/asio/detail/win_iocp_handle_service.hpp
+++ b/asio/include/asio/detail/win_iocp_handle_service.hpp
@@ -37,7 +37,8 @@
 namespace asio {
 namespace detail {
 
-class win_iocp_handle_service
+class win_iocp_handle_service :
+  public service_base<win_iocp_handle_service>
 {
 public:
   // The native type of a stream handle.
diff --git a/asio/include/asio/detail/win_iocp_serial_port_service.hpp b/asio/include/asio/detail/win_iocp_serial_port_service.hpp
index 3fa2da5..a1be499 100644
--- a/asio/include/asio/detail/win_iocp_serial_port_service.hpp
+++ b/asio/include/asio/detail/win_iocp_serial_port_service.hpp
@@ -31,7 +31,8 @@
 namespace detail {
 
 // Extend win_iocp_handle_service to provide serial port support.
-class win_iocp_serial_port_service
+class win_iocp_serial_port_service :
+  public service_base<win_iocp_serial_port_service>
 {
 public:
   // The native type of a serial port.
diff --git a/asio/include/asio/detail/win_iocp_socket_service.hpp b/asio/include/asio/detail/win_iocp_socket_service.hpp
index 1fdd98c..298ddf6 100644
--- a/asio/include/asio/detail/win_iocp_socket_service.hpp
+++ b/asio/include/asio/detail/win_iocp_socket_service.hpp
@@ -50,7 +50,9 @@
 namespace detail {
 
 template <typename Protocol>
-class win_iocp_socket_service : public win_iocp_socket_service_base
+class win_iocp_socket_service :
+  public service_base<win_iocp_socket_service<Protocol> >,
+  public win_iocp_socket_service_base
 {
 public:
   // The protocol type.
@@ -128,10 +130,17 @@
 
   // Constructor.
   win_iocp_socket_service(asio::io_context& io_context)
-    : win_iocp_socket_service_base(io_context)
+    : service_base<win_iocp_socket_service<Protocol> >(io_context),
+      win_iocp_socket_service_base(io_context)
   {
   }
 
+  // Destroy all user-defined handler objects owned by the service.
+  void shutdown()
+  {
+    this->base_shutdown();
+  }
+
   // Move-construct a new socket implementation.
   void move_construct(implementation_type& impl,
       implementation_type& other_impl)
@@ -277,6 +286,14 @@
     return endpoint;
   }
 
+  // Disable sends or receives on the socket.
+  asio::error_code shutdown(base_implementation_type& impl,
+      socket_base::shutdown_type what, asio::error_code& ec)
+  {
+    socket_ops::shutdown(impl.socket_, what, ec);
+    return ec;
+  }
+
   // Send a datagram to the specified endpoint. Returns the number of bytes
   // sent.
   template <typename ConstBufferSequence>
diff --git a/asio/include/asio/detail/win_iocp_socket_service_base.hpp b/asio/include/asio/detail/win_iocp_socket_service_base.hpp
index a98e8de..6675db5 100644
--- a/asio/include/asio/detail/win_iocp_socket_service_base.hpp
+++ b/asio/include/asio/detail/win_iocp_socket_service_base.hpp
@@ -89,7 +89,7 @@
       asio::io_context& io_context);
 
   // Destroy all user-defined handler objects owned by the service.
-  ASIO_DECL void shutdown();
+  ASIO_DECL void base_shutdown();
 
   // Construct a new socket implementation.
   ASIO_DECL void construct(base_implementation_type& impl);
@@ -180,14 +180,6 @@
     return ec;
   }
 
-  // Disable sends or receives on the socket.
-  asio::error_code shutdown(base_implementation_type& impl,
-      socket_base::shutdown_type what, asio::error_code& ec)
-  {
-    socket_ops::shutdown(impl.socket_, what, ec);
-    return ec;
-  }
-
   // Wait for the socket to become ready to read, ready to write, or to have
   // pending error conditions.
   asio::error_code wait(base_implementation_type& impl,
diff --git a/asio/include/asio/detail/win_object_handle_service.hpp b/asio/include/asio/detail/win_object_handle_service.hpp
index 4ee0963..69c2b29 100644
--- a/asio/include/asio/detail/win_object_handle_service.hpp
+++ b/asio/include/asio/detail/win_object_handle_service.hpp
@@ -31,7 +31,8 @@
 namespace asio {
 namespace detail {
 
-class win_object_handle_service
+class win_object_handle_service :
+  public service_base<win_object_handle_service>
 {
 public:
   // The native type of an object handle.
diff --git a/asio/include/asio/detail/winrt_resolver_service.hpp b/asio/include/asio/detail/winrt_resolver_service.hpp
index de7b8e3..68a133e 100644
--- a/asio/include/asio/detail/winrt_resolver_service.hpp
+++ b/asio/include/asio/detail/winrt_resolver_service.hpp
@@ -34,7 +34,8 @@
 namespace detail {
 
 template <typename Protocol>
-class winrt_resolver_service
+class winrt_resolver_service :
+  public service_base<winrt_resolver_service<Protocol> >
 {
 public:
   // The implementation type of the resolver. A cancellation token is used to
@@ -53,7 +54,8 @@
 
   // Constructor.
   winrt_resolver_service(asio::io_context& io_context)
-    : io_context_(use_service<io_context_impl>(io_context)),
+    : service_base<winrt_resolver_service<Protocol> >(io_context),
+      io_context_(use_service<io_context_impl>(io_context)),
       async_manager_(use_service<winrt_async_manager>(io_context))
   {
   }
diff --git a/asio/include/asio/detail/winrt_ssocket_service.hpp b/asio/include/asio/detail/winrt_ssocket_service.hpp
index fb97ea2..a062b06 100644
--- a/asio/include/asio/detail/winrt_ssocket_service.hpp
+++ b/asio/include/asio/detail/winrt_ssocket_service.hpp
@@ -33,6 +33,7 @@
 
 template <typename Protocol>
 class winrt_ssocket_service :
+  public service_base<winrt_ssocket_service<Protocol> >,
   public winrt_ssocket_service_base
 {
 public:
@@ -61,10 +62,17 @@
 
   // Constructor.
   winrt_ssocket_service(asio::io_context& io_context)
-    : winrt_ssocket_service_base(io_context)
+    : service_base<winrt_ssocket_service<Protocol> >(io_context),
+      winrt_ssocket_service_base(io_context)
   {
   }
 
+  // Destroy all user-defined handler objects owned by the service.
+  void shutdown()
+  {
+    this->base_shutdown();
+  }
+
   // Move-construct a new socket implementation.
   void move_construct(implementation_type& impl,
       implementation_type& other_impl)
diff --git a/asio/include/asio/detail/winrt_ssocket_service_base.hpp b/asio/include/asio/detail/winrt_ssocket_service_base.hpp
index 658494e..fe28314 100644
--- a/asio/include/asio/detail/winrt_ssocket_service_base.hpp
+++ b/asio/include/asio/detail/winrt_ssocket_service_base.hpp
@@ -65,7 +65,7 @@
       asio::io_context& io_context);
 
   // Destroy all user-defined handler objects owned by the service.
-  ASIO_DECL void shutdown();
+  ASIO_DECL void base_shutdown();
 
   // Construct a new socket implementation.
   ASIO_DECL void construct(base_implementation_type&);
diff --git a/asio/include/asio/impl/connect.hpp b/asio/include/asio/impl/connect.hpp
index 7da886f..f8e3860 100644
--- a/asio/include/asio/impl/connect.hpp
+++ b/asio/include/asio/impl/connect.hpp
@@ -44,8 +44,9 @@
   };
 }
 
-template <typename Protocol, typename SocketService, typename EndpointSequence>
-typename Protocol::endpoint connect(basic_socket<Protocol, SocketService>& s,
+template <typename Protocol ASIO_SVC_TPARAM, typename EndpointSequence>
+typename Protocol::endpoint connect(
+    basic_socket<Protocol ASIO_SVC_TARG>& s,
     const EndpointSequence& endpoints,
     typename enable_if<is_endpoint_sequence<
         EndpointSequence>::value>::type*)
@@ -56,8 +57,9 @@
   return result;
 }
 
-template <typename Protocol, typename SocketService, typename EndpointSequence>
-typename Protocol::endpoint connect(basic_socket<Protocol, SocketService>& s,
+template <typename Protocol ASIO_SVC_TPARAM, typename EndpointSequence>
+typename Protocol::endpoint connect(
+    basic_socket<Protocol ASIO_SVC_TARG>& s,
     const EndpointSequence& endpoints, asio::error_code& ec,
     typename enable_if<is_endpoint_sequence<
         EndpointSequence>::value>::type*)
@@ -69,8 +71,8 @@
 }
 
 #if !defined(ASIO_NO_DEPRECATED)
-template <typename Protocol, typename SocketService, typename Iterator>
-Iterator connect(basic_socket<Protocol, SocketService>& s, Iterator begin,
+template <typename Protocol ASIO_SVC_TPARAM, typename Iterator>
+Iterator connect(basic_socket<Protocol ASIO_SVC_TARG>& s, Iterator begin,
     typename enable_if<!is_endpoint_sequence<Iterator>::value>::type*)
 {
   asio::error_code ec;
@@ -79,8 +81,8 @@
   return result;
 }
 
-template <typename Protocol, typename SocketService, typename Iterator>
-inline Iterator connect(basic_socket<Protocol, SocketService>& s,
+template <typename Protocol ASIO_SVC_TPARAM, typename Iterator>
+inline Iterator connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
     Iterator begin, asio::error_code& ec,
     typename enable_if<!is_endpoint_sequence<Iterator>::value>::type*)
 {
@@ -88,8 +90,8 @@
 }
 #endif // !defined(ASIO_NO_DEPRECATED)
 
-template <typename Protocol, typename SocketService, typename Iterator>
-Iterator connect(basic_socket<Protocol, SocketService>& s,
+template <typename Protocol ASIO_SVC_TPARAM, typename Iterator>
+Iterator connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
     Iterator begin, Iterator end)
 {
   asio::error_code ec;
@@ -98,16 +100,17 @@
   return result;
 }
 
-template <typename Protocol, typename SocketService, typename Iterator>
-inline Iterator connect(basic_socket<Protocol, SocketService>& s,
+template <typename Protocol ASIO_SVC_TPARAM, typename Iterator>
+inline Iterator connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
     Iterator begin, Iterator end, asio::error_code& ec)
 {
   return connect(s, begin, end, detail::default_connect_condition(), ec);
 }
 
-template <typename Protocol, typename SocketService,
+template <typename Protocol ASIO_SVC_TPARAM,
     typename EndpointSequence, typename ConnectCondition>
-typename Protocol::endpoint connect(basic_socket<Protocol, SocketService>& s,
+typename Protocol::endpoint connect(
+    basic_socket<Protocol ASIO_SVC_TARG>& s,
     const EndpointSequence& endpoints, ConnectCondition connect_condition,
     typename enable_if<is_endpoint_sequence<
         EndpointSequence>::value>::type*)
@@ -119,9 +122,10 @@
   return result;
 }
 
-template <typename Protocol, typename SocketService,
+template <typename Protocol ASIO_SVC_TPARAM,
     typename EndpointSequence, typename ConnectCondition>
-typename Protocol::endpoint connect(basic_socket<Protocol, SocketService>& s,
+typename Protocol::endpoint connect(
+    basic_socket<Protocol ASIO_SVC_TARG>& s,
     const EndpointSequence& endpoints, ConnectCondition connect_condition,
     asio::error_code& ec,
     typename enable_if<is_endpoint_sequence<
@@ -133,9 +137,9 @@
 }
 
 #if !defined(ASIO_NO_DEPRECATED)
-template <typename Protocol, typename SocketService,
+template <typename Protocol ASIO_SVC_TPARAM,
     typename Iterator, typename ConnectCondition>
-Iterator connect(basic_socket<Protocol, SocketService>& s,
+Iterator connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
     Iterator begin, ConnectCondition connect_condition,
     typename enable_if<!is_endpoint_sequence<Iterator>::value>::type*)
 {
@@ -145,9 +149,9 @@
   return result;
 }
 
-template <typename Protocol, typename SocketService,
+template <typename Protocol ASIO_SVC_TPARAM,
     typename Iterator, typename ConnectCondition>
-inline Iterator connect(basic_socket<Protocol, SocketService>& s,
+inline Iterator connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
     Iterator begin, ConnectCondition connect_condition,
     asio::error_code& ec,
     typename enable_if<!is_endpoint_sequence<Iterator>::value>::type*)
@@ -156,9 +160,9 @@
 }
 #endif // !defined(ASIO_NO_DEPRECATED)
 
-template <typename Protocol, typename SocketService,
+template <typename Protocol ASIO_SVC_TPARAM,
     typename Iterator, typename ConnectCondition>
-Iterator connect(basic_socket<Protocol, SocketService>& s,
+Iterator connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
     Iterator begin, Iterator end, ConnectCondition connect_condition)
 {
   asio::error_code ec;
@@ -167,9 +171,9 @@
   return result;
 }
 
-template <typename Protocol, typename SocketService,
+template <typename Protocol ASIO_SVC_TPARAM,
     typename Iterator, typename ConnectCondition>
-Iterator connect(basic_socket<Protocol, SocketService>& s,
+Iterator connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
     Iterator begin, Iterator end, ConnectCondition connect_condition,
     asio::error_code& ec)
 {
@@ -233,13 +237,13 @@
     }
   };
 
-  template <typename Protocol, typename SocketService,
+  template <typename Protocol ASIO_SVC_TPARAM,
       typename EndpointSequence, typename ConnectCondition,
       typename RangeConnectHandler>
   class range_connect_op : base_from_connect_condition<ConnectCondition>
   {
   public:
-    range_connect_op(basic_socket<Protocol, SocketService>& sock,
+    range_connect_op(basic_socket<Protocol ASIO_SVC_TARG>& sock,
         const EndpointSequence& endpoints,
         const ConnectCondition& connect_condition,
         RangeConnectHandler& handler)
@@ -331,74 +335,74 @@
     }
 
   //private:
-    basic_socket<Protocol, SocketService>& socket_;
+    basic_socket<Protocol ASIO_SVC_TARG>& socket_;
     EndpointSequence endpoints_;
     std::size_t index_;
     int start_;
     RangeConnectHandler handler_;
   };
 
-  template <typename Protocol, typename SocketService,
+  template <typename Protocol ASIO_SVC_TPARAM,
       typename EndpointSequence, typename ConnectCondition,
       typename RangeConnectHandler>
   inline void* asio_handler_allocate(std::size_t size,
-      range_connect_op<Protocol, SocketService, EndpointSequence,
+      range_connect_op<Protocol ASIO_SVC_TARG, EndpointSequence,
         ConnectCondition, RangeConnectHandler>* this_handler)
   {
     return asio_handler_alloc_helpers::allocate(
         size, this_handler->handler_);
   }
 
-  template <typename Protocol, typename SocketService,
+  template <typename Protocol ASIO_SVC_TPARAM,
       typename EndpointSequence, typename ConnectCondition,
       typename RangeConnectHandler>
   inline void asio_handler_deallocate(void* pointer, std::size_t size,
-      range_connect_op<Protocol, SocketService, EndpointSequence,
+      range_connect_op<Protocol ASIO_SVC_TARG, EndpointSequence,
         ConnectCondition, RangeConnectHandler>* this_handler)
   {
     asio_handler_alloc_helpers::deallocate(
         pointer, size, this_handler->handler_);
   }
 
-  template <typename Protocol, typename SocketService,
+  template <typename Protocol ASIO_SVC_TPARAM,
       typename EndpointSequence, typename ConnectCondition,
       typename RangeConnectHandler>
   inline bool asio_handler_is_continuation(
-      range_connect_op<Protocol, SocketService, EndpointSequence,
+      range_connect_op<Protocol ASIO_SVC_TARG, EndpointSequence,
         ConnectCondition, RangeConnectHandler>* this_handler)
   {
     return asio_handler_cont_helpers::is_continuation(
         this_handler->handler_);
   }
 
-  template <typename Function, typename Protocol,
-      typename SocketService, typename EndpointSequence,
+  template <typename Function, typename Protocol
+      ASIO_SVC_TPARAM, typename EndpointSequence,
       typename ConnectCondition, typename RangeConnectHandler>
   inline void asio_handler_invoke(Function& function,
-      range_connect_op<Protocol, SocketService, EndpointSequence,
+      range_connect_op<Protocol ASIO_SVC_TARG, EndpointSequence,
         ConnectCondition, RangeConnectHandler>* this_handler)
   {
     asio_handler_invoke_helpers::invoke(
         function, this_handler->handler_);
   }
 
-  template <typename Function, typename Protocol,
-      typename SocketService, typename EndpointSequence,
+  template <typename Function, typename Protocol
+      ASIO_SVC_TPARAM, typename EndpointSequence,
       typename ConnectCondition, typename RangeConnectHandler>
   inline void asio_handler_invoke(const Function& function,
-      range_connect_op<Protocol, SocketService, EndpointSequence,
+      range_connect_op<Protocol ASIO_SVC_TARG, EndpointSequence,
         ConnectCondition, RangeConnectHandler>* this_handler)
   {
     asio_handler_invoke_helpers::invoke(
         function, this_handler->handler_);
   }
 
-  template <typename Protocol, typename SocketService, typename Iterator,
+  template <typename Protocol ASIO_SVC_TPARAM, typename Iterator,
       typename ConnectCondition, typename IteratorConnectHandler>
   class iterator_connect_op : base_from_connect_condition<ConnectCondition>
   {
   public:
-    iterator_connect_op(basic_socket<Protocol, SocketService>& sock,
+    iterator_connect_op(basic_socket<Protocol ASIO_SVC_TARG>& sock,
         const Iterator& begin, const Iterator& end,
         const ConnectCondition& connect_condition,
         IteratorConnectHandler& handler)
@@ -484,59 +488,59 @@
     }
 
   //private:
-    basic_socket<Protocol, SocketService>& socket_;
+    basic_socket<Protocol ASIO_SVC_TARG>& socket_;
     Iterator iter_;
     Iterator end_;
     int start_;
     IteratorConnectHandler handler_;
   };
 
-  template <typename Protocol, typename SocketService, typename Iterator,
+  template <typename Protocol ASIO_SVC_TPARAM, typename Iterator,
       typename ConnectCondition, typename IteratorConnectHandler>
   inline void* asio_handler_allocate(std::size_t size,
-      iterator_connect_op<Protocol, SocketService, Iterator,
+      iterator_connect_op<Protocol ASIO_SVC_TARG, Iterator,
         ConnectCondition, IteratorConnectHandler>* this_handler)
   {
     return asio_handler_alloc_helpers::allocate(
         size, this_handler->handler_);
   }
 
-  template <typename Protocol, typename SocketService, typename Iterator,
+  template <typename Protocol ASIO_SVC_TPARAM, typename Iterator,
       typename ConnectCondition, typename IteratorConnectHandler>
   inline void asio_handler_deallocate(void* pointer, std::size_t size,
-      iterator_connect_op<Protocol, SocketService, Iterator,
+      iterator_connect_op<Protocol ASIO_SVC_TARG, Iterator,
         ConnectCondition, IteratorConnectHandler>* this_handler)
   {
     asio_handler_alloc_helpers::deallocate(
         pointer, size, this_handler->handler_);
   }
 
-  template <typename Protocol, typename SocketService, typename Iterator,
+  template <typename Protocol ASIO_SVC_TPARAM, typename Iterator,
       typename ConnectCondition, typename IteratorConnectHandler>
   inline bool asio_handler_is_continuation(
-      iterator_connect_op<Protocol, SocketService, Iterator,
+      iterator_connect_op<Protocol ASIO_SVC_TARG, Iterator,
         ConnectCondition, IteratorConnectHandler>* this_handler)
   {
     return asio_handler_cont_helpers::is_continuation(
         this_handler->handler_);
   }
 
-  template <typename Function, typename Protocol,
-      typename SocketService, typename Iterator,
+  template <typename Function, typename Protocol
+      ASIO_SVC_TPARAM, typename Iterator,
       typename ConnectCondition, typename IteratorConnectHandler>
   inline void asio_handler_invoke(Function& function,
-      iterator_connect_op<Protocol, SocketService, Iterator,
+      iterator_connect_op<Protocol ASIO_SVC_TARG, Iterator,
         ConnectCondition, IteratorConnectHandler>* this_handler)
   {
     asio_handler_invoke_helpers::invoke(
         function, this_handler->handler_);
   }
 
-  template <typename Function, typename Protocol,
-      typename SocketService, typename Iterator,
+  template <typename Function, typename Protocol
+      ASIO_SVC_TPARAM, typename Iterator,
       typename ConnectCondition, typename IteratorConnectHandler>
   inline void asio_handler_invoke(const Function& function,
-      iterator_connect_op<Protocol, SocketService, Iterator,
+      iterator_connect_op<Protocol ASIO_SVC_TARG, Iterator,
         ConnectCondition, IteratorConnectHandler>* this_handler)
   {
     asio_handler_invoke_helpers::invoke(
@@ -546,11 +550,11 @@
 
 #if !defined(GENERATING_DOCUMENTATION)
 
-template <typename Protocol, typename SocketService,
+template <typename Protocol ASIO_SVC_TPARAM,
     typename EndpointSequence, typename ConnectCondition,
     typename RangeConnectHandler, typename Allocator>
 struct associated_allocator<
-    detail::range_connect_op<Protocol, SocketService,
+    detail::range_connect_op<Protocol ASIO_SVC_TARG,
       EndpointSequence, ConnectCondition, RangeConnectHandler>,
     Allocator>
 {
@@ -558,7 +562,7 @@
       RangeConnectHandler, Allocator>::type type;
 
   static type get(
-      const detail::range_connect_op<Protocol, SocketService,
+      const detail::range_connect_op<Protocol ASIO_SVC_TARG,
         EndpointSequence, ConnectCondition, RangeConnectHandler>& h,
       const Allocator& a = Allocator()) ASIO_NOEXCEPT
   {
@@ -567,11 +571,11 @@
   }
 };
 
-template <typename Protocol, typename SocketService,
+template <typename Protocol ASIO_SVC_TPARAM,
     typename EndpointSequence, typename ConnectCondition,
     typename RangeConnectHandler, typename Executor>
 struct associated_executor<
-    detail::range_connect_op<Protocol, SocketService,
+    detail::range_connect_op<Protocol ASIO_SVC_TARG,
       EndpointSequence, ConnectCondition, RangeConnectHandler>,
     Executor>
 {
@@ -579,7 +583,7 @@
       RangeConnectHandler, Executor>::type type;
 
   static type get(
-      const detail::range_connect_op<Protocol, SocketService,
+      const detail::range_connect_op<Protocol ASIO_SVC_TARG,
         EndpointSequence, ConnectCondition, RangeConnectHandler>& h,
       const Executor& ex = Executor()) ASIO_NOEXCEPT
   {
@@ -588,11 +592,11 @@
   }
 };
 
-template <typename Protocol, typename SocketService,
+template <typename Protocol ASIO_SVC_TPARAM,
     typename Iterator, typename ConnectCondition,
     typename IteratorConnectHandler, typename Allocator>
 struct associated_allocator<
-    detail::iterator_connect_op<Protocol, SocketService, Iterator,
+    detail::iterator_connect_op<Protocol ASIO_SVC_TARG, Iterator,
       ConnectCondition, IteratorConnectHandler>,
     Allocator>
 {
@@ -600,7 +604,7 @@
       IteratorConnectHandler, Allocator>::type type;
 
   static type get(
-      const detail::iterator_connect_op<Protocol, SocketService,
+      const detail::iterator_connect_op<Protocol ASIO_SVC_TARG,
         Iterator, ConnectCondition, IteratorConnectHandler>& h,
       const Allocator& a = Allocator()) ASIO_NOEXCEPT
   {
@@ -609,11 +613,11 @@
   }
 };
 
-template <typename Protocol, typename SocketService,
+template <typename Protocol ASIO_SVC_TPARAM,
     typename Iterator, typename ConnectCondition,
     typename IteratorConnectHandler, typename Executor>
 struct associated_executor<
-    detail::iterator_connect_op<Protocol, SocketService, Iterator,
+    detail::iterator_connect_op<Protocol ASIO_SVC_TARG, Iterator,
       ConnectCondition, IteratorConnectHandler>,
     Executor>
 {
@@ -621,7 +625,7 @@
       IteratorConnectHandler, Executor>::type type;
 
   static type get(
-      const detail::iterator_connect_op<Protocol, SocketService,
+      const detail::iterator_connect_op<Protocol ASIO_SVC_TARG,
         Iterator, ConnectCondition, IteratorConnectHandler>& h,
       const Executor& ex = Executor()) ASIO_NOEXCEPT
   {
@@ -632,11 +636,11 @@
 
 #endif // !defined(GENERATING_DOCUMENTATION)
 
-template <typename Protocol, typename SocketService,
+template <typename Protocol ASIO_SVC_TPARAM,
     typename EndpointSequence, typename RangeConnectHandler>
 inline ASIO_INITFN_RESULT_TYPE(RangeConnectHandler,
     void (asio::error_code, typename Protocol::endpoint))
-async_connect(basic_socket<Protocol, SocketService>& s,
+async_connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
     const EndpointSequence& endpoints,
     ASIO_MOVE_ARG(RangeConnectHandler) handler,
     typename enable_if<is_endpoint_sequence<
@@ -651,7 +655,7 @@
     void (asio::error_code, typename Protocol::endpoint)>
       init(handler);
 
-  detail::range_connect_op<Protocol, SocketService, EndpointSequence,
+  detail::range_connect_op<Protocol ASIO_SVC_TARG, EndpointSequence,
     detail::default_connect_condition,
       ASIO_HANDLER_TYPE(RangeConnectHandler,
         void (asio::error_code, typename Protocol::endpoint))>(s,
@@ -662,11 +666,11 @@
 }
 
 #if !defined(ASIO_NO_DEPRECATED)
-template <typename Protocol, typename SocketService,
+template <typename Protocol ASIO_SVC_TPARAM,
     typename Iterator, typename IteratorConnectHandler>
 inline ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler,
     void (asio::error_code, Iterator))
-async_connect(basic_socket<Protocol, SocketService>& s,
+async_connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
     Iterator begin, ASIO_MOVE_ARG(IteratorConnectHandler) handler,
     typename enable_if<!is_endpoint_sequence<Iterator>::value>::type*)
 {
@@ -678,7 +682,7 @@
   async_completion<IteratorConnectHandler,
     void (asio::error_code, Iterator)> init(handler);
 
-  detail::iterator_connect_op<Protocol, SocketService, Iterator,
+  detail::iterator_connect_op<Protocol ASIO_SVC_TARG, Iterator,
     detail::default_connect_condition, ASIO_HANDLER_TYPE(
       IteratorConnectHandler, void (asio::error_code, Iterator))>(s,
         begin, Iterator(), detail::default_connect_condition(), init.handler)(
@@ -688,11 +692,11 @@
 }
 #endif // !defined(ASIO_NO_DEPRECATED)
 
-template <typename Protocol, typename SocketService,
+template <typename Protocol ASIO_SVC_TPARAM,
     typename Iterator, typename IteratorConnectHandler>
 inline ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler,
     void (asio::error_code, Iterator))
-async_connect(basic_socket<Protocol, SocketService>& s,
+async_connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
     Iterator begin, Iterator end,
     ASIO_MOVE_ARG(IteratorConnectHandler) handler)
 {
@@ -704,7 +708,7 @@
   async_completion<IteratorConnectHandler,
     void (asio::error_code, Iterator)> init(handler);
 
-  detail::iterator_connect_op<Protocol, SocketService, Iterator,
+  detail::iterator_connect_op<Protocol ASIO_SVC_TARG, Iterator,
     detail::default_connect_condition, ASIO_HANDLER_TYPE(
       IteratorConnectHandler, void (asio::error_code, Iterator))>(s,
         begin, end, detail::default_connect_condition(), init.handler)(
@@ -713,11 +717,11 @@
   return init.result.get();
 }
 
-template <typename Protocol, typename SocketService, typename EndpointSequence,
+template <typename Protocol ASIO_SVC_TPARAM, typename EndpointSequence,
     typename ConnectCondition, typename RangeConnectHandler>
 inline ASIO_INITFN_RESULT_TYPE(RangeConnectHandler,
     void (asio::error_code, typename Protocol::endpoint))
-async_connect(basic_socket<Protocol, SocketService>& s,
+async_connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
     const EndpointSequence& endpoints, ConnectCondition connect_condition,
     ASIO_MOVE_ARG(RangeConnectHandler) handler,
     typename enable_if<is_endpoint_sequence<
@@ -732,7 +736,7 @@
     void (asio::error_code, typename Protocol::endpoint)>
       init(handler);
 
-  detail::range_connect_op<Protocol, SocketService, EndpointSequence,
+  detail::range_connect_op<Protocol ASIO_SVC_TARG, EndpointSequence,
     ConnectCondition, ASIO_HANDLER_TYPE(RangeConnectHandler,
       void (asio::error_code, typename Protocol::endpoint))>(s,
         endpoints, connect_condition, init.handler)(
@@ -742,11 +746,11 @@
 }
 
 #if !defined(ASIO_NO_DEPRECATED)
-template <typename Protocol, typename SocketService, typename Iterator,
+template <typename Protocol ASIO_SVC_TPARAM, typename Iterator,
     typename ConnectCondition, typename IteratorConnectHandler>
 inline ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler,
     void (asio::error_code, Iterator))
-async_connect(basic_socket<Protocol, SocketService>& s,
+async_connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
     Iterator begin, ConnectCondition connect_condition,
     ASIO_MOVE_ARG(IteratorConnectHandler) handler,
     typename enable_if<!is_endpoint_sequence<Iterator>::value>::type*)
@@ -759,7 +763,7 @@
   async_completion<IteratorConnectHandler,
     void (asio::error_code, Iterator)> init(handler);
 
-  detail::iterator_connect_op<Protocol, SocketService, Iterator,
+  detail::iterator_connect_op<Protocol ASIO_SVC_TARG, Iterator,
     ConnectCondition, ASIO_HANDLER_TYPE(
       IteratorConnectHandler, void (asio::error_code, Iterator))>(s,
         begin, Iterator(), connect_condition, init.handler)(
@@ -769,11 +773,11 @@
 }
 #endif // !defined(ASIO_NO_DEPRECATED)
 
-template <typename Protocol, typename SocketService, typename Iterator,
+template <typename Protocol ASIO_SVC_TPARAM, typename Iterator,
     typename ConnectCondition, typename IteratorConnectHandler>
 inline ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler,
     void (asio::error_code, Iterator))
-async_connect(basic_socket<Protocol, SocketService>& s,
+async_connect(basic_socket<Protocol ASIO_SVC_TARG>& s,
     Iterator begin, Iterator end, ConnectCondition connect_condition,
     ASIO_MOVE_ARG(IteratorConnectHandler) handler)
 {
@@ -785,7 +789,7 @@
   async_completion<IteratorConnectHandler,
     void (asio::error_code, Iterator)> init(handler);
 
-  detail::iterator_connect_op<Protocol, SocketService, Iterator,
+  detail::iterator_connect_op<Protocol ASIO_SVC_TARG, Iterator,
     ConnectCondition, ASIO_HANDLER_TYPE(
       IteratorConnectHandler, void (asio::error_code, Iterator))>(s,
         begin, end, connect_condition, init.handler)(
diff --git a/asio/include/asio/ip/basic_resolver.hpp b/asio/include/asio/ip/basic_resolver.hpp
index 75e93df..23c5ad8 100644
--- a/asio/include/asio/ip/basic_resolver.hpp
+++ b/asio/include/asio/ip/basic_resolver.hpp
@@ -17,15 +17,30 @@
 
 #include "asio/detail/config.hpp"
 #include <string>
+#include "asio/async_result.hpp"
 #include "asio/basic_io_object.hpp"
 #include "asio/detail/handler_type_requirements.hpp"
 #include "asio/detail/throw_error.hpp"
 #include "asio/error.hpp"
+#include "asio/io_context.hpp"
 #include "asio/ip/basic_resolver_iterator.hpp"
 #include "asio/ip/basic_resolver_query.hpp"
 #include "asio/ip/basic_resolver_results.hpp"
 #include "asio/ip/resolver_base.hpp"
-#include "asio/ip/resolver_service.hpp"
+
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+# include "asio/ip/resolver_service.hpp"
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+# if defined(ASIO_WINDOWS_RUNTIME)
+#  include "asio/detail/winrt_resolver_service.hpp"
+#  define ASIO_SVC_T \
+    asio::detail::winrt_resolver_service<InternetProtocol>
+# else
+#  include "asio/detail/resolver_service.hpp"
+#  define ASIO_SVC_T \
+    asio::detail::resolver_service<InternetProtocol>
+# endif
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
 
 #include "asio/detail/push_options.hpp"
 
@@ -41,13 +56,16 @@
  * @e Distinct @e objects: Safe.@n
  * @e Shared @e objects: Unsafe.
  */
-template <typename InternetProtocol,
-    typename ResolverService = resolver_service<InternetProtocol> >
+template <typename InternetProtocol
+    ASIO_SVC_TPARAM_DEF1(= resolver_service<InternetProtocol>)>
 class basic_resolver
-  : public basic_io_object<ResolverService>,
+  : ASIO_SVC_ACCESS basic_io_object<ASIO_SVC_T>,
     public resolver_base
 {
 public:
+  /// The type of the executor associated with the object.
+  typedef io_context::executor_type executor_type;
+
   /// The protocol type.
   typedef InternetProtocol protocol_type;
 
@@ -73,10 +91,60 @@
    * dispatch handlers for any asynchronous operations performed on the timer.
    */
   explicit basic_resolver(asio::io_context& io_context)
-    : basic_io_object<ResolverService>(io_context)
+    : basic_io_object<ASIO_SVC_T>(io_context)
   {
   }
 
+  /// Destroys the resolver.
+  /**
+   * This function destroys the resolver, cancelling any outstanding
+   * asynchronous wait operations associated with the resolver as if by calling
+   * @c cancel.
+   */
+  ~basic_resolver()
+  {
+  }
+
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+  // These functions are provided by basic_io_object<>.
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+#if !defined(ASIO_NO_DEPRECATED)
+  /// (Deprecated: Use get_executor().) Get the io_context associated with the
+  /// object.
+  /**
+   * This function may be used to obtain the io_context object that the I/O
+   * object uses to dispatch handlers for asynchronous operations.
+   *
+   * @return A reference to the io_context object that the I/O object will use
+   * to dispatch handlers. Ownership is not transferred to the caller.
+   */
+  asio::io_context& get_io_context()
+  {
+    return basic_io_object<ASIO_SVC_T>::get_io_context();
+  }
+
+  /// (Deprecated: Use get_executor().) Get the io_context associated with the
+  /// object.
+  /**
+   * This function may be used to obtain the io_context object that the I/O
+   * object uses to dispatch handlers for asynchronous operations.
+   *
+   * @return A reference to the io_context object that the I/O object will use
+   * to dispatch handlers. Ownership is not transferred to the caller.
+   */
+  asio::io_context& get_io_service()
+  {
+    return basic_io_object<ASIO_SVC_T>::get_io_service();
+  }
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+  /// Get the executor associated with the object.
+  executor_type get_executor() ASIO_NOEXCEPT
+  {
+    return basic_io_object<ASIO_SVC_T>::get_executor();
+  }
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
+
   /// Cancel any asynchronous operations that are waiting on the resolver.
   /**
    * This function forces the completion of any pending asynchronous
@@ -517,8 +585,18 @@
     ASIO_RESOLVE_HANDLER_CHECK(
         ResolveHandler, handler, results_type) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_resolve(this->get_implementation(), q,
         ASIO_MOVE_CAST(ResolveHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    asio::async_completion<ResolveHandler,
+      void (asio::error_code, results_type)> init(handler);
+
+    this->get_service().async_resolve(
+        this->get_implementation(), q, init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 #endif // !defined(ASIO_NO_DEPRECATED)
 
@@ -633,8 +711,19 @@
         ResolveHandler, handler, results_type) type_check;
 
     basic_resolver_query<protocol_type> q(host, service, resolve_flags);
+
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_resolve(this->get_implementation(), q,
         ASIO_MOVE_CAST(ResolveHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    asio::async_completion<ResolveHandler,
+      void (asio::error_code, results_type)> init(handler);
+
+    this->get_service().async_resolve(
+        this->get_implementation(), q, init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 
   /// Asynchronously perform forward resolution of a query to a list of entries.
@@ -755,8 +844,19 @@
 
     basic_resolver_query<protocol_type> q(
         protocol, host, service, resolve_flags);
+
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_resolve(this->get_implementation(), q,
         ASIO_MOVE_CAST(ResolveHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    asio::async_completion<ResolveHandler,
+      void (asio::error_code, results_type)> init(handler);
+
+    this->get_service().async_resolve(
+        this->get_implementation(), q, init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 
   /// Perform reverse resolution of an endpoint to a list of entries.
@@ -836,8 +936,18 @@
     ASIO_RESOLVE_HANDLER_CHECK(
         ResolveHandler, handler, results_type) type_check;
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
     return this->get_service().async_resolve(this->get_implementation(), e,
         ASIO_MOVE_CAST(ResolveHandler)(handler));
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+    asio::async_completion<ResolveHandler,
+      void (asio::error_code, results_type)> init(handler);
+
+    this->get_service().async_resolve(
+        this->get_implementation(), e, init.handler);
+
+    return init.result.get();
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
   }
 };
 
@@ -846,4 +956,8 @@
 
 #include "asio/detail/pop_options.hpp"
 
+#if !defined(ASIO_ENABLE_OLD_SERVICES)
+# undef ASIO_SVC_T
+#endif // !defined(ASIO_ENABLE_OLD_SERVICES)
+
 #endif // ASIO_IP_BASIC_RESOLVER_HPP
diff --git a/asio/include/asio/ip/resolver_service.hpp b/asio/include/asio/ip/resolver_service.hpp
index c310851..eb80b16 100644
--- a/asio/include/asio/ip/resolver_service.hpp
+++ b/asio/include/asio/ip/resolver_service.hpp
@@ -16,6 +16,9 @@
 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
 
 #include "asio/detail/config.hpp"
+
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+
 #include "asio/async_result.hpp"
 #include "asio/error_code.hpp"
 #include "asio/io_context.hpp"
@@ -175,4 +178,6 @@
 
 #include "asio/detail/pop_options.hpp"
 
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
+
 #endif // ASIO_IP_RESOLVER_SERVICE_HPP
diff --git a/asio/include/asio/local/connect_pair.hpp b/asio/include/asio/local/connect_pair.hpp
index 2d785d5..31d5e35 100644
--- a/asio/include/asio/local/connect_pair.hpp
+++ b/asio/include/asio/local/connect_pair.hpp
@@ -32,32 +32,32 @@
 namespace local {
 
 /// Create a pair of connected sockets.
-template <typename Protocol, typename SocketService1, typename SocketService2>
+template <typename Protocol ASIO_SVC_TPARAM ASIO_SVC_TPARAM1>
 void connect_pair(
-    basic_socket<Protocol, SocketService1>& socket1,
-    basic_socket<Protocol, SocketService2>& socket2);
+    basic_socket<Protocol ASIO_SVC_TARG>& socket1,
+    basic_socket<Protocol ASIO_SVC_TARG1>& socket2);
 
 /// Create a pair of connected sockets.
-template <typename Protocol, typename SocketService1, typename SocketService2>
+template <typename Protocol ASIO_SVC_TPARAM ASIO_SVC_TPARAM1>
 asio::error_code connect_pair(
-    basic_socket<Protocol, SocketService1>& socket1,
-    basic_socket<Protocol, SocketService2>& socket2,
+    basic_socket<Protocol ASIO_SVC_TARG>& socket1,
+    basic_socket<Protocol ASIO_SVC_TARG1>& socket2,
     asio::error_code& ec);
 
-template <typename Protocol, typename SocketService1, typename SocketService2>
+template <typename Protocol ASIO_SVC_TPARAM ASIO_SVC_TPARAM1>
 inline void connect_pair(
-    basic_socket<Protocol, SocketService1>& socket1,
-    basic_socket<Protocol, SocketService2>& socket2)
+    basic_socket<Protocol ASIO_SVC_TARG>& socket1,
+    basic_socket<Protocol ASIO_SVC_TARG1>& socket2)
 {
   asio::error_code ec;
   connect_pair(socket1, socket2, ec);
   asio::detail::throw_error(ec, "connect_pair");
 }
 
-template <typename Protocol, typename SocketService1, typename SocketService2>
+template <typename Protocol ASIO_SVC_TPARAM ASIO_SVC_TPARAM1>
 inline asio::error_code connect_pair(
-    basic_socket<Protocol, SocketService1>& socket1,
-    basic_socket<Protocol, SocketService2>& socket2,
+    basic_socket<Protocol ASIO_SVC_TARG>& socket1,
+    basic_socket<Protocol ASIO_SVC_TARG1>& socket2,
     asio::error_code& ec)
 {
   // Check that this function is only being used with a UNIX domain socket.
diff --git a/asio/include/asio/posix/basic_descriptor.hpp b/asio/include/asio/posix/basic_descriptor.hpp
index c471747..24c3e43 100644
--- a/asio/include/asio/posix/basic_descriptor.hpp
+++ b/asio/include/asio/posix/basic_descriptor.hpp
@@ -17,6 +17,8 @@
 
 #include "asio/detail/config.hpp"
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+
 #if defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) \
   || defined(GENERATING_DOCUMENTATION)
 
@@ -570,4 +572,6 @@
 #endif // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
        //   || defined(GENERATING_DOCUMENTATION)
 
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
+
 #endif // ASIO_POSIX_BASIC_DESCRIPTOR_HPP
diff --git a/asio/include/asio/posix/basic_stream_descriptor.hpp b/asio/include/asio/posix/basic_stream_descriptor.hpp
index b81f7ee..e0461bd 100644
--- a/asio/include/asio/posix/basic_stream_descriptor.hpp
+++ b/asio/include/asio/posix/basic_stream_descriptor.hpp
@@ -17,6 +17,8 @@
 
 #include "asio/detail/config.hpp"
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+
 #if defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) \
   || defined(GENERATING_DOCUMENTATION)
 
@@ -355,4 +357,6 @@
 #endif // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
        //   || defined(GENERATING_DOCUMENTATION)
 
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
+
 #endif // ASIO_POSIX_BASIC_STREAM_DESCRIPTOR_HPP
diff --git a/asio/include/asio/posix/descriptor.hpp b/asio/include/asio/posix/descriptor.hpp
new file mode 100644
index 0000000..cc32536
--- /dev/null
+++ b/asio/include/asio/posix/descriptor.hpp
@@ -0,0 +1,639 @@
+//
+// posix/descriptor.hpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_POSIX_DESCRIPTOR_HPP
+#define ASIO_POSIX_DESCRIPTOR_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+
+#if !defined(ASIO_ENABLE_OLD_SERVICES)
+
+#if defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) \
+  || defined(GENERATING_DOCUMENTATION)
+
+#include "asio/async_result.hpp"
+#include "asio/basic_io_object.hpp"
+#include "asio/detail/handler_type_requirements.hpp"
+#include "asio/detail/reactive_descriptor_service.hpp"
+#include "asio/detail/throw_error.hpp"
+#include "asio/error.hpp"
+#include "asio/io_context.hpp"
+#include "asio/posix/descriptor_base.hpp"
+
+#if defined(ASIO_HAS_MOVE)
+# include <utility>
+#endif // defined(ASIO_HAS_MOVE)
+
+#define ASIO_SVC_T asio::detail::reactive_descriptor_service
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace posix {
+
+/// Provides POSIX descriptor functionality.
+/**
+ * The posix::descriptor class template provides the ability to wrap a
+ * POSIX descriptor.
+ *
+ * @par Thread Safety
+ * @e Distinct @e objects: Safe.@n
+ * @e Shared @e objects: Unsafe.
+ */
+class descriptor
+  : ASIO_SVC_ACCESS basic_io_object<ASIO_SVC_T>,
+    public descriptor_base
+{
+public:
+  /// The type of the executor associated with the object.
+  typedef io_context::executor_type executor_type;
+
+  /// The native representation of a descriptor.
+#if defined(GENERATING_DOCUMENTATION)
+  typedef implementation_defined native_handle_type;
+#else
+  typedef ASIO_SVC_T::native_handle_type native_handle_type;
+#endif
+
+  /// A descriptor is always the lowest layer.
+  typedef descriptor lowest_layer_type;
+
+  /// Construct a descriptor without opening it.
+  /**
+   * This constructor creates a descriptor without opening it.
+   *
+   * @param io_context The io_context object that the descriptor will use to
+   * dispatch handlers for any asynchronous operations performed on the
+   * descriptor.
+   */
+  explicit descriptor(asio::io_context& io_context)
+    : basic_io_object<ASIO_SVC_T>(io_context)
+  {
+  }
+
+  /// Construct a descriptor on an existing native descriptor.
+  /**
+   * This constructor creates a descriptor object to hold an existing native
+   * descriptor.
+   *
+   * @param io_context The io_context object that the descriptor will use to
+   * dispatch handlers for any asynchronous operations performed on the
+   * descriptor.
+   *
+   * @param native_descriptor A native descriptor.
+   *
+   * @throws asio::system_error Thrown on failure.
+   */
+  descriptor(asio::io_context& io_context,
+      const native_handle_type& native_descriptor)
+    : basic_io_object<ASIO_SVC_T>(io_context)
+  {
+    asio::error_code ec;
+    this->get_service().assign(this->get_implementation(),
+        native_descriptor, ec);
+    asio::detail::throw_error(ec, "assign");
+  }
+
+#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+  /// Move-construct a descriptor from another.
+  /**
+   * This constructor moves a descriptor from one object to another.
+   *
+   * @param other The other descriptor object from which the move will
+   * occur.
+   *
+   * @note Following the move, the moved-from object is in the same state as if
+   * constructed using the @c descriptor(io_context&) constructor.
+   */
+  descriptor(descriptor&& other)
+    : basic_io_object<ASIO_SVC_T>(std::move(other))
+  {
+  }
+
+  /// Move-assign a descriptor from another.
+  /**
+   * This assignment operator moves a descriptor from one object to another.
+   *
+   * @param other The other descriptor object from which the move will
+   * occur.
+   *
+   * @note Following the move, the moved-from object is in the same state as if
+   * constructed using the @c descriptor(io_context&) constructor.
+   */
+  descriptor& operator=(descriptor&& other)
+  {
+    basic_io_object<ASIO_SVC_T>::operator=(std::move(other));
+    return *this;
+  }
+#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+
+#if !defined(ASIO_NO_DEPRECATED)
+  /// (Deprecated: Use get_executor().) Get the io_context associated with the
+  /// object.
+  /**
+   * This function may be used to obtain the io_context object that the I/O
+   * object uses to dispatch handlers for asynchronous operations.
+   *
+   * @return A reference to the io_context object that the I/O object will use
+   * to dispatch handlers. Ownership is not transferred to the caller.
+   */
+  asio::io_context& get_io_context()
+  {
+    return basic_io_object<ASIO_SVC_T>::get_io_context();
+  }
+
+  /// (Deprecated: Use get_executor().) Get the io_context associated with the
+  /// object.
+  /**
+   * This function may be used to obtain the io_context object that the I/O
+   * object uses to dispatch handlers for asynchronous operations.
+   *
+   * @return A reference to the io_context object that the I/O object will use
+   * to dispatch handlers. Ownership is not transferred to the caller.
+   */
+  asio::io_context& get_io_service()
+  {
+    return basic_io_object<ASIO_SVC_T>::get_io_service();
+  }
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+  /// Get the executor associated with the object.
+  executor_type get_executor() ASIO_NOEXCEPT
+  {
+    return basic_io_object<ASIO_SVC_T>::get_executor();
+  }
+
+  /// Get a reference to the lowest layer.
+  /**
+   * This function returns a reference to the lowest layer in a stack of
+   * layers. Since a descriptor cannot contain any further layers, it
+   * simply returns a reference to itself.
+   *
+   * @return A reference to the lowest layer in the stack of layers. Ownership
+   * is not transferred to the caller.
+   */
+  lowest_layer_type& lowest_layer()
+  {
+    return *this;
+  }
+
+  /// Get a const reference to the lowest layer.
+  /**
+   * This function returns a const reference to the lowest layer in a stack of
+   * layers. Since a descriptor cannot contain any further layers, it
+   * simply returns a reference to itself.
+   *
+   * @return A const reference to the lowest layer in the stack of layers.
+   * Ownership is not transferred to the caller.
+   */
+  const lowest_layer_type& lowest_layer() const
+  {
+    return *this;
+  }
+
+  /// Assign an existing native descriptor to the descriptor.
+  /*
+   * This function opens the descriptor to hold an existing native descriptor.
+   *
+   * @param native_descriptor A native descriptor.
+   *
+   * @throws asio::system_error Thrown on failure.
+   */
+  void assign(const native_handle_type& native_descriptor)
+  {
+    asio::error_code ec;
+    this->get_service().assign(this->get_implementation(),
+        native_descriptor, ec);
+    asio::detail::throw_error(ec, "assign");
+  }
+
+  /// Assign an existing native descriptor to the descriptor.
+  /*
+   * This function opens the descriptor to hold an existing native descriptor.
+   *
+   * @param native_descriptor A native descriptor.
+   *
+   * @param ec Set to indicate what error occurred, if any.
+   */
+  asio::error_code assign(const native_handle_type& native_descriptor,
+      asio::error_code& ec)
+  {
+    return this->get_service().assign(
+        this->get_implementation(), native_descriptor, ec);
+  }
+
+  /// Determine whether the descriptor is open.
+  bool is_open() const
+  {
+    return this->get_service().is_open(this->get_implementation());
+  }
+
+  /// Close the descriptor.
+  /**
+   * This function is used to close the descriptor. Any asynchronous read or
+   * write operations will be cancelled immediately, and will complete with the
+   * asio::error::operation_aborted error.
+   *
+   * @throws asio::system_error Thrown on failure. Note that, even if
+   * the function indicates an error, the underlying descriptor is closed.
+   */
+  void close()
+  {
+    asio::error_code ec;
+    this->get_service().close(this->get_implementation(), ec);
+    asio::detail::throw_error(ec, "close");
+  }
+
+  /// Close the descriptor.
+  /**
+   * This function is used to close the descriptor. Any asynchronous read or
+   * write operations will be cancelled immediately, and will complete with the
+   * asio::error::operation_aborted error.
+   *
+   * @param ec Set to indicate what error occurred, if any. Note that, even if
+   * the function indicates an error, the underlying descriptor is closed.
+   */
+  asio::error_code close(asio::error_code& ec)
+  {
+    return this->get_service().close(this->get_implementation(), ec);
+  }
+
+  /// Get the native descriptor representation.
+  /**
+   * This function may be used to obtain the underlying representation of the
+   * descriptor. This is intended to allow access to native descriptor
+   * functionality that is not otherwise provided.
+   */
+  native_handle_type native_handle()
+  {
+    return this->get_service().native_handle(this->get_implementation());
+  }
+
+  /// Release ownership of the native descriptor implementation.
+  /**
+   * This function may be used to obtain the underlying representation of the
+   * descriptor. After calling this function, @c is_open() returns false. The
+   * caller is responsible for closing the descriptor.
+   *
+   * All outstanding asynchronous read or write operations will finish
+   * immediately, and the handlers for cancelled operations will be passed the
+   * asio::error::operation_aborted error.
+   */
+  native_handle_type release()
+  {
+    return this->get_service().release(this->get_implementation());
+  }
+
+  /// Cancel all asynchronous operations associated with the descriptor.
+  /**
+   * This function causes all outstanding asynchronous read or write operations
+   * to finish immediately, and the handlers for cancelled operations will be
+   * passed the asio::error::operation_aborted error.
+   *
+   * @throws asio::system_error Thrown on failure.
+   */
+  void cancel()
+  {
+    asio::error_code ec;
+    this->get_service().cancel(this->get_implementation(), ec);
+    asio::detail::throw_error(ec, "cancel");
+  }
+
+  /// Cancel all asynchronous operations associated with the descriptor.
+  /**
+   * This function causes all outstanding asynchronous read or write operations
+   * to finish immediately, and the handlers for cancelled operations will be
+   * passed the asio::error::operation_aborted error.
+   *
+   * @param ec Set to indicate what error occurred, if any.
+   */
+  asio::error_code cancel(asio::error_code& ec)
+  {
+    return this->get_service().cancel(this->get_implementation(), ec);
+  }
+
+  /// Perform an IO control command on the descriptor.
+  /**
+   * This function is used to execute an IO control command on the descriptor.
+   *
+   * @param command The IO control command to be performed on the descriptor.
+   *
+   * @throws asio::system_error Thrown on failure.
+   *
+   * @sa IoControlCommand @n
+   * asio::posix::descriptor_base::bytes_readable @n
+   * asio::posix::descriptor_base::non_blocking_io
+   *
+   * @par Example
+   * Getting the number of bytes ready to read:
+   * @code
+   * asio::posix::stream_descriptor descriptor(io_context);
+   * ...
+   * asio::posix::stream_descriptor::bytes_readable command;
+   * descriptor.io_control(command);
+   * std::size_t bytes_readable = command.get();
+   * @endcode
+   */
+  template <typename IoControlCommand>
+  void io_control(IoControlCommand& command)
+  {
+    asio::error_code ec;
+    this->get_service().io_control(this->get_implementation(), command, ec);
+    asio::detail::throw_error(ec, "io_control");
+  }
+
+  /// Perform an IO control command on the descriptor.
+  /**
+   * This function is used to execute an IO control command on the descriptor.
+   *
+   * @param command The IO control command to be performed on the descriptor.
+   *
+   * @param ec Set to indicate what error occurred, if any.
+   *
+   * @sa IoControlCommand @n
+   * asio::posix::descriptor_base::bytes_readable @n
+   * asio::posix::descriptor_base::non_blocking_io
+   *
+   * @par Example
+   * Getting the number of bytes ready to read:
+   * @code
+   * asio::posix::stream_descriptor descriptor(io_context);
+   * ...
+   * asio::posix::stream_descriptor::bytes_readable command;
+   * asio::error_code ec;
+   * descriptor.io_control(command, ec);
+   * if (ec)
+   * {
+   *   // An error occurred.
+   * }
+   * std::size_t bytes_readable = command.get();
+   * @endcode
+   */
+  template <typename IoControlCommand>
+  asio::error_code io_control(IoControlCommand& command,
+      asio::error_code& ec)
+  {
+    return this->get_service().io_control(
+        this->get_implementation(), command, ec);
+  }
+
+  /// Gets the non-blocking mode of the descriptor.
+  /**
+   * @returns @c true if the descriptor's synchronous operations will fail with
+   * asio::error::would_block if they are unable to perform the requested
+   * operation immediately. If @c false, synchronous operations will block
+   * until complete.
+   *
+   * @note The non-blocking mode has no effect on the behaviour of asynchronous
+   * operations. Asynchronous operations will never fail with the error
+   * asio::error::would_block.
+   */
+  bool non_blocking() const
+  {
+    return this->get_service().non_blocking(this->get_implementation());
+  }
+
+  /// Sets the non-blocking mode of the descriptor.
+  /**
+   * @param mode If @c true, the descriptor's synchronous operations will fail
+   * with asio::error::would_block if they are unable to perform the
+   * requested operation immediately. If @c false, synchronous operations will
+   * block until complete.
+   *
+   * @throws asio::system_error Thrown on failure.
+   *
+   * @note The non-blocking mode has no effect on the behaviour of asynchronous
+   * operations. Asynchronous operations will never fail with the error
+   * asio::error::would_block.
+   */
+  void non_blocking(bool mode)
+  {
+    asio::error_code ec;
+    this->get_service().non_blocking(this->get_implementation(), mode, ec);
+    asio::detail::throw_error(ec, "non_blocking");
+  }
+
+  /// Sets the non-blocking mode of the descriptor.
+  /**
+   * @param mode If @c true, the descriptor's synchronous operations will fail
+   * with asio::error::would_block if they are unable to perform the
+   * requested operation immediately. If @c false, synchronous operations will
+   * block until complete.
+   *
+   * @param ec Set to indicate what error occurred, if any.
+   *
+   * @note The non-blocking mode has no effect on the behaviour of asynchronous
+   * operations. Asynchronous operations will never fail with the error
+   * asio::error::would_block.
+   */
+  asio::error_code non_blocking(
+      bool mode, asio::error_code& ec)
+  {
+    return this->get_service().non_blocking(
+        this->get_implementation(), mode, ec);
+  }
+
+  /// Gets the non-blocking mode of the native descriptor implementation.
+  /**
+   * This function is used to retrieve the non-blocking mode of the underlying
+   * native descriptor. This mode has no effect on the behaviour of the
+   * descriptor object's synchronous operations.
+   *
+   * @returns @c true if the underlying descriptor is in non-blocking mode and
+   * direct system calls may fail with asio::error::would_block (or the
+   * equivalent system error).
+   *
+   * @note The current non-blocking mode is cached by the descriptor object.
+   * Consequently, the return value may be incorrect if the non-blocking mode
+   * was set directly on the native descriptor.
+   */
+  bool native_non_blocking() const
+  {
+    return this->get_service().native_non_blocking(
+        this->get_implementation());
+  }
+
+  /// Sets the non-blocking mode of the native descriptor implementation.
+  /**
+   * This function is used to modify the non-blocking mode of the underlying
+   * native descriptor. It has no effect on the behaviour of the descriptor
+   * object's synchronous operations.
+   *
+   * @param mode If @c true, the underlying descriptor is put into non-blocking
+   * mode and direct system calls may fail with asio::error::would_block
+   * (or the equivalent system error).
+   *
+   * @throws asio::system_error Thrown on failure. If the @c mode is
+   * @c false, but the current value of @c non_blocking() is @c true, this
+   * function fails with asio::error::invalid_argument, as the
+   * combination does not make sense.
+   */
+  void native_non_blocking(bool mode)
+  {
+    asio::error_code ec;
+    this->get_service().native_non_blocking(
+        this->get_implementation(), mode, ec);
+    asio::detail::throw_error(ec, "native_non_blocking");
+  }
+
+  /// Sets the non-blocking mode of the native descriptor implementation.
+  /**
+   * This function is used to modify the non-blocking mode of the underlying
+   * native descriptor. It has no effect on the behaviour of the descriptor
+   * object's synchronous operations.
+   *
+   * @param mode If @c true, the underlying descriptor is put into non-blocking
+   * mode and direct system calls may fail with asio::error::would_block
+   * (or the equivalent system error).
+   *
+   * @param ec Set to indicate what error occurred, if any. If the @c mode is
+   * @c false, but the current value of @c non_blocking() is @c true, this
+   * function fails with asio::error::invalid_argument, as the
+   * combination does not make sense.
+   */
+  asio::error_code native_non_blocking(
+      bool mode, asio::error_code& ec)
+  {
+    return this->get_service().native_non_blocking(
+        this->get_implementation(), mode, ec);
+  }
+
+  /// Wait for the descriptor to become ready to read, ready to write, or to
+  /// have pending error conditions.
+  /**
+   * This function is used to perform a blocking wait for a descriptor to enter
+   * a ready to read, write or error condition state.
+   *
+   * @param w Specifies the desired descriptor state.
+   *
+   * @par Example
+   * Waiting for a descriptor to become readable.
+   * @code
+   * asio::posix::stream_descriptor descriptor(io_context);
+   * ...
+   * descriptor.wait(asio::posix::stream_descriptor::wait_read);
+   * @endcode
+   */
+  void wait(wait_type w)
+  {
+    asio::error_code ec;
+    this->get_service().wait(this->get_implementation(), w, ec);
+    asio::detail::throw_error(ec, "wait");
+  }
+
+  /// Wait for the descriptor to become ready to read, ready to write, or to
+  /// have pending error conditions.
+  /**
+   * This function is used to perform a blocking wait for a descriptor to enter
+   * a ready to read, write or error condition state.
+   *
+   * @param w Specifies the desired descriptor state.
+   *
+   * @param ec Set to indicate what error occurred, if any.
+   *
+   * @par Example
+   * Waiting for a descriptor to become readable.
+   * @code
+   * asio::posix::stream_descriptor descriptor(io_context);
+   * ...
+   * asio::error_code ec;
+   * descriptor.wait(asio::posix::stream_descriptor::wait_read, ec);
+   * @endcode
+   */
+  asio::error_code wait(wait_type w, asio::error_code& ec)
+  {
+    return this->get_service().wait(this->get_implementation(), w, ec);
+  }
+
+  /// Asynchronously wait for the descriptor to become ready to read, ready to
+  /// write, or to have pending error conditions.
+  /**
+   * This function is used to perform an asynchronous wait for a descriptor to
+   * enter a ready to read, write or error condition state.
+   *
+   * @param w Specifies the desired descriptor state.
+   *
+   * @param handler The handler to be called when the wait operation completes.
+   * Copies will be made of the handler as required. The function signature of
+   * the handler must be:
+   * @code void handler(
+   *   const asio::error_code& error // Result of operation
+   * ); @endcode
+   * Regardless of whether the asynchronous operation completes immediately or
+   * not, the handler will not be invoked from within this function. Invocation
+   * of the handler will be performed in a manner equivalent to using
+   * asio::io_context::post().
+   *
+   * @par Example
+   * @code
+   * void wait_handler(const asio::error_code& error)
+   * {
+   *   if (!error)
+   *   {
+   *     // Wait succeeded.
+   *   }
+   * }
+   *
+   * ...
+   *
+   * asio::posix::stream_descriptor descriptor(io_context);
+   * ...
+   * descriptor.async_wait(
+   *     asio::posix::stream_descriptor::wait_read,
+   *     wait_handler);
+   * @endcode
+   */
+  template <typename WaitHandler>
+  ASIO_INITFN_RESULT_TYPE(WaitHandler,
+      void (asio::error_code))
+  async_wait(wait_type w, ASIO_MOVE_ARG(WaitHandler) handler)
+  {
+    // If you get an error on the following line it means that your handler does
+    // not meet the documented type requirements for a WaitHandler.
+    ASIO_WAIT_HANDLER_CHECK(WaitHandler, handler) type_check;
+
+    async_completion<WaitHandler,
+      void (asio::error_code)> init(handler);
+
+    this->get_service().async_wait(
+        this->get_implementation(), w, init.handler);
+
+    return init.result.get();
+  }
+
+protected:
+  /// Protected destructor to prevent deletion through this type.
+  /**
+   * This function destroys the descriptor, cancelling any outstanding
+   * asynchronous wait operations associated with the descriptor as if by
+   * calling @c cancel.
+   */
+  ~descriptor()
+  {
+  }
+};
+
+} // namespace posix
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#undef ASIO_SVC_T
+
+#endif // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
+       //   || defined(GENERATING_DOCUMENTATION)
+
+#endif // !defined(ASIO_ENABLE_OLD_SERVICES)
+
+#endif // ASIO_POSIX_DESCRIPTOR_HPP
diff --git a/asio/include/asio/posix/descriptor_base.hpp b/asio/include/asio/posix/descriptor_base.hpp
index 0f7802f..be88b2d 100644
--- a/asio/include/asio/posix/descriptor_base.hpp
+++ b/asio/include/asio/posix/descriptor_base.hpp
@@ -28,15 +28,14 @@
 namespace asio {
 namespace posix {
 
-/// The descriptor_base class is used as a base for the basic_stream_descriptor
-/// class template so that we have a common place to define the associated
-/// IO control commands.
+/// The descriptor_base class is used as a base for the descriptor class as a
+/// place to define the associated IO control commands.
 class descriptor_base
 {
 public:
   /// Wait types.
   /**
-   * For use with basic_descriptor::wait() and basic_descriptor::async_wait().
+   * For use with descriptor::wait() and descriptor::async_wait().
    */
   enum wait_type
   {
diff --git a/asio/include/asio/posix/stream_descriptor.hpp b/asio/include/asio/posix/stream_descriptor.hpp
index 25c62e8..3f28ccf 100644
--- a/asio/include/asio/posix/stream_descriptor.hpp
+++ b/asio/include/asio/posix/stream_descriptor.hpp
@@ -16,17 +16,340 @@
 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
 
 #include "asio/detail/config.hpp"
+#include "asio/posix/descriptor.hpp"
 
 #if defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) \
   || defined(GENERATING_DOCUMENTATION)
 
-#include "asio/posix/basic_stream_descriptor.hpp"
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+# include "asio/posix/basic_stream_descriptor.hpp"
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
 
 namespace asio {
 namespace posix {
 
-/// Typedef for the typical usage of a stream-oriented descriptor.
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+// Typedef for the typical usage of a stream-oriented descriptor.
 typedef basic_stream_descriptor<> stream_descriptor;
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+/// Provides stream-oriented descriptor functionality.
+/**
+ * The posix::stream_descriptor class template provides asynchronous and
+ * blocking stream-oriented descriptor functionality.
+ *
+ * @par Thread Safety
+ * @e Distinct @e objects: Safe.@n
+ * @e Shared @e objects: Unsafe.
+ *
+ * @par Concepts:
+ * AsyncReadStream, AsyncWriteStream, Stream, SyncReadStream, SyncWriteStream.
+ */
+class stream_descriptor
+  : public descriptor
+{
+public:
+  /// Construct a stream_descriptor without opening it.
+  /**
+   * This constructor creates a stream descriptor without opening it. The
+   * descriptor needs to be opened and then connected or accepted before data
+   * can be sent or received on it.
+   *
+   * @param io_context The io_context object that the stream descriptor will
+   * use to dispatch handlers for any asynchronous operations performed on the
+   * descriptor.
+   */
+  explicit stream_descriptor(asio::io_context& io_context)
+    : descriptor(io_context)
+  {
+  }
+
+  /// Construct a stream_descriptor on an existing native descriptor.
+  /**
+   * This constructor creates a stream descriptor object to hold an existing
+   * native descriptor.
+   *
+   * @param io_context The io_context object that the stream descriptor will
+   * use to dispatch handlers for any asynchronous operations performed on the
+   * descriptor.
+   *
+   * @param native_descriptor The new underlying descriptor implementation.
+   *
+   * @throws asio::system_error Thrown on failure.
+   */
+  stream_descriptor(asio::io_context& io_context,
+      const native_handle_type& native_descriptor)
+    : descriptor(io_context, native_descriptor)
+  {
+  }
+
+#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+  /// Move-construct a stream_descriptor from another.
+  /**
+   * This constructor moves a stream descriptor from one object to another.
+   *
+   * @param other The other stream_descriptor object from which the move
+   * will occur.
+   *
+   * @note Following the move, the moved-from object is in the same state as if
+   * constructed using the @c stream_descriptor(io_context&) constructor.
+   */
+  stream_descriptor(stream_descriptor&& other)
+    : descriptor(std::move(other))
+  {
+  }
+
+  /// Move-assign a stream_descriptor from another.
+  /**
+   * This assignment operator moves a stream descriptor from one object to
+   * another.
+   *
+   * @param other The other stream_descriptor object from which the move
+   * will occur.
+   *
+   * @note Following the move, the moved-from object is in the same state as if
+   * constructed using the @c stream_descriptor(io_context&) constructor.
+   */
+  stream_descriptor& operator=(stream_descriptor&& other)
+  {
+    descriptor::operator=(std::move(other));
+    return *this;
+  }
+#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+
+  /// Write some data to the descriptor.
+  /**
+   * This function is used to write data to the stream descriptor. The function
+   * call will block until one or more bytes of the data has been written
+   * successfully, or until an error occurs.
+   *
+   * @param buffers One or more data buffers to be written to the descriptor.
+   *
+   * @returns The number of bytes written.
+   *
+   * @throws asio::system_error Thrown on failure. An error code of
+   * asio::error::eof indicates that the connection was closed by the
+   * peer.
+   *
+   * @note The write_some operation may not transmit all of the data to the
+   * peer. Consider using the @ref write function if you need to ensure that
+   * all data is written before the blocking operation completes.
+   *
+   * @par Example
+   * To write a single data buffer use the @ref buffer function as follows:
+   * @code
+   * descriptor.write_some(asio::buffer(data, size));
+   * @endcode
+   * See the @ref buffer documentation for information on writing multiple
+   * buffers in one go, and how to use it with arrays, boost::array or
+   * std::vector.
+   */
+  template <typename ConstBufferSequence>
+  std::size_t write_some(const ConstBufferSequence& buffers)
+  {
+    asio::error_code ec;
+    std::size_t s = this->get_service().write_some(
+        this->get_implementation(), buffers, ec);
+    asio::detail::throw_error(ec, "write_some");
+    return s;
+  }
+
+  /// Write some data to the descriptor.
+  /**
+   * This function is used to write data to the stream descriptor. The function
+   * call will block until one or more bytes of the data has been written
+   * successfully, or until an error occurs.
+   *
+   * @param buffers One or more data buffers to be written to the descriptor.
+   *
+   * @param ec Set to indicate what error occurred, if any.
+   *
+   * @returns The number of bytes written. Returns 0 if an error occurred.
+   *
+   * @note The write_some operation may not transmit all of the data to the
+   * peer. Consider using the @ref write function if you need to ensure that
+   * all data is written before the blocking operation completes.
+   */
+  template <typename ConstBufferSequence>
+  std::size_t write_some(const ConstBufferSequence& buffers,
+      asio::error_code& ec)
+  {
+    return this->get_service().write_some(
+        this->get_implementation(), buffers, ec);
+  }
+
+  /// Start an asynchronous write.
+  /**
+   * This function is used to asynchronously write data to the stream
+   * descriptor. The function call always returns immediately.
+   *
+   * @param buffers One or more data buffers to be written to the descriptor.
+   * Although the buffers object may be copied as necessary, ownership of the
+   * underlying memory blocks is retained by the caller, which must guarantee
+   * that they remain valid until the handler is called.
+   *
+   * @param handler The handler to be called when the write operation completes.
+   * Copies will be made of the handler as required. The function signature of
+   * the handler must be:
+   * @code void handler(
+   *   const asio::error_code& error, // Result of operation.
+   *   std::size_t bytes_transferred           // Number of bytes written.
+   * ); @endcode
+   * Regardless of whether the asynchronous operation completes immediately or
+   * not, the handler will not be invoked from within this function. Invocation
+   * of the handler will be performed in a manner equivalent to using
+   * asio::io_context::post().
+   *
+   * @note The write operation may not transmit all of the data to the peer.
+   * Consider using the @ref async_write function if you need to ensure that all
+   * data is written before the asynchronous operation completes.
+   *
+   * @par Example
+   * To write a single data buffer use the @ref buffer function as follows:
+   * @code
+   * descriptor.async_write_some(asio::buffer(data, size), handler);
+   * @endcode
+   * See the @ref buffer documentation for information on writing multiple
+   * buffers in one go, and how to use it with arrays, boost::array or
+   * std::vector.
+   */
+  template <typename ConstBufferSequence, typename WriteHandler>
+  ASIO_INITFN_RESULT_TYPE(WriteHandler,
+      void (asio::error_code, std::size_t))
+  async_write_some(const ConstBufferSequence& buffers,
+      ASIO_MOVE_ARG(WriteHandler) handler)
+  {
+    // If you get an error on the following line it means that your handler does
+    // not meet the documented type requirements for a WriteHandler.
+    ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
+
+    asio::async_completion<WriteHandler,
+      void (asio::error_code, std::size_t)> init(handler);
+
+    this->get_service().async_write_some(
+        this->get_implementation(), buffers, init.handler);
+
+    return init.result.get();
+  }
+
+  /// Read some data from the descriptor.
+  /**
+   * This function is used to read data from the stream descriptor. The function
+   * call will block until one or more bytes of data has been read successfully,
+   * or until an error occurs.
+   *
+   * @param buffers One or more buffers into which the data will be read.
+   *
+   * @returns The number of bytes read.
+   *
+   * @throws asio::system_error Thrown on failure. An error code of
+   * asio::error::eof indicates that the connection was closed by the
+   * peer.
+   *
+   * @note The read_some operation may not read all of the requested number of
+   * bytes. Consider using the @ref read function if you need to ensure that
+   * the requested amount of data is read before the blocking operation
+   * completes.
+   *
+   * @par Example
+   * To read into a single data buffer use the @ref buffer function as follows:
+   * @code
+   * descriptor.read_some(asio::buffer(data, size));
+   * @endcode
+   * See the @ref buffer documentation for information on reading into multiple
+   * buffers in one go, and how to use it with arrays, boost::array or
+   * std::vector.
+   */
+  template <typename MutableBufferSequence>
+  std::size_t read_some(const MutableBufferSequence& buffers)
+  {
+    asio::error_code ec;
+    std::size_t s = this->get_service().read_some(
+        this->get_implementation(), buffers, ec);
+    asio::detail::throw_error(ec, "read_some");
+    return s;
+  }
+
+  /// Read some data from the descriptor.
+  /**
+   * This function is used to read data from the stream descriptor. The function
+   * call will block until one or more bytes of data has been read successfully,
+   * or until an error occurs.
+   *
+   * @param buffers One or more buffers into which the data will be read.
+   *
+   * @param ec Set to indicate what error occurred, if any.
+   *
+   * @returns The number of bytes read. Returns 0 if an error occurred.
+   *
+   * @note The read_some operation may not read all of the requested number of
+   * bytes. Consider using the @ref read function if you need to ensure that
+   * the requested amount of data is read before the blocking operation
+   * completes.
+   */
+  template <typename MutableBufferSequence>
+  std::size_t read_some(const MutableBufferSequence& buffers,
+      asio::error_code& ec)
+  {
+    return this->get_service().read_some(
+        this->get_implementation(), buffers, ec);
+  }
+
+  /// Start an asynchronous read.
+  /**
+   * This function is used to asynchronously read data from the stream
+   * descriptor. The function call always returns immediately.
+   *
+   * @param buffers One or more buffers into which the data will be read.
+   * Although the buffers object may be copied as necessary, ownership of the
+   * underlying memory blocks is retained by the caller, which must guarantee
+   * that they remain valid until the handler is called.
+   *
+   * @param handler The handler to be called when the read operation completes.
+   * Copies will be made of the handler as required. The function signature of
+   * the handler must be:
+   * @code void handler(
+   *   const asio::error_code& error, // Result of operation.
+   *   std::size_t bytes_transferred           // Number of bytes read.
+   * ); @endcode
+   * Regardless of whether the asynchronous operation completes immediately or
+   * not, the handler will not be invoked from within this function. Invocation
+   * of the handler will be performed in a manner equivalent to using
+   * asio::io_context::post().
+   *
+   * @note The read operation may not read all of the requested number of bytes.
+   * Consider using the @ref async_read function if you need to ensure that the
+   * requested amount of data is read before the asynchronous operation
+   * completes.
+   *
+   * @par Example
+   * To read into a single data buffer use the @ref buffer function as follows:
+   * @code
+   * descriptor.async_read_some(asio::buffer(data, size), handler);
+   * @endcode
+   * See the @ref buffer documentation for information on reading into multiple
+   * buffers in one go, and how to use it with arrays, boost::array or
+   * std::vector.
+   */
+  template <typename MutableBufferSequence, typename ReadHandler>
+  ASIO_INITFN_RESULT_TYPE(ReadHandler,
+      void (asio::error_code, std::size_t))
+  async_read_some(const MutableBufferSequence& buffers,
+      ASIO_MOVE_ARG(ReadHandler) handler)
+  {
+    // If you get an error on the following line it means that your handler does
+    // not meet the documented type requirements for a ReadHandler.
+    ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
+
+    asio::async_completion<ReadHandler,
+      void (asio::error_code, std::size_t)> init(handler);
+
+    this->get_service().async_read_some(
+        this->get_implementation(), buffers, init.handler);
+
+    return init.result.get();
+  }
+};
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
 
 } // namespace posix
 } // namespace asio
diff --git a/asio/include/asio/posix/stream_descriptor_service.hpp b/asio/include/asio/posix/stream_descriptor_service.hpp
index 63d01b5..ed050cc 100644
--- a/asio/include/asio/posix/stream_descriptor_service.hpp
+++ b/asio/include/asio/posix/stream_descriptor_service.hpp
@@ -17,6 +17,8 @@
 
 #include "asio/detail/config.hpp"
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+
 #if defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) \
   || defined(GENERATING_DOCUMENTATION)
 
@@ -265,4 +267,6 @@
 #endif // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
        //   || defined(GENERATING_DOCUMENTATION)
 
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
+
 #endif // ASIO_POSIX_STREAM_DESCRIPTOR_SERVICE_HPP
diff --git a/asio/include/asio/raw_socket_service.hpp b/asio/include/asio/raw_socket_service.hpp
index d095e84..546218a 100644
--- a/asio/include/asio/raw_socket_service.hpp
+++ b/asio/include/asio/raw_socket_service.hpp
@@ -16,6 +16,9 @@
 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
 
 #include "asio/detail/config.hpp"
+
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+
 #include <cstddef>
 #include "asio/async_result.hpp"
 #include "asio/detail/type_traits.hpp"
@@ -435,4 +438,6 @@
 
 #include "asio/detail/pop_options.hpp"
 
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
+
 #endif // ASIO_RAW_SOCKET_SERVICE_HPP
diff --git a/asio/include/asio/seq_packet_socket_service.hpp b/asio/include/asio/seq_packet_socket_service.hpp
index 7b9ff4f..f48efd4 100644
--- a/asio/include/asio/seq_packet_socket_service.hpp
+++ b/asio/include/asio/seq_packet_socket_service.hpp
@@ -16,6 +16,9 @@
 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
 
 #include "asio/detail/config.hpp"
+
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+
 #include <cstddef>
 #include "asio/async_result.hpp"
 #include "asio/detail/type_traits.hpp"
@@ -385,4 +388,6 @@
 
 #include "asio/detail/pop_options.hpp"
 
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
+
 #endif // ASIO_SEQ_PACKET_SOCKET_SERVICE_HPP
diff --git a/asio/include/asio/serial_port.hpp b/asio/include/asio/serial_port.hpp
index f5ac715..0f13dc1 100644
--- a/asio/include/asio/serial_port.hpp
+++ b/asio/include/asio/serial_port.hpp
@@ -21,15 +21,743 @@
 #if defined(ASIO_HAS_SERIAL_PORT) \
   || defined(GENERATING_DOCUMENTATION)
 
-#include "asio/basic_serial_port.hpp"
+#include <string>
+#include "asio/async_result.hpp"
+#include "asio/basic_io_object.hpp"
+#include "asio/detail/handler_type_requirements.hpp"
+#include "asio/detail/throw_error.hpp"
+#include "asio/error.hpp"
+#include "asio/io_context.hpp"
+#include "asio/serial_port_base.hpp"
+
+#if defined(ASIO_HAS_MOVE)
+# include <utility>
+#endif // defined(ASIO_HAS_MOVE)
+
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+# include "asio/basic_serial_port.hpp"
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+# if defined(ASIO_HAS_IOCP)
+#  include "asio/detail/win_iocp_serial_port_service.hpp"
+#  define ASIO_SVC_T detail::win_iocp_serial_port_service
+# else
+#  include "asio/detail/reactive_serial_port_service.hpp"
+#  define ASIO_SVC_T detail::reactive_serial_port_service
+# endif
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
+
+#include "asio/detail/push_options.hpp"
 
 namespace asio {
 
-/// Typedef for the typical usage of a serial port.
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+// Typedef for the typical usage of a serial port.
 typedef basic_serial_port<> serial_port;
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+/// Provides serial port functionality.
+/**
+ * The serial_port class provides a wrapper over serial port functionality.
+ *
+ * @par Thread Safety
+ * @e Distinct @e objects: Safe.@n
+ * @e Shared @e objects: Unsafe.
+ */
+class serial_port
+  : ASIO_SVC_ACCESS basic_io_object<ASIO_SVC_T>,
+    public serial_port_base
+{
+public:
+  /// The type of the executor associated with the object.
+  typedef io_context::executor_type executor_type;
+
+  /// The native representation of a serial port.
+#if defined(GENERATING_DOCUMENTATION)
+  typedef implementation_defined native_handle_type;
+#else
+  typedef ASIO_SVC_T::native_handle_type native_handle_type;
+#endif
+
+  /// A basic_serial_port is always the lowest layer.
+  typedef serial_port lowest_layer_type;
+
+  /// Construct a serial_port without opening it.
+  /**
+   * This constructor creates a serial port without opening it.
+   *
+   * @param io_context The io_context object that the serial port will use to
+   * dispatch handlers for any asynchronous operations performed on the port.
+   */
+  explicit serial_port(asio::io_context& io_context)
+    : basic_io_object<ASIO_SVC_T>(io_context)
+  {
+  }
+
+  /// Construct and open a serial_port.
+  /**
+   * This constructor creates and opens a serial port for the specified device
+   * name.
+   *
+   * @param io_context The io_context object that the serial port will use to
+   * dispatch handlers for any asynchronous operations performed on the port.
+   *
+   * @param device The platform-specific device name for this serial
+   * port.
+   */
+  explicit serial_port(asio::io_context& io_context,
+      const char* device)
+    : basic_io_object<ASIO_SVC_T>(io_context)
+  {
+    asio::error_code ec;
+    this->get_service().open(this->get_implementation(), device, ec);
+    asio::detail::throw_error(ec, "open");
+  }
+
+  /// Construct and open a serial_port.
+  /**
+   * This constructor creates and opens a serial port for the specified device
+   * name.
+   *
+   * @param io_context The io_context object that the serial port will use to
+   * dispatch handlers for any asynchronous operations performed on the port.
+   *
+   * @param device The platform-specific device name for this serial
+   * port.
+   */
+  explicit serial_port(asio::io_context& io_context,
+      const std::string& device)
+    : basic_io_object<ASIO_SVC_T>(io_context)
+  {
+    asio::error_code ec;
+    this->get_service().open(this->get_implementation(), device, ec);
+    asio::detail::throw_error(ec, "open");
+  }
+
+  /// Construct a serial_port on an existing native serial port.
+  /**
+   * This constructor creates a serial port object to hold an existing native
+   * serial port.
+   *
+   * @param io_context The io_context object that the serial port will use to
+   * dispatch handlers for any asynchronous operations performed on the port.
+   *
+   * @param native_serial_port A native serial port.
+   *
+   * @throws asio::system_error Thrown on failure.
+   */
+  serial_port(asio::io_context& io_context,
+      const native_handle_type& native_serial_port)
+    : basic_io_object<ASIO_SVC_T>(io_context)
+  {
+    asio::error_code ec;
+    this->get_service().assign(this->get_implementation(),
+        native_serial_port, ec);
+    asio::detail::throw_error(ec, "assign");
+  }
+
+#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+  /// Move-construct a serial_port from another.
+  /**
+   * This constructor moves a serial port from one object to another.
+   *
+   * @param other The other serial_port object from which the move will
+   * occur.
+   *
+   * @note Following the move, the moved-from object is in the same state as if
+   * constructed using the @c serial_port(io_context&) constructor.
+   */
+  serial_port(serial_port&& other)
+    : basic_io_object<ASIO_SVC_T>(std::move(other))
+  {
+  }
+
+  /// Move-assign a serial_port from another.
+  /**
+   * This assignment operator moves a serial port from one object to another.
+   *
+   * @param other The other serial_port object from which the move will
+   * occur.
+   *
+   * @note Following the move, the moved-from object is in the same state as if
+   * constructed using the @c serial_port(io_context&) constructor.
+   */
+  serial_port& operator=(serial_port&& other)
+  {
+    basic_io_object<ASIO_SVC_T>::operator=(std::move(other));
+    return *this;
+  }
+#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+
+  /// Destroys the serial port.
+  /**
+   * This function destroys the serial port, cancelling any outstanding
+   * asynchronous wait operations associated with the serial port as if by
+   * calling @c cancel.
+   */
+  ~serial_port()
+  {
+  }
+
+#if !defined(ASIO_NO_DEPRECATED)
+  /// (Deprecated: Use get_executor().) Get the io_context associated with the
+  /// object.
+  /**
+   * This function may be used to obtain the io_context object that the I/O
+   * object uses to dispatch handlers for asynchronous operations.
+   *
+   * @return A reference to the io_context object that the I/O object will use
+   * to dispatch handlers. Ownership is not transferred to the caller.
+   */
+  asio::io_context& get_io_context()
+  {
+    return basic_io_object<ASIO_SVC_T>::get_io_context();
+  }
+
+  /// (Deprecated: Use get_executor().) Get the io_context associated with the
+  /// object.
+  /**
+   * This function may be used to obtain the io_context object that the I/O
+   * object uses to dispatch handlers for asynchronous operations.
+   *
+   * @return A reference to the io_context object that the I/O object will use
+   * to dispatch handlers. Ownership is not transferred to the caller.
+   */
+  asio::io_context& get_io_service()
+  {
+    return basic_io_object<ASIO_SVC_T>::get_io_service();
+  }
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+  /// Get the executor associated with the object.
+  executor_type get_executor() ASIO_NOEXCEPT
+  {
+    return basic_io_object<ASIO_SVC_T>::get_executor();
+  }
+
+  /// Get a reference to the lowest layer.
+  /**
+   * This function returns a reference to the lowest layer in a stack of
+   * layers. Since a serial_port cannot contain any further layers, it simply
+   * returns a reference to itself.
+   *
+   * @return A reference to the lowest layer in the stack of layers. Ownership
+   * is not transferred to the caller.
+   */
+  lowest_layer_type& lowest_layer()
+  {
+    return *this;
+  }
+
+  /// Get a const reference to the lowest layer.
+  /**
+   * This function returns a const reference to the lowest layer in a stack of
+   * layers. Since a serial_port cannot contain any further layers, it simply
+   * returns a reference to itself.
+   *
+   * @return A const reference to the lowest layer in the stack of layers.
+   * Ownership is not transferred to the caller.
+   */
+  const lowest_layer_type& lowest_layer() const
+  {
+    return *this;
+  }
+
+  /// Open the serial port using the specified device name.
+  /**
+   * This function opens the serial port for the specified device name.
+   *
+   * @param device The platform-specific device name.
+   *
+   * @throws asio::system_error Thrown on failure.
+   */
+  void open(const std::string& device)
+  {
+    asio::error_code ec;
+    this->get_service().open(this->get_implementation(), device, ec);
+    asio::detail::throw_error(ec, "open");
+  }
+
+  /// Open the serial port using the specified device name.
+  /**
+   * This function opens the serial port using the given platform-specific
+   * device name.
+   *
+   * @param device The platform-specific device name.
+   *
+   * @param ec Set the indicate what error occurred, if any.
+   */
+  asio::error_code open(const std::string& device,
+      asio::error_code& ec)
+  {
+    return this->get_service().open(this->get_implementation(), device, ec);
+  }
+
+  /// Assign an existing native serial port to the serial port.
+  /*
+   * This function opens the serial port to hold an existing native serial port.
+   *
+   * @param native_serial_port A native serial port.
+   *
+   * @throws asio::system_error Thrown on failure.
+   */
+  void assign(const native_handle_type& native_serial_port)
+  {
+    asio::error_code ec;
+    this->get_service().assign(this->get_implementation(),
+        native_serial_port, ec);
+    asio::detail::throw_error(ec, "assign");
+  }
+
+  /// Assign an existing native serial port to the serial port.
+  /*
+   * This function opens the serial port to hold an existing native serial port.
+   *
+   * @param native_serial_port A native serial port.
+   *
+   * @param ec Set to indicate what error occurred, if any.
+   */
+  asio::error_code assign(const native_handle_type& native_serial_port,
+      asio::error_code& ec)
+  {
+    return this->get_service().assign(this->get_implementation(),
+        native_serial_port, ec);
+  }
+
+  /// Determine whether the serial port is open.
+  bool is_open() const
+  {
+    return this->get_service().is_open(this->get_implementation());
+  }
+
+  /// Close the serial port.
+  /**
+   * This function is used to close the serial port. Any asynchronous read or
+   * write operations will be cancelled immediately, and will complete with the
+   * asio::error::operation_aborted error.
+   *
+   * @throws asio::system_error Thrown on failure.
+   */
+  void close()
+  {
+    asio::error_code ec;
+    this->get_service().close(this->get_implementation(), ec);
+    asio::detail::throw_error(ec, "close");
+  }
+
+  /// Close the serial port.
+  /**
+   * This function is used to close the serial port. Any asynchronous read or
+   * write operations will be cancelled immediately, and will complete with the
+   * asio::error::operation_aborted error.
+   *
+   * @param ec Set to indicate what error occurred, if any.
+   */
+  asio::error_code close(asio::error_code& ec)
+  {
+    return this->get_service().close(this->get_implementation(), ec);
+  }
+
+  /// Get the native serial port representation.
+  /**
+   * This function may be used to obtain the underlying representation of the
+   * serial port. This is intended to allow access to native serial port
+   * functionality that is not otherwise provided.
+   */
+  native_handle_type native_handle()
+  {
+    return this->get_service().native_handle(this->get_implementation());
+  }
+
+  /// Cancel all asynchronous operations associated with the serial port.
+  /**
+   * This function causes all outstanding asynchronous read or write operations
+   * to finish immediately, and the handlers for cancelled operations will be
+   * passed the asio::error::operation_aborted error.
+   *
+   * @throws asio::system_error Thrown on failure.
+   */
+  void cancel()
+  {
+    asio::error_code ec;
+    this->get_service().cancel(this->get_implementation(), ec);
+    asio::detail::throw_error(ec, "cancel");
+  }
+
+  /// Cancel all asynchronous operations associated with the serial port.
+  /**
+   * This function causes all outstanding asynchronous read or write operations
+   * to finish immediately, and the handlers for cancelled operations will be
+   * passed the asio::error::operation_aborted error.
+   *
+   * @param ec Set to indicate what error occurred, if any.
+   */
+  asio::error_code cancel(asio::error_code& ec)
+  {
+    return this->get_service().cancel(this->get_implementation(), ec);
+  }
+
+  /// Send a break sequence to the serial port.
+  /**
+   * This function causes a break sequence of platform-specific duration to be
+   * sent out the serial port.
+   *
+   * @throws asio::system_error Thrown on failure.
+   */
+  void send_break()
+  {
+    asio::error_code ec;
+    this->get_service().send_break(this->get_implementation(), ec);
+    asio::detail::throw_error(ec, "send_break");
+  }
+
+  /// Send a break sequence to the serial port.
+  /**
+   * This function causes a break sequence of platform-specific duration to be
+   * sent out the serial port.
+   *
+   * @param ec Set to indicate what error occurred, if any.
+   */
+  asio::error_code send_break(asio::error_code& ec)
+  {
+    return this->get_service().send_break(this->get_implementation(), ec);
+  }
+
+  /// Set an option on the serial port.
+  /**
+   * This function is used to set an option on the serial port.
+   *
+   * @param option The option value to be set on the serial port.
+   *
+   * @throws asio::system_error Thrown on failure.
+   *
+   * @sa SettableSerialPortOption @n
+   * asio::serial_port_base::baud_rate @n
+   * asio::serial_port_base::flow_control @n
+   * asio::serial_port_base::parity @n
+   * asio::serial_port_base::stop_bits @n
+   * asio::serial_port_base::character_size
+   */
+  template <typename SettableSerialPortOption>
+  void set_option(const SettableSerialPortOption& option)
+  {
+    asio::error_code ec;
+    this->get_service().set_option(this->get_implementation(), option, ec);
+    asio::detail::throw_error(ec, "set_option");
+  }
+
+  /// Set an option on the serial port.
+  /**
+   * This function is used to set an option on the serial port.
+   *
+   * @param option The option value to be set on the serial port.
+   *
+   * @param ec Set to indicate what error occurred, if any.
+   *
+   * @sa SettableSerialPortOption @n
+   * asio::serial_port_base::baud_rate @n
+   * asio::serial_port_base::flow_control @n
+   * asio::serial_port_base::parity @n
+   * asio::serial_port_base::stop_bits @n
+   * asio::serial_port_base::character_size
+   */
+  template <typename SettableSerialPortOption>
+  asio::error_code set_option(const SettableSerialPortOption& option,
+      asio::error_code& ec)
+  {
+    return this->get_service().set_option(
+        this->get_implementation(), option, ec);
+  }
+
+  /// Get an option from the serial port.
+  /**
+   * This function is used to get the current value of an option on the serial
+   * port.
+   *
+   * @param option The option value to be obtained from the serial port.
+   *
+   * @throws asio::system_error Thrown on failure.
+   *
+   * @sa GettableSerialPortOption @n
+   * asio::serial_port_base::baud_rate @n
+   * asio::serial_port_base::flow_control @n
+   * asio::serial_port_base::parity @n
+   * asio::serial_port_base::stop_bits @n
+   * asio::serial_port_base::character_size
+   */
+  template <typename GettableSerialPortOption>
+  void get_option(GettableSerialPortOption& option)
+  {
+    asio::error_code ec;
+    this->get_service().get_option(this->get_implementation(), option, ec);
+    asio::detail::throw_error(ec, "get_option");
+  }
+
+  /// Get an option from the serial port.
+  /**
+   * This function is used to get the current value of an option on the serial
+   * port.
+   *
+   * @param option The option value to be obtained from the serial port.
+   *
+   * @param ec Set to indicate what error occurred, if any.
+   *
+   * @sa GettableSerialPortOption @n
+   * asio::serial_port_base::baud_rate @n
+   * asio::serial_port_base::flow_control @n
+   * asio::serial_port_base::parity @n
+   * asio::serial_port_base::stop_bits @n
+   * asio::serial_port_base::character_size
+   */
+  template <typename GettableSerialPortOption>
+  asio::error_code get_option(GettableSerialPortOption& option,
+      asio::error_code& ec)
+  {
+    return this->get_service().get_option(
+        this->get_implementation(), option, ec);
+  }
+
+  /// Write some data to the serial port.
+  /**
+   * This function is used to write data to the serial port. The function call
+   * will block until one or more bytes of the data has been written
+   * successfully, or until an error occurs.
+   *
+   * @param buffers One or more data buffers to be written to the serial port.
+   *
+   * @returns The number of bytes written.
+   *
+   * @throws asio::system_error Thrown on failure. An error code of
+   * asio::error::eof indicates that the connection was closed by the
+   * peer.
+   *
+   * @note The write_some operation may not transmit all of the data to the
+   * peer. Consider using the @ref write function if you need to ensure that
+   * all data is written before the blocking operation completes.
+   *
+   * @par Example
+   * To write a single data buffer use the @ref buffer function as follows:
+   * @code
+   * serial_port.write_some(asio::buffer(data, size));
+   * @endcode
+   * See the @ref buffer documentation for information on writing multiple
+   * buffers in one go, and how to use it with arrays, boost::array or
+   * std::vector.
+   */
+  template <typename ConstBufferSequence>
+  std::size_t write_some(const ConstBufferSequence& buffers)
+  {
+    asio::error_code ec;
+    std::size_t s = this->get_service().write_some(
+        this->get_implementation(), buffers, ec);
+    asio::detail::throw_error(ec, "write_some");
+    return s;
+  }
+
+  /// Write some data to the serial port.
+  /**
+   * This function is used to write data to the serial port. The function call
+   * will block until one or more bytes of the data has been written
+   * successfully, or until an error occurs.
+   *
+   * @param buffers One or more data buffers to be written to the serial port.
+   *
+   * @param ec Set to indicate what error occurred, if any.
+   *
+   * @returns The number of bytes written. Returns 0 if an error occurred.
+   *
+   * @note The write_some operation may not transmit all of the data to the
+   * peer. Consider using the @ref write function if you need to ensure that
+   * all data is written before the blocking operation completes.
+   */
+  template <typename ConstBufferSequence>
+  std::size_t write_some(const ConstBufferSequence& buffers,
+      asio::error_code& ec)
+  {
+    return this->get_service().write_some(
+        this->get_implementation(), buffers, ec);
+  }
+
+  /// Start an asynchronous write.
+  /**
+   * This function is used to asynchronously write data to the serial port.
+   * The function call always returns immediately.
+   *
+   * @param buffers One or more data buffers to be written to the serial port.
+   * Although the buffers object may be copied as necessary, ownership of the
+   * underlying memory blocks is retained by the caller, which must guarantee
+   * that they remain valid until the handler is called.
+   *
+   * @param handler The handler to be called when the write operation completes.
+   * Copies will be made of the handler as required. The function signature of
+   * the handler must be:
+   * @code void handler(
+   *   const asio::error_code& error, // Result of operation.
+   *   std::size_t bytes_transferred           // Number of bytes written.
+   * ); @endcode
+   * Regardless of whether the asynchronous operation completes immediately or
+   * not, the handler will not be invoked from within this function. Invocation
+   * of the handler will be performed in a manner equivalent to using
+   * asio::io_context::post().
+   *
+   * @note The write operation may not transmit all of the data to the peer.
+   * Consider using the @ref async_write function if you need to ensure that all
+   * data is written before the asynchronous operation completes.
+   *
+   * @par Example
+   * To write a single data buffer use the @ref buffer function as follows:
+   * @code
+   * serial_port.async_write_some(asio::buffer(data, size), handler);
+   * @endcode
+   * See the @ref buffer documentation for information on writing multiple
+   * buffers in one go, and how to use it with arrays, boost::array or
+   * std::vector.
+   */
+  template <typename ConstBufferSequence, typename WriteHandler>
+  ASIO_INITFN_RESULT_TYPE(WriteHandler,
+      void (asio::error_code, std::size_t))
+  async_write_some(const ConstBufferSequence& buffers,
+      ASIO_MOVE_ARG(WriteHandler) handler)
+  {
+    // If you get an error on the following line it means that your handler does
+    // not meet the documented type requirements for a WriteHandler.
+    ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
+
+    async_completion<WriteHandler,
+      void (asio::error_code, std::size_t)> init(handler);
+
+    this->get_service().async_write_some(
+        this->get_implementation(), buffers, init.handler);
+
+    return init.result.get();
+  }
+
+  /// Read some data from the serial port.
+  /**
+   * This function is used to read data from the serial port. The function
+   * call will block until one or more bytes of data has been read successfully,
+   * or until an error occurs.
+   *
+   * @param buffers One or more buffers into which the data will be read.
+   *
+   * @returns The number of bytes read.
+   *
+   * @throws asio::system_error Thrown on failure. An error code of
+   * asio::error::eof indicates that the connection was closed by the
+   * peer.
+   *
+   * @note The read_some operation may not read all of the requested number of
+   * bytes. Consider using the @ref read function if you need to ensure that
+   * the requested amount of data is read before the blocking operation
+   * completes.
+   *
+   * @par Example
+   * To read into a single data buffer use the @ref buffer function as follows:
+   * @code
+   * serial_port.read_some(asio::buffer(data, size));
+   * @endcode
+   * See the @ref buffer documentation for information on reading into multiple
+   * buffers in one go, and how to use it with arrays, boost::array or
+   * std::vector.
+   */
+  template <typename MutableBufferSequence>
+  std::size_t read_some(const MutableBufferSequence& buffers)
+  {
+    asio::error_code ec;
+    std::size_t s = this->get_service().read_some(
+        this->get_implementation(), buffers, ec);
+    asio::detail::throw_error(ec, "read_some");
+    return s;
+  }
+
+  /// Read some data from the serial port.
+  /**
+   * This function is used to read data from the serial port. The function
+   * call will block until one or more bytes of data has been read successfully,
+   * or until an error occurs.
+   *
+   * @param buffers One or more buffers into which the data will be read.
+   *
+   * @param ec Set to indicate what error occurred, if any.
+   *
+   * @returns The number of bytes read. Returns 0 if an error occurred.
+   *
+   * @note The read_some operation may not read all of the requested number of
+   * bytes. Consider using the @ref read function if you need to ensure that
+   * the requested amount of data is read before the blocking operation
+   * completes.
+   */
+  template <typename MutableBufferSequence>
+  std::size_t read_some(const MutableBufferSequence& buffers,
+      asio::error_code& ec)
+  {
+    return this->get_service().read_some(
+        this->get_implementation(), buffers, ec);
+  }
+
+  /// Start an asynchronous read.
+  /**
+   * This function is used to asynchronously read data from the serial port.
+   * The function call always returns immediately.
+   *
+   * @param buffers One or more buffers into which the data will be read.
+   * Although the buffers object may be copied as necessary, ownership of the
+   * underlying memory blocks is retained by the caller, which must guarantee
+   * that they remain valid until the handler is called.
+   *
+   * @param handler The handler to be called when the read operation completes.
+   * Copies will be made of the handler as required. The function signature of
+   * the handler must be:
+   * @code void handler(
+   *   const asio::error_code& error, // Result of operation.
+   *   std::size_t bytes_transferred           // Number of bytes read.
+   * ); @endcode
+   * Regardless of whether the asynchronous operation completes immediately or
+   * not, the handler will not be invoked from within this function. Invocation
+   * of the handler will be performed in a manner equivalent to using
+   * asio::io_context::post().
+   *
+   * @note The read operation may not read all of the requested number of bytes.
+   * Consider using the @ref async_read function if you need to ensure that the
+   * requested amount of data is read before the asynchronous operation
+   * completes.
+   *
+   * @par Example
+   * To read into a single data buffer use the @ref buffer function as follows:
+   * @code
+   * serial_port.async_read_some(asio::buffer(data, size), handler);
+   * @endcode
+   * See the @ref buffer documentation for information on reading into multiple
+   * buffers in one go, and how to use it with arrays, boost::array or
+   * std::vector.
+   */
+  template <typename MutableBufferSequence, typename ReadHandler>
+  ASIO_INITFN_RESULT_TYPE(ReadHandler,
+      void (asio::error_code, std::size_t))
+  async_read_some(const MutableBufferSequence& buffers,
+      ASIO_MOVE_ARG(ReadHandler) handler)
+  {
+    // If you get an error on the following line it means that your handler does
+    // not meet the documented type requirements for a ReadHandler.
+    ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
+
+    async_completion<ReadHandler,
+      void (asio::error_code, std::size_t)> init(handler);
+
+    this->get_service().async_read_some(
+        this->get_implementation(), buffers, init.handler);
+
+    return init.result.get();
+  }
+};
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
 
 } // namespace asio
 
+#include "asio/detail/pop_options.hpp"
+
+#if !defined(ASIO_ENABLE_OLD_SERVICES)
+# undef ASIO_SVC_T
+#endif // !defined(ASIO_ENABLE_OLD_SERVICES)
+
 #endif // defined(ASIO_HAS_SERIAL_PORT)
        //   || defined(GENERATING_DOCUMENTATION)
 
diff --git a/asio/include/asio/serial_port_service.hpp b/asio/include/asio/serial_port_service.hpp
index 7fca7b2..d0f2443 100644
--- a/asio/include/asio/serial_port_service.hpp
+++ b/asio/include/asio/serial_port_service.hpp
@@ -17,6 +17,8 @@
 
 #include "asio/detail/config.hpp"
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+
 #if defined(ASIO_HAS_SERIAL_PORT) \
   || defined(GENERATING_DOCUMENTATION)
 
@@ -235,4 +237,6 @@
 #endif // defined(ASIO_HAS_SERIAL_PORT)
        //   || defined(GENERATING_DOCUMENTATION)
 
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
+
 #endif // ASIO_SERIAL_PORT_SERVICE_HPP
diff --git a/asio/include/asio/signal_set.hpp b/asio/include/asio/signal_set.hpp
index 985b6fa..aced215 100644
--- a/asio/include/asio/signal_set.hpp
+++ b/asio/include/asio/signal_set.hpp
@@ -16,12 +16,428 @@
 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
 
 #include "asio/detail/config.hpp"
-#include "asio/basic_signal_set.hpp"
+
+#include "asio/async_result.hpp"
+#include "asio/basic_io_object.hpp"
+#include "asio/detail/handler_type_requirements.hpp"
+#include "asio/detail/throw_error.hpp"
+#include "asio/error.hpp"
+#include "asio/io_context.hpp"
+
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+# include "asio/basic_signal_set.hpp"
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+# include "asio/detail/signal_set_service.hpp"
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
 
 namespace asio {
 
-/// Typedef for the typical usage of a signal set.
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+// Typedef for the typical usage of a signal set.
 typedef basic_signal_set<> signal_set;
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+/// Provides signal functionality.
+/**
+ * The signal_set class provides the ability to perform an asynchronous wait
+ * for one or more signals to occur.
+ *
+ * @par Thread Safety
+ * @e Distinct @e objects: Safe.@n
+ * @e Shared @e objects: Unsafe.
+ *
+ * @par Example
+ * Performing an asynchronous wait:
+ * @code
+ * void handler(
+ *     const asio::error_code& error,
+ *     int signal_number)
+ * {
+ *   if (!error)
+ *   {
+ *     // A signal occurred.
+ *   }
+ * }
+ *
+ * ...
+ *
+ * // Construct a signal set registered for process termination.
+ * asio::signal_set signals(io_context, SIGINT, SIGTERM);
+ *
+ * // Start an asynchronous wait for one of the signals to occur.
+ * signals.async_wait(handler);
+ * @endcode
+ *
+ * @par Queueing of signal notifications
+ *
+ * If a signal is registered with a signal_set, and the signal occurs when
+ * there are no waiting handlers, then the signal notification is queued. The
+ * next async_wait operation on that signal_set will dequeue the notification.
+ * If multiple notifications are queued, subsequent async_wait operations
+ * dequeue them one at a time. Signal notifications are dequeued in order of
+ * ascending signal number.
+ *
+ * If a signal number is removed from a signal_set (using the @c remove or @c
+ * erase member functions) then any queued notifications for that signal are
+ * discarded.
+ *
+ * @par Multiple registration of signals
+ *
+ * The same signal number may be registered with different signal_set objects.
+ * When the signal occurs, one handler is called for each signal_set object.
+ *
+ * Note that multiple registration only works for signals that are registered
+ * using Asio. The application must not also register a signal handler using
+ * functions such as @c signal() or @c sigaction().
+ *
+ * @par Signal masking on POSIX platforms
+ *
+ * POSIX allows signals to be blocked using functions such as @c sigprocmask()
+ * and @c pthread_sigmask(). For signals to be delivered, programs must ensure
+ * that any signals registered using signal_set objects are unblocked in at
+ * least one thread.
+ */
+class signal_set
+  : ASIO_SVC_ACCESS basic_io_object<detail::signal_set_service>
+{
+public:
+  /// The type of the executor associated with the object.
+  typedef io_context::executor_type executor_type;
+
+  /// Construct a signal set without adding any signals.
+  /**
+   * This constructor creates a signal set without registering for any signals.
+   *
+   * @param io_context The io_context object that the signal set will use to
+   * dispatch handlers for any asynchronous operations performed on the set.
+   */
+  explicit signal_set(asio::io_context& io_context)
+    : basic_io_object<detail::signal_set_service>(io_context)
+  {
+  }
+
+  /// Construct a signal set and add one signal.
+  /**
+   * This constructor creates a signal set and registers for one signal.
+   *
+   * @param io_context The io_context object that the signal set will use to
+   * dispatch handlers for any asynchronous operations performed on the set.
+   *
+   * @param signal_number_1 The signal number to be added.
+   *
+   * @note This constructor is equivalent to performing:
+   * @code asio::signal_set signals(io_context);
+   * signals.add(signal_number_1); @endcode
+   */
+  signal_set(asio::io_context& io_context, int signal_number_1)
+    : basic_io_object<detail::signal_set_service>(io_context)
+  {
+    asio::error_code ec;
+    this->get_service().add(this->get_implementation(), signal_number_1, ec);
+    asio::detail::throw_error(ec, "add");
+  }
+
+  /// Construct a signal set and add two signals.
+  /**
+   * This constructor creates a signal set and registers for two signals.
+   *
+   * @param io_context The io_context object that the signal set will use to
+   * dispatch handlers for any asynchronous operations performed on the set.
+   *
+   * @param signal_number_1 The first signal number to be added.
+   *
+   * @param signal_number_2 The second signal number to be added.
+   *
+   * @note This constructor is equivalent to performing:
+   * @code asio::signal_set signals(io_context);
+   * signals.add(signal_number_1);
+   * signals.add(signal_number_2); @endcode
+   */
+  signal_set(asio::io_context& io_context, int signal_number_1,
+      int signal_number_2)
+    : basic_io_object<detail::signal_set_service>(io_context)
+  {
+    asio::error_code ec;
+    this->get_service().add(this->get_implementation(), signal_number_1, ec);
+    asio::detail::throw_error(ec, "add");
+    this->get_service().add(this->get_implementation(), signal_number_2, ec);
+    asio::detail::throw_error(ec, "add");
+  }
+
+  /// Construct a signal set and add three signals.
+  /**
+   * This constructor creates a signal set and registers for three signals.
+   *
+   * @param io_context The io_context object that the signal set will use to
+   * dispatch handlers for any asynchronous operations performed on the set.
+   *
+   * @param signal_number_1 The first signal number to be added.
+   *
+   * @param signal_number_2 The second signal number to be added.
+   *
+   * @param signal_number_3 The third signal number to be added.
+   *
+   * @note This constructor is equivalent to performing:
+   * @code asio::signal_set signals(io_context);
+   * signals.add(signal_number_1);
+   * signals.add(signal_number_2);
+   * signals.add(signal_number_3); @endcode
+   */
+  signal_set(asio::io_context& io_context, int signal_number_1,
+      int signal_number_2, int signal_number_3)
+    : basic_io_object<detail::signal_set_service>(io_context)
+  {
+    asio::error_code ec;
+    this->get_service().add(this->get_implementation(), signal_number_1, ec);
+    asio::detail::throw_error(ec, "add");
+    this->get_service().add(this->get_implementation(), signal_number_2, ec);
+    asio::detail::throw_error(ec, "add");
+    this->get_service().add(this->get_implementation(), signal_number_3, ec);
+    asio::detail::throw_error(ec, "add");
+  }
+
+  /// Destroys the signal set.
+  /**
+   * This function destroys the signal set, cancelling any outstanding
+   * asynchronous wait operations associated with the signal set as if by
+   * calling @c cancel.
+   */
+  ~signal_set()
+  {
+  }
+
+#if !defined(ASIO_NO_DEPRECATED)
+  /// (Deprecated: Use get_executor().) Get the io_context associated with the
+  /// object.
+  /**
+   * This function may be used to obtain the io_context object that the I/O
+   * object uses to dispatch handlers for asynchronous operations.
+   *
+   * @return A reference to the io_context object that the I/O object will use
+   * to dispatch handlers. Ownership is not transferred to the caller.
+   */
+  asio::io_context& get_io_context()
+  {
+    return basic_io_object<detail::signal_set_service>::get_io_context();
+  }
+
+  /// (Deprecated: Use get_executor().) Get the io_context associated with the
+  /// object.
+  /**
+   * This function may be used to obtain the io_context object that the I/O
+   * object uses to dispatch handlers for asynchronous operations.
+   *
+   * @return A reference to the io_context object that the I/O object will use
+   * to dispatch handlers. Ownership is not transferred to the caller.
+   */
+  asio::io_context& get_io_service()
+  {
+    return basic_io_object<detail::signal_set_service>::get_io_service();
+  }
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+  /// Get the executor associated with the object.
+  executor_type get_executor() ASIO_NOEXCEPT
+  {
+    return basic_io_object<detail::signal_set_service>::get_executor();
+  }
+
+  /// Add a signal to a signal_set.
+  /**
+   * This function adds the specified signal to the set. It has no effect if the
+   * signal is already in the set.
+   *
+   * @param signal_number The signal to be added to the set.
+   *
+   * @throws asio::system_error Thrown on failure.
+   */
+  void add(int signal_number)
+  {
+    asio::error_code ec;
+    this->get_service().add(this->get_implementation(), signal_number, ec);
+    asio::detail::throw_error(ec, "add");
+  }
+
+  /// Add a signal to a signal_set.
+  /**
+   * This function adds the specified signal to the set. It has no effect if the
+   * signal is already in the set.
+   *
+   * @param signal_number The signal to be added to the set.
+   *
+   * @param ec Set to indicate what error occurred, if any.
+   */
+  asio::error_code add(int signal_number,
+      asio::error_code& ec)
+  {
+    return this->get_service().add(
+        this->get_implementation(), signal_number, ec);
+  }
+
+  /// Remove a signal from a signal_set.
+  /**
+   * This function removes the specified signal from the set. It has no effect
+   * if the signal is not in the set.
+   *
+   * @param signal_number The signal to be removed from the set.
+   *
+   * @throws asio::system_error Thrown on failure.
+   *
+   * @note Removes any notifications that have been queued for the specified
+   * signal number.
+   */
+  void remove(int signal_number)
+  {
+    asio::error_code ec;
+    this->get_service().remove(this->get_implementation(), signal_number, ec);
+    asio::detail::throw_error(ec, "remove");
+  }
+
+  /// Remove a signal from a signal_set.
+  /**
+   * This function removes the specified signal from the set. It has no effect
+   * if the signal is not in the set.
+   *
+   * @param signal_number The signal to be removed from the set.
+   *
+   * @param ec Set to indicate what error occurred, if any.
+   *
+   * @note Removes any notifications that have been queued for the specified
+   * signal number.
+   */
+  asio::error_code remove(int signal_number,
+      asio::error_code& ec)
+  {
+    return this->get_service().remove(
+        this->get_implementation(), signal_number, ec);
+  }
+
+  /// Remove all signals from a signal_set.
+  /**
+   * This function removes all signals from the set. It has no effect if the set
+   * is already empty.
+   *
+   * @throws asio::system_error Thrown on failure.
+   *
+   * @note Removes all queued notifications.
+   */
+  void clear()
+  {
+    asio::error_code ec;
+    this->get_service().clear(this->get_implementation(), ec);
+    asio::detail::throw_error(ec, "clear");
+  }
+
+  /// Remove all signals from a signal_set.
+  /**
+   * This function removes all signals from the set. It has no effect if the set
+   * is already empty.
+   *
+   * @param ec Set to indicate what error occurred, if any.
+   *
+   * @note Removes all queued notifications.
+   */
+  asio::error_code clear(asio::error_code& ec)
+  {
+    return this->get_service().clear(this->get_implementation(), ec);
+  }
+
+  /// Cancel all operations associated with the signal set.
+  /**
+   * This function forces the completion of any pending asynchronous wait
+   * operations against the signal set. The handler for each cancelled
+   * operation will be invoked with the asio::error::operation_aborted
+   * error code.
+   *
+   * Cancellation does not alter the set of registered signals.
+   *
+   * @throws asio::system_error Thrown on failure.
+   *
+   * @note If a registered signal occurred before cancel() is called, then the
+   * handlers for asynchronous wait operations will:
+   *
+   * @li have already been invoked; or
+   *
+   * @li have been queued for invocation in the near future.
+   *
+   * These handlers can no longer be cancelled, and therefore are passed an
+   * error code that indicates the successful completion of the wait operation.
+   */
+  void cancel()
+  {
+    asio::error_code ec;
+    this->get_service().cancel(this->get_implementation(), ec);
+    asio::detail::throw_error(ec, "cancel");
+  }
+
+  /// Cancel all operations associated with the signal set.
+  /**
+   * This function forces the completion of any pending asynchronous wait
+   * operations against the signal set. The handler for each cancelled
+   * operation will be invoked with the asio::error::operation_aborted
+   * error code.
+   *
+   * Cancellation does not alter the set of registered signals.
+   *
+   * @param ec Set to indicate what error occurred, if any.
+   *
+   * @note If a registered signal occurred before cancel() is called, then the
+   * handlers for asynchronous wait operations will:
+   *
+   * @li have already been invoked; or
+   *
+   * @li have been queued for invocation in the near future.
+   *
+   * These handlers can no longer be cancelled, and therefore are passed an
+   * error code that indicates the successful completion of the wait operation.
+   */
+  asio::error_code cancel(asio::error_code& ec)
+  {
+    return this->get_service().cancel(this->get_implementation(), ec);
+  }
+
+  /// Start an asynchronous operation to wait for a signal to be delivered.
+  /**
+   * This function may be used to initiate an asynchronous wait against the
+   * signal set. It always returns immediately.
+   *
+   * For each call to async_wait(), the supplied handler will be called exactly
+   * once. The handler will be called when:
+   *
+   * @li One of the registered signals in the signal set occurs; or
+   *
+   * @li The signal set was cancelled, in which case the handler is passed the
+   * error code asio::error::operation_aborted.
+   *
+   * @param handler The handler to be called when the signal occurs. Copies
+   * will be made of the handler as required. The function signature of the
+   * handler must be:
+   * @code void handler(
+   *   const asio::error_code& error, // Result of operation.
+   *   int signal_number // Indicates which signal occurred.
+   * ); @endcode
+   * Regardless of whether the asynchronous operation completes immediately or
+   * not, the handler will not be invoked from within this function. Invocation
+   * of the handler will be performed in a manner equivalent to using
+   * asio::io_context::post().
+   */
+  template <typename SignalHandler>
+  ASIO_INITFN_RESULT_TYPE(SignalHandler,
+      void (asio::error_code, int))
+  async_wait(ASIO_MOVE_ARG(SignalHandler) handler)
+  {
+    // If you get an error on the following line it means that your handler does
+    // not meet the documented type requirements for a SignalHandler.
+    ASIO_SIGNAL_HANDLER_CHECK(SignalHandler, handler) type_check;
+
+    async_completion<SignalHandler,
+      void (asio::error_code, int)> init(handler);
+
+    this->get_service().async_wait(this->get_implementation(), init.handler);
+
+    return init.result.get();
+  }
+};
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
 
 } // namespace asio
 
diff --git a/asio/include/asio/signal_set_service.hpp b/asio/include/asio/signal_set_service.hpp
index a4e4b27..2dca96c 100644
--- a/asio/include/asio/signal_set_service.hpp
+++ b/asio/include/asio/signal_set_service.hpp
@@ -16,6 +16,9 @@
 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
 
 #include "asio/detail/config.hpp"
+
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+
 #include "asio/async_result.hpp"
 #include "asio/detail/signal_set_service.hpp"
 #include "asio/error.hpp"
@@ -130,4 +133,6 @@
 
 #include "asio/detail/pop_options.hpp"
 
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
+
 #endif // ASIO_SIGNAL_SET_SERVICE_HPP
diff --git a/asio/include/asio/socket_acceptor_service.hpp b/asio/include/asio/socket_acceptor_service.hpp
index 157177d..f8eca27 100644
--- a/asio/include/asio/socket_acceptor_service.hpp
+++ b/asio/include/asio/socket_acceptor_service.hpp
@@ -16,6 +16,9 @@
 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
 
 #include "asio/detail/config.hpp"
+
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+
 #include "asio/basic_socket.hpp"
 #include "asio/detail/type_traits.hpp"
 #include "asio/error.hpp"
@@ -339,4 +342,6 @@
 
 #include "asio/detail/pop_options.hpp"
 
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
+
 #endif // ASIO_SOCKET_ACCEPTOR_SERVICE_HPP
diff --git a/asio/include/asio/stream_socket_service.hpp b/asio/include/asio/stream_socket_service.hpp
index 6cee6ca..710111c 100644
--- a/asio/include/asio/stream_socket_service.hpp
+++ b/asio/include/asio/stream_socket_service.hpp
@@ -16,6 +16,9 @@
 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
 
 #include "asio/detail/config.hpp"
+
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+
 #include <cstddef>
 #include "asio/async_result.hpp"
 #include "asio/detail/type_traits.hpp"
@@ -381,4 +384,6 @@
 
 #include "asio/detail/pop_options.hpp"
 
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
+
 #endif // ASIO_STREAM_SOCKET_SERVICE_HPP
diff --git a/asio/include/asio/waitable_timer_service.hpp b/asio/include/asio/waitable_timer_service.hpp
index 3011594..0e403e5 100644
--- a/asio/include/asio/waitable_timer_service.hpp
+++ b/asio/include/asio/waitable_timer_service.hpp
@@ -16,6 +16,9 @@
 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
 
 #include "asio/detail/config.hpp"
+
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+
 #include <cstddef>
 #include "asio/async_result.hpp"
 #include "asio/detail/chrono_time_traits.hpp"
@@ -202,4 +205,6 @@
 
 #include "asio/detail/pop_options.hpp"
 
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
+
 #endif // ASIO_WAITABLE_TIMER_SERVICE_HPP
diff --git a/asio/include/asio/windows/basic_handle.hpp b/asio/include/asio/windows/basic_handle.hpp
index 6ef8225..d4aeaf7 100644
--- a/asio/include/asio/windows/basic_handle.hpp
+++ b/asio/include/asio/windows/basic_handle.hpp
@@ -17,6 +17,8 @@
 
 #include "asio/detail/config.hpp"
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+
 #if defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE) \
   || defined(ASIO_HAS_WINDOWS_STREAM_HANDLE) \
   || defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE) \
@@ -263,4 +265,6 @@
        //   || defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE)
        //   || defined(GENERATING_DOCUMENTATION)
 
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
+
 #endif // ASIO_WINDOWS_BASIC_HANDLE_HPP
diff --git a/asio/include/asio/windows/basic_object_handle.hpp b/asio/include/asio/windows/basic_object_handle.hpp
index 8bfce46..9cb47c2 100644
--- a/asio/include/asio/windows/basic_object_handle.hpp
+++ b/asio/include/asio/windows/basic_object_handle.hpp
@@ -18,6 +18,8 @@
 
 #include "asio/detail/config.hpp"
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+
 #if defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE) \
   || defined(GENERATING_DOCUMENTATION)
 
@@ -175,4 +177,6 @@
 #endif // defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE)
        //   || defined(GENERATING_DOCUMENTATION)
 
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
+
 #endif // ASIO_WINDOWS_BASIC_OBJECT_HANDLE_HPP
diff --git a/asio/include/asio/windows/basic_random_access_handle.hpp b/asio/include/asio/windows/basic_random_access_handle.hpp
index 9a66a13..0301567 100644
--- a/asio/include/asio/windows/basic_random_access_handle.hpp
+++ b/asio/include/asio/windows/basic_random_access_handle.hpp
@@ -17,6 +17,8 @@
 
 #include "asio/detail/config.hpp"
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+
 #if defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE) \
   || defined(GENERATING_DOCUMENTATION)
 
@@ -369,4 +371,6 @@
 #endif // defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE)
        //   || defined(GENERATING_DOCUMENTATION)
 
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
+
 #endif // ASIO_WINDOWS_BASIC_RANDOM_ACCESS_HANDLE_HPP
diff --git a/asio/include/asio/windows/basic_stream_handle.hpp b/asio/include/asio/windows/basic_stream_handle.hpp
index ec2ff0d..4c16d1c 100644
--- a/asio/include/asio/windows/basic_stream_handle.hpp
+++ b/asio/include/asio/windows/basic_stream_handle.hpp
@@ -17,6 +17,8 @@
 
 #include "asio/detail/config.hpp"
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+
 #if defined(ASIO_HAS_WINDOWS_STREAM_HANDLE) \
   || defined(GENERATING_DOCUMENTATION)
 
@@ -352,4 +354,6 @@
 #endif // defined(ASIO_HAS_WINDOWS_STREAM_HANDLE)
        //   || defined(GENERATING_DOCUMENTATION)
 
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
+
 #endif // ASIO_WINDOWS_BASIC_STREAM_HANDLE_HPP
diff --git a/asio/include/asio/windows/object_handle.hpp b/asio/include/asio/windows/object_handle.hpp
index f4162e1..5efd568 100644
--- a/asio/include/asio/windows/object_handle.hpp
+++ b/asio/include/asio/windows/object_handle.hpp
@@ -21,17 +21,356 @@
 #if defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE) \
   || defined(GENERATING_DOCUMENTATION)
 
-#include "asio/windows/basic_object_handle.hpp"
+#include "asio/async_result.hpp"
+#include "asio/basic_io_object.hpp"
+#include "asio/detail/throw_error.hpp"
+#include "asio/detail/win_object_handle_service.hpp"
+#include "asio/error.hpp"
+#include "asio/io_context.hpp"
+
+#if defined(ASIO_HAS_MOVE)
+# include <utility>
+#endif // defined(ASIO_HAS_MOVE)
+
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+# include "asio/windows/basic_object_handle.hpp"
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
+
+#define ASIO_SVC_T asio::detail::win_object_handle_service
+
+#include "asio/detail/push_options.hpp"
 
 namespace asio {
 namespace windows {
 
-/// Typedef for the typical usage of an object handle.
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+// Typedef for the typical usage of an object handle.
 typedef basic_object_handle<> object_handle;
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+/// Provides object-oriented handle functionality.
+/**
+ * The windows::object_handle class provides asynchronous and blocking
+ * object-oriented handle functionality.
+ *
+ * @par Thread Safety
+ * @e Distinct @e objects: Safe.@n
+ * @e Shared @e objects: Unsafe.
+ */
+class object_handle
+  : ASIO_SVC_ACCESS basic_io_object<ASIO_SVC_T>
+{
+public:
+  /// The type of the executor associated with the object.
+  typedef io_context::executor_type executor_type;
+
+  /// The native representation of a handle.
+#if defined(GENERATING_DOCUMENTATION)
+  typedef implementation_defined native_handle_type;
+#else
+  typedef ASIO_SVC_T::native_handle_type native_handle_type;
+#endif
+
+  /// An object_handle is always the lowest layer.
+  typedef object_handle lowest_layer_type;
+
+  /// Construct an object_handle without opening it.
+  /**
+   * This constructor creates an object handle without opening it.
+   *
+   * @param io_context The io_context object that the object handle will use to
+   * dispatch handlers for any asynchronous operations performed on the handle.
+   */
+  explicit object_handle(asio::io_context& io_context)
+    : basic_io_object<ASIO_SVC_T>(io_context)
+  {
+  }
+
+  /// Construct an object_handle on an existing native handle.
+  /**
+   * This constructor creates an object handle object to hold an existing native
+   * handle.
+   *
+   * @param io_context The io_context object that the object handle will use to
+   * dispatch handlers for any asynchronous operations performed on the handle.
+   *
+   * @param native_handle The new underlying handle implementation.
+   *
+   * @throws asio::system_error Thrown on failure.
+   */
+  object_handle(asio::io_context& io_context,
+      const native_handle_type& native_handle)
+    : basic_io_object<ASIO_SVC_T>(io_context)
+  {
+    asio::error_code ec;
+    this->get_service().assign(this->get_implementation(), native_handle, ec);
+    asio::detail::throw_error(ec, "assign");
+  }
+
+#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+  /// Move-construct an object_handle from another.
+  /**
+   * This constructor moves an object handle from one object to another.
+   *
+   * @param other The other object_handle object from which the move will
+   * occur.
+   *
+   * @note Following the move, the moved-from object is in the same state as if
+   * constructed using the @c object_handle(io_context&) constructor.
+   */
+  object_handle(object_handle&& other)
+    : basic_io_object<ASIO_SVC_T>(std::move(other))
+  {
+  }
+
+  /// Move-assign an object_handle from another.
+  /**
+   * This assignment operator moves an object handle from one object to another.
+   *
+   * @param other The other object_handle object from which the move will
+   * occur.
+   *
+   * @note Following the move, the moved-from object is in the same state as if
+   * constructed using the @c object_handle(io_context&) constructor.
+   */
+  object_handle& operator=(object_handle&& other)
+  {
+    basic_io_object<ASIO_SVC_T>::operator=(std::move(other));
+    return *this;
+  }
+#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+
+#if !defined(ASIO_NO_DEPRECATED)
+  /// (Deprecated: Use get_executor().) Get the io_context associated with the
+  /// object.
+  /**
+   * This function may be used to obtain the io_context object that the I/O
+   * object uses to dispatch handlers for asynchronous operations.
+   *
+   * @return A reference to the io_context object that the I/O object will use
+   * to dispatch handlers. Ownership is not transferred to the caller.
+   */
+  asio::io_context& get_io_context()
+  {
+    return basic_io_object<ASIO_SVC_T>::get_io_context();
+  }
+
+  /// (Deprecated: Use get_executor().) Get the io_context associated with the
+  /// object.
+  /**
+   * This function may be used to obtain the io_context object that the I/O
+   * object uses to dispatch handlers for asynchronous operations.
+   *
+   * @return A reference to the io_context object that the I/O object will use
+   * to dispatch handlers. Ownership is not transferred to the caller.
+   */
+  asio::io_context& get_io_service()
+  {
+    return basic_io_object<ASIO_SVC_T>::get_io_service();
+  }
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+  /// Get the executor associated with the object.
+  executor_type get_executor() ASIO_NOEXCEPT
+  {
+    return basic_io_object<ASIO_SVC_T>::get_executor();
+  }
+
+  /// Get a reference to the lowest layer.
+  /**
+   * This function returns a reference to the lowest layer in a stack of
+   * layers. Since an object_handle cannot contain any further layers, it simply
+   * returns a reference to itself.
+   *
+   * @return A reference to the lowest layer in the stack of layers. Ownership
+   * is not transferred to the caller.
+   */
+  lowest_layer_type& lowest_layer()
+  {
+    return *this;
+  }
+
+  /// Get a const reference to the lowest layer.
+  /**
+   * This function returns a const reference to the lowest layer in a stack of
+   * layers. Since an object_handle cannot contain any further layers, it simply
+   * returns a reference to itself.
+   *
+   * @return A const reference to the lowest layer in the stack of layers.
+   * Ownership is not transferred to the caller.
+   */
+  const lowest_layer_type& lowest_layer() const
+  {
+    return *this;
+  }
+
+  /// Assign an existing native handle to the handle.
+  /*
+   * This function opens the handle to hold an existing native handle.
+   *
+   * @param handle A native handle.
+   *
+   * @throws asio::system_error Thrown on failure.
+   */
+  void assign(const native_handle_type& handle)
+  {
+    asio::error_code ec;
+    this->get_service().assign(this->get_implementation(), handle, ec);
+    asio::detail::throw_error(ec, "assign");
+  }
+
+  /// Assign an existing native handle to the handle.
+  /*
+   * This function opens the handle to hold an existing native handle.
+   *
+   * @param handle A native handle.
+   *
+   * @param ec Set to indicate what error occurred, if any.
+   */
+  asio::error_code assign(const native_handle_type& handle,
+      asio::error_code& ec)
+  {
+    return this->get_service().assign(this->get_implementation(), handle, ec);
+  }
+
+  /// Determine whether the handle is open.
+  bool is_open() const
+  {
+    return this->get_service().is_open(this->get_implementation());
+  }
+
+  /// Close the handle.
+  /**
+   * This function is used to close the handle. Any asynchronous read or write
+   * operations will be cancelled immediately, and will complete with the
+   * asio::error::operation_aborted error.
+   *
+   * @throws asio::system_error Thrown on failure.
+   */
+  void close()
+  {
+    asio::error_code ec;
+    this->get_service().close(this->get_implementation(), ec);
+    asio::detail::throw_error(ec, "close");
+  }
+
+  /// Close the handle.
+  /**
+   * This function is used to close the handle. Any asynchronous read or write
+   * operations will be cancelled immediately, and will complete with the
+   * asio::error::operation_aborted error.
+   *
+   * @param ec Set to indicate what error occurred, if any.
+   */
+  asio::error_code close(asio::error_code& ec)
+  {
+    return this->get_service().close(this->get_implementation(), ec);
+  }
+
+  /// Get the native handle representation.
+  /**
+   * This function may be used to obtain the underlying representation of the
+   * handle. This is intended to allow access to native handle functionality
+   * that is not otherwise provided.
+   */
+  native_handle_type native_handle()
+  {
+    return this->get_service().native_handle(this->get_implementation());
+  }
+
+  /// Cancel all asynchronous operations associated with the handle.
+  /**
+   * This function causes all outstanding asynchronous read or write operations
+   * to finish immediately, and the handlers for cancelled operations will be
+   * passed the asio::error::operation_aborted error.
+   *
+   * @throws asio::system_error Thrown on failure.
+   */
+  void cancel()
+  {
+    asio::error_code ec;
+    this->get_service().cancel(this->get_implementation(), ec);
+    asio::detail::throw_error(ec, "cancel");
+  }
+
+  /// Cancel all asynchronous operations associated with the handle.
+  /**
+   * This function causes all outstanding asynchronous read or write operations
+   * to finish immediately, and the handlers for cancelled operations will be
+   * passed the asio::error::operation_aborted error.
+   *
+   * @param ec Set to indicate what error occurred, if any.
+   */
+  asio::error_code cancel(asio::error_code& ec)
+  {
+    return this->get_service().cancel(this->get_implementation(), ec);
+  }
+
+  /// Perform a blocking wait on the object handle.
+  /**
+   * This function is used to wait for the object handle to be set to the
+   * signalled state. This function blocks and does not return until the object
+   * handle has been set to the signalled state.
+   *
+   * @throws asio::system_error Thrown on failure.
+   */
+  void wait()
+  {
+    asio::error_code ec;
+    this->get_service().wait(this->get_implementation(), ec);
+    asio::detail::throw_error(ec, "wait");
+  }
+
+  /// Perform a blocking wait on the object handle.
+  /**
+   * This function is used to wait for the object handle to be set to the
+   * signalled state. This function blocks and does not return until the object
+   * handle has been set to the signalled state.
+   *
+   * @param ec Set to indicate what error occurred, if any.
+   */
+  void wait(asio::error_code& ec)
+  {
+    this->get_service().wait(this->get_implementation(), ec);
+  }
+
+  /// Start an asynchronous wait on the object handle.
+  /**
+   * This function is be used to initiate an asynchronous wait against the
+   * object handle. It always returns immediately.
+   *
+   * @param handler The handler to be called when the object handle is set to
+   * the signalled state. Copies will be made of the handler as required. The
+   * function signature of the handler must be:
+   * @code void handler(
+   *   const asio::error_code& error // Result of operation.
+   * ); @endcode
+   * Regardless of whether the asynchronous operation completes immediately or
+   * not, the handler will not be invoked from within this function. Invocation
+   * of the handler will be performed in a manner equivalent to using
+   * asio::io_context::post().
+   */
+  template <typename WaitHandler>
+  ASIO_INITFN_RESULT_TYPE(WaitHandler,
+      void (asio::error_code))
+  async_wait(ASIO_MOVE_ARG(WaitHandler) handler)
+  {
+    asio::async_completion<WaitHandler,
+      void (asio::error_code)> init(handler);
+
+    this->get_service().async_wait(this->get_implementation(), init.handler);
+
+    return init.result.get();
+  }
+};
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
 
 } // namespace windows
 } // namespace asio
 
+#include "asio/detail/pop_options.hpp"
+
+#undef ASIO_SVC_T
+
 #endif // defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE)
        //   || defined(GENERATING_DOCUMENTATION)
 
diff --git a/asio/include/asio/windows/object_handle_service.hpp b/asio/include/asio/windows/object_handle_service.hpp
index 86c9a4f..3db6732 100644
--- a/asio/include/asio/windows/object_handle_service.hpp
+++ b/asio/include/asio/windows/object_handle_service.hpp
@@ -18,6 +18,8 @@
 
 #include "asio/detail/config.hpp"
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+
 #if defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE) \
   || defined(GENERATING_DOCUMENTATION)
 
@@ -173,4 +175,6 @@
 #endif // defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE)
        //   || defined(GENERATING_DOCUMENTATION)
 
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
+
 #endif // ASIO_WINDOWS_OBJECT_HANDLE_SERVICE_HPP
diff --git a/asio/include/asio/windows/overlapped_handle.hpp b/asio/include/asio/windows/overlapped_handle.hpp
new file mode 100644
index 0000000..5d224fc
--- /dev/null
+++ b/asio/include/asio/windows/overlapped_handle.hpp
@@ -0,0 +1,328 @@
+//
+// windows/overlapped_handle.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_WINDOWS_OVERLAPPED_HANDLE_HPP
+#define ASIO_WINDOWS_OVERLAPPED_HANDLE_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+
+#if !defined(ASIO_ENABLE_OLD_SERVICES)
+
+#if defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE) \
+  || defined(ASIO_HAS_WINDOWS_STREAM_HANDLE) \
+  || defined(GENERATING_DOCUMENTATION)
+
+#include <cstddef>
+#include "asio/async_result.hpp"
+#include "asio/basic_io_object.hpp"
+#include "asio/detail/throw_error.hpp"
+#include "asio/detail/win_iocp_handle_service.hpp"
+#include "asio/error.hpp"
+#include "asio/io_context.hpp"
+
+#if defined(ASIO_HAS_MOVE)
+# include <utility>
+#endif // defined(ASIO_HAS_MOVE)
+
+#define ASIO_SVC_T asio::detail::win_iocp_handle_service
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace windows {
+
+/// Provides Windows handle functionality for objects that support
+/// overlapped I/O.
+/**
+ * The windows::overlapped_handle class provides the ability to wrap a Windows
+ * handle. The underlying object referred to by the handle must support
+ * overlapped I/O.
+ *
+ * @par Thread Safety
+ * @e Distinct @e objects: Safe.@n
+ * @e Shared @e objects: Unsafe.
+ */
+class overlapped_handle
+  : ASIO_SVC_ACCESS basic_io_object<ASIO_SVC_T>
+{
+public:
+  /// The type of the executor associated with the object.
+  typedef io_context::executor_type executor_type;
+
+  /// The native representation of a handle.
+#if defined(GENERATING_DOCUMENTATION)
+  typedef implementation_defined native_handle_type;
+#else
+  typedef ASIO_SVC_T::native_handle_type native_handle_type;
+#endif
+
+  /// An overlapped_handle is always the lowest layer.
+  typedef overlapped_handle lowest_layer_type;
+
+  /// Construct an overlapped_handle without opening it.
+  /**
+   * This constructor creates a handle without opening it.
+   *
+   * @param io_context The io_context object that the handle will use to
+   * dispatch handlers for any asynchronous operations performed on the handle.
+   */
+  explicit overlapped_handle(asio::io_context& io_context)
+    : basic_io_object<ASIO_SVC_T>(io_context)
+  {
+  }
+
+  /// Construct an overlapped_handle on an existing native handle.
+  /**
+   * This constructor creates a handle object to hold an existing native handle.
+   *
+   * @param io_context The io_context object that the handle will use to
+   * dispatch handlers for any asynchronous operations performed on the handle.
+   *
+   * @param handle A native handle.
+   *
+   * @throws asio::system_error Thrown on failure.
+   */
+  overlapped_handle(asio::io_context& io_context,
+      const native_handle_type& handle)
+    : basic_io_object<ASIO_SVC_T>(io_context)
+  {
+    asio::error_code ec;
+    this->get_service().assign(this->get_implementation(), handle, ec);
+    asio::detail::throw_error(ec, "assign");
+  }
+
+#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+  /// Move-construct an overlapped_handle from another.
+  /**
+   * This constructor moves a handle from one object to another.
+   *
+   * @param other The other overlapped_handle object from which the move will
+   * occur.
+   *
+   * @note Following the move, the moved-from object is in the same state as if
+   * constructed using the @c overlapped_handle(io_context&) constructor.
+   */
+  overlapped_handle(overlapped_handle&& other)
+    : basic_io_object<ASIO_SVC_T>(std::move(other))
+  {
+  }
+
+  /// Move-assign an overlapped_handle from another.
+  /**
+   * This assignment operator moves a handle from one object to another.
+   *
+   * @param other The other overlapped_handle object from which the move will
+   * occur.
+   *
+   * @note Following the move, the moved-from object is in the same state as if
+   * constructed using the @c overlapped_handle(io_context&) constructor.
+   */
+  overlapped_handle& operator=(overlapped_handle&& other)
+  {
+    basic_io_object<ASIO_SVC_T>::operator=(std::move(other));
+    return *this;
+  }
+#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+
+#if !defined(ASIO_NO_DEPRECATED)
+  /// (Deprecated: Use get_executor().) Get the io_context associated with the
+  /// object.
+  /**
+   * This function may be used to obtain the io_context object that the I/O
+   * object uses to dispatch handlers for asynchronous operations.
+   *
+   * @return A reference to the io_context object that the I/O object will use
+   * to dispatch handlers. Ownership is not transferred to the caller.
+   */
+  asio::io_context& get_io_context()
+  {
+    return basic_io_object<ASIO_SVC_T>::get_io_context();
+  }
+
+  /// (Deprecated: Use get_executor().) Get the io_context associated with the
+  /// object.
+  /**
+   * This function may be used to obtain the io_context object that the I/O
+   * object uses to dispatch handlers for asynchronous operations.
+   *
+   * @return A reference to the io_context object that the I/O object will use
+   * to dispatch handlers. Ownership is not transferred to the caller.
+   */
+  asio::io_context& get_io_service()
+  {
+    return basic_io_object<ASIO_SVC_T>::get_io_service();
+  }
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+  /// Get the executor associated with the object.
+  executor_type get_executor() ASIO_NOEXCEPT
+  {
+    return basic_io_object<ASIO_SVC_T>::get_executor();
+  }
+
+  /// Get a reference to the lowest layer.
+  /**
+   * This function returns a reference to the lowest layer in a stack of
+   * layers. Since an overlapped_handle cannot contain any further layers, it
+   * simply returns a reference to itself.
+   *
+   * @return A reference to the lowest layer in the stack of layers. Ownership
+   * is not transferred to the caller.
+   */
+  lowest_layer_type& lowest_layer()
+  {
+    return *this;
+  }
+
+  /// Get a const reference to the lowest layer.
+  /**
+   * This function returns a const reference to the lowest layer in a stack of
+   * layers. Since an overlapped_handle cannot contain any further layers, it
+   * simply returns a reference to itself.
+   *
+   * @return A const reference to the lowest layer in the stack of layers.
+   * Ownership is not transferred to the caller.
+   */
+  const lowest_layer_type& lowest_layer() const
+  {
+    return *this;
+  }
+
+  /// Assign an existing native handle to the handle.
+  /*
+   * This function opens the handle to hold an existing native handle.
+   *
+   * @param handle A native handle.
+   *
+   * @throws asio::system_error Thrown on failure.
+   */
+  void assign(const native_handle_type& handle)
+  {
+    asio::error_code ec;
+    this->get_service().assign(this->get_implementation(), handle, ec);
+    asio::detail::throw_error(ec, "assign");
+  }
+
+  /// Assign an existing native handle to the handle.
+  /*
+   * This function opens the handle to hold an existing native handle.
+   *
+   * @param handle A native handle.
+   *
+   * @param ec Set to indicate what error occurred, if any.
+   */
+  asio::error_code assign(const native_handle_type& handle,
+      asio::error_code& ec)
+  {
+    return this->get_service().assign(this->get_implementation(), handle, ec);
+  }
+
+  /// Determine whether the handle is open.
+  bool is_open() const
+  {
+    return this->get_service().is_open(this->get_implementation());
+  }
+
+  /// Close the handle.
+  /**
+   * This function is used to close the handle. Any asynchronous read or write
+   * operations will be cancelled immediately, and will complete with the
+   * asio::error::operation_aborted error.
+   *
+   * @throws asio::system_error Thrown on failure.
+   */
+  void close()
+  {
+    asio::error_code ec;
+    this->get_service().close(this->get_implementation(), ec);
+    asio::detail::throw_error(ec, "close");
+  }
+
+  /// Close the handle.
+  /**
+   * This function is used to close the handle. Any asynchronous read or write
+   * operations will be cancelled immediately, and will complete with the
+   * asio::error::operation_aborted error.
+   *
+   * @param ec Set to indicate what error occurred, if any.
+   */
+  asio::error_code close(asio::error_code& ec)
+  {
+    return this->get_service().close(this->get_implementation(), ec);
+  }
+
+  /// Get the native handle representation.
+  /**
+   * This function may be used to obtain the underlying representation of the
+   * handle. This is intended to allow access to native handle functionality
+   * that is not otherwise provided.
+   */
+  native_handle_type native_handle()
+  {
+    return this->get_service().native_handle(this->get_implementation());
+  }
+
+  /// Cancel all asynchronous operations associated with the handle.
+  /**
+   * This function causes all outstanding asynchronous read or write operations
+   * to finish immediately, and the handlers for cancelled operations will be
+   * passed the asio::error::operation_aborted error.
+   *
+   * @throws asio::system_error Thrown on failure.
+   */
+  void cancel()
+  {
+    asio::error_code ec;
+    this->get_service().cancel(this->get_implementation(), ec);
+    asio::detail::throw_error(ec, "cancel");
+  }
+
+  /// Cancel all asynchronous operations associated with the handle.
+  /**
+   * This function causes all outstanding asynchronous read or write operations
+   * to finish immediately, and the handlers for cancelled operations will be
+   * passed the asio::error::operation_aborted error.
+   *
+   * @param ec Set to indicate what error occurred, if any.
+   */
+  asio::error_code cancel(asio::error_code& ec)
+  {
+    return this->get_service().cancel(this->get_implementation(), ec);
+  }
+
+protected:
+  /// Protected destructor to prevent deletion through this type.
+  /**
+   * This function destroys the handle, cancelling any outstanding asynchronous
+   * wait operations associated with the handle as if by calling @c cancel.
+   */
+  ~overlapped_handle()
+  {
+  }
+};
+
+} // namespace windows
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#undef ASIO_SVC_T
+
+#endif // defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE)
+       //   || defined(ASIO_HAS_WINDOWS_STREAM_HANDLE)
+       //   || defined(GENERATING_DOCUMENTATION)
+
+#endif // !defined(ASIO_ENABLE_OLD_SERVICES)
+
+#endif // ASIO_WINDOWS_OVERLAPPED_HANDLE_HPP
diff --git a/asio/include/asio/windows/random_access_handle.hpp b/asio/include/asio/windows/random_access_handle.hpp
index 9677723..b57e80c 100644
--- a/asio/include/asio/windows/random_access_handle.hpp
+++ b/asio/include/asio/windows/random_access_handle.hpp
@@ -16,21 +16,362 @@
 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
 
 #include "asio/detail/config.hpp"
+#include "asio/windows/overlapped_handle.hpp"
 
 #if defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE) \
   || defined(GENERATING_DOCUMENTATION)
 
-#include "asio/windows/basic_random_access_handle.hpp"
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+# include "asio/windows/basic_random_access_handle.hpp"
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
+
+#include "asio/detail/push_options.hpp"
 
 namespace asio {
 namespace windows {
 
-/// Typedef for the typical usage of a random-access handle.
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+// Typedef for the typical usage of a random-access handle.
 typedef basic_random_access_handle<> random_access_handle;
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+/// Provides random-access handle functionality.
+/**
+ * The windows::random_access_handle class provides asynchronous and
+ * blocking random-access handle functionality.
+ *
+ * @par Thread Safety
+ * @e Distinct @e objects: Safe.@n
+ * @e Shared @e objects: Unsafe.
+ */
+class random_access_handle
+  : public overlapped_handle
+{
+public:
+  /// Construct a random_access_handle without opening it.
+  /**
+   * This constructor creates a random-access handle without opening it. The
+   * handle needs to be opened before data can be written to or read from it.
+   *
+   * @param io_context The io_context object that the random-access handle will
+   * use to dispatch handlers for any asynchronous operations performed on the
+   * handle.
+   */
+  explicit random_access_handle(asio::io_context& io_context)
+    : overlapped_handle(io_context)
+  {
+  }
+
+  /// Construct a random_access_handle on an existing native handle.
+  /**
+   * This constructor creates a random-access handle object to hold an existing
+   * native handle.
+   *
+   * @param io_context The io_context object that the random-access handle will
+   * use to dispatch handlers for any asynchronous operations performed on the
+   * handle.
+   *
+   * @param handle The new underlying handle implementation.
+   *
+   * @throws asio::system_error Thrown on failure.
+   */
+  random_access_handle(asio::io_context& io_context,
+      const native_handle_type& handle)
+    : overlapped_handle(io_context, handle)
+  {
+  }
+
+#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+  /// Move-construct a random_access_handle from another.
+  /**
+   * This constructor moves a random-access handle from one object to another.
+   *
+   * @param other The other random_access_handle object from which the
+   * move will occur.
+   *
+   * @note Following the move, the moved-from object is in the same state as if
+   * constructed using the @c random_access_handle(io_context&)
+   * constructor.
+   */
+  random_access_handle(random_access_handle&& other)
+    : overlapped_handle(std::move(other))
+  {
+  }
+
+  /// Move-assign a random_access_handle from another.
+  /**
+   * This assignment operator moves a random-access handle from one object to
+   * another.
+   *
+   * @param other The other random_access_handle object from which the
+   * move will occur.
+   *
+   * @note Following the move, the moved-from object is in the same state as if
+   * constructed using the @c random_access_handle(io_context&)
+   * constructor.
+   */
+  random_access_handle& operator=(random_access_handle&& other)
+  {
+    overlapped_handle::operator=(std::move(other));
+    return *this;
+  }
+#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+
+  /// Write some data to the handle at the specified offset.
+  /**
+   * This function is used to write data to the random-access handle. The
+   * function call will block until one or more bytes of the data has been
+   * written successfully, or until an error occurs.
+   *
+   * @param offset The offset at which the data will be written.
+   *
+   * @param buffers One or more data buffers to be written to the handle.
+   *
+   * @returns The number of bytes written.
+   *
+   * @throws asio::system_error Thrown on failure. An error code of
+   * asio::error::eof indicates that the connection was closed by the
+   * peer.
+   *
+   * @note The write_some_at operation may not write all of the data. Consider
+   * using the @ref write_at function if you need to ensure that all data is
+   * written before the blocking operation completes.
+   *
+   * @par Example
+   * To write a single data buffer use the @ref buffer function as follows:
+   * @code
+   * handle.write_some_at(42, asio::buffer(data, size));
+   * @endcode
+   * See the @ref buffer documentation for information on writing multiple
+   * buffers in one go, and how to use it with arrays, boost::array or
+   * std::vector.
+   */
+  template <typename ConstBufferSequence>
+  std::size_t write_some_at(uint64_t offset,
+      const ConstBufferSequence& buffers)
+  {
+    asio::error_code ec;
+    std::size_t s = this->get_service().write_some_at(
+        this->get_implementation(), offset, buffers, ec);
+    asio::detail::throw_error(ec, "write_some_at");
+    return s;
+  }
+
+  /// Write some data to the handle at the specified offset.
+  /**
+   * This function is used to write data to the random-access handle. The
+   * function call will block until one or more bytes of the data has been
+   * written successfully, or until an error occurs.
+   *
+   * @param offset The offset at which the data will be written.
+   *
+   * @param buffers One or more data buffers to be written to the handle.
+   *
+   * @param ec Set to indicate what error occurred, if any.
+   *
+   * @returns The number of bytes written. Returns 0 if an error occurred.
+   *
+   * @note The write_some operation may not transmit all of the data to the
+   * peer. Consider using the @ref write_at function if you need to ensure that
+   * all data is written before the blocking operation completes.
+   */
+  template <typename ConstBufferSequence>
+  std::size_t write_some_at(uint64_t offset,
+      const ConstBufferSequence& buffers, asio::error_code& ec)
+  {
+    return this->get_service().write_some_at(
+        this->get_implementation(), offset, buffers, ec);
+  }
+
+  /// Start an asynchronous write at the specified offset.
+  /**
+   * This function is used to asynchronously write data to the random-access
+   * handle. The function call always returns immediately.
+   *
+   * @param offset The offset at which the data will be written.
+   *
+   * @param buffers One or more data buffers to be written to the handle.
+   * Although the buffers object may be copied as necessary, ownership of the
+   * underlying memory blocks is retained by the caller, which must guarantee
+   * that they remain valid until the handler is called.
+   *
+   * @param handler The handler to be called when the write operation completes.
+   * Copies will be made of the handler as required. The function signature of
+   * the handler must be:
+   * @code void handler(
+   *   const asio::error_code& error, // Result of operation.
+   *   std::size_t bytes_transferred           // Number of bytes written.
+   * ); @endcode
+   * Regardless of whether the asynchronous operation completes immediately or
+   * not, the handler will not be invoked from within this function. Invocation
+   * of the handler will be performed in a manner equivalent to using
+   * asio::io_context::post().
+   *
+   * @note The write operation may not transmit all of the data to the peer.
+   * Consider using the @ref async_write_at function if you need to ensure that
+   * all data is written before the asynchronous operation completes.
+   *
+   * @par Example
+   * To write a single data buffer use the @ref buffer function as follows:
+   * @code
+   * handle.async_write_some_at(42, asio::buffer(data, size), handler);
+   * @endcode
+   * See the @ref buffer documentation for information on writing multiple
+   * buffers in one go, and how to use it with arrays, boost::array or
+   * std::vector.
+   */
+  template <typename ConstBufferSequence, typename WriteHandler>
+  ASIO_INITFN_RESULT_TYPE(WriteHandler,
+      void (asio::error_code, std::size_t))
+  async_write_some_at(uint64_t offset,
+      const ConstBufferSequence& buffers,
+      ASIO_MOVE_ARG(WriteHandler) handler)
+  {
+    // If you get an error on the following line it means that your handler does
+    // not meet the documented type requirements for a WriteHandler.
+    ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
+
+    asio::async_completion<WriteHandler,
+      void (asio::error_code, std::size_t)> init(handler);
+
+    this->get_service().async_write_some_at(this->get_implementation(),
+        offset, buffers, init.handler);
+
+    return init.result.get();
+  }
+
+  /// Read some data from the handle at the specified offset.
+  /**
+   * This function is used to read data from the random-access handle. The
+   * function call will block until one or more bytes of data has been read
+   * successfully, or until an error occurs.
+   *
+   * @param offset The offset at which the data will be read.
+   *
+   * @param buffers One or more buffers into which the data will be read.
+   *
+   * @returns The number of bytes read.
+   *
+   * @throws asio::system_error Thrown on failure. An error code of
+   * asio::error::eof indicates that the connection was closed by the
+   * peer.
+   *
+   * @note The read_some operation may not read all of the requested number of
+   * bytes. Consider using the @ref read_at function if you need to ensure that
+   * the requested amount of data is read before the blocking operation
+   * completes.
+   *
+   * @par Example
+   * To read into a single data buffer use the @ref buffer function as follows:
+   * @code
+   * handle.read_some_at(42, asio::buffer(data, size));
+   * @endcode
+   * See the @ref buffer documentation for information on reading into multiple
+   * buffers in one go, and how to use it with arrays, boost::array or
+   * std::vector.
+   */
+  template <typename MutableBufferSequence>
+  std::size_t read_some_at(uint64_t offset,
+      const MutableBufferSequence& buffers)
+  {
+    asio::error_code ec;
+    std::size_t s = this->get_service().read_some_at(
+        this->get_implementation(), offset, buffers, ec);
+    asio::detail::throw_error(ec, "read_some_at");
+    return s;
+  }
+
+  /// Read some data from the handle at the specified offset.
+  /**
+   * This function is used to read data from the random-access handle. The
+   * function call will block until one or more bytes of data has been read
+   * successfully, or until an error occurs.
+   *
+   * @param offset The offset at which the data will be read.
+   *
+   * @param buffers One or more buffers into which the data will be read.
+   *
+   * @param ec Set to indicate what error occurred, if any.
+   *
+   * @returns The number of bytes read. Returns 0 if an error occurred.
+   *
+   * @note The read_some operation may not read all of the requested number of
+   * bytes. Consider using the @ref read_at function if you need to ensure that
+   * the requested amount of data is read before the blocking operation
+   * completes.
+   */
+  template <typename MutableBufferSequence>
+  std::size_t read_some_at(uint64_t offset,
+      const MutableBufferSequence& buffers, asio::error_code& ec)
+  {
+    return this->get_service().read_some_at(
+        this->get_implementation(), offset, buffers, ec);
+  }
+
+  /// Start an asynchronous read at the specified offset.
+  /**
+   * This function is used to asynchronously read data from the random-access
+   * handle. The function call always returns immediately.
+   *
+   * @param offset The offset at which the data will be read.
+   *
+   * @param buffers One or more buffers into which the data will be read.
+   * Although the buffers object may be copied as necessary, ownership of the
+   * underlying memory blocks is retained by the caller, which must guarantee
+   * that they remain valid until the handler is called.
+   *
+   * @param handler The handler to be called when the read operation completes.
+   * Copies will be made of the handler as required. The function signature of
+   * the handler must be:
+   * @code void handler(
+   *   const asio::error_code& error, // Result of operation.
+   *   std::size_t bytes_transferred           // Number of bytes read.
+   * ); @endcode
+   * Regardless of whether the asynchronous operation completes immediately or
+   * not, the handler will not be invoked from within this function. Invocation
+   * of the handler will be performed in a manner equivalent to using
+   * asio::io_context::post().
+   *
+   * @note The read operation may not read all of the requested number of bytes.
+   * Consider using the @ref async_read_at function if you need to ensure that
+   * the requested amount of data is read before the asynchronous operation
+   * completes.
+   *
+   * @par Example
+   * To read into a single data buffer use the @ref buffer function as follows:
+   * @code
+   * handle.async_read_some_at(42, asio::buffer(data, size), handler);
+   * @endcode
+   * See the @ref buffer documentation for information on reading into multiple
+   * buffers in one go, and how to use it with arrays, boost::array or
+   * std::vector.
+   */
+  template <typename MutableBufferSequence, typename ReadHandler>
+  ASIO_INITFN_RESULT_TYPE(ReadHandler,
+      void (asio::error_code, std::size_t))
+  async_read_some_at(uint64_t offset,
+      const MutableBufferSequence& buffers,
+      ASIO_MOVE_ARG(ReadHandler) handler)
+  {
+    // If you get an error on the following line it means that your handler does
+    // not meet the documented type requirements for a ReadHandler.
+    ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
+
+    asio::async_completion<ReadHandler,
+      void (asio::error_code, std::size_t)> init(handler);
+
+    this->get_service().async_read_some_at(this->get_implementation(),
+        offset, buffers, init.handler);
+
+    return init.result.get();
+  }
+};
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
 
 } // namespace windows
 } // namespace asio
 
+#include "asio/detail/pop_options.hpp"
+
 #endif // defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE)
        //   || defined(GENERATING_DOCUMENTATION)
 
diff --git a/asio/include/asio/windows/random_access_handle_service.hpp b/asio/include/asio/windows/random_access_handle_service.hpp
index 2dbab74..2d57ee1 100644
--- a/asio/include/asio/windows/random_access_handle_service.hpp
+++ b/asio/include/asio/windows/random_access_handle_service.hpp
@@ -17,6 +17,8 @@
 
 #include "asio/detail/config.hpp"
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+
 #if defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE) \
   || defined(GENERATING_DOCUMENTATION)
 
@@ -202,4 +204,6 @@
 #endif // defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE)
        //   || defined(GENERATING_DOCUMENTATION)
 
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
+
 #endif // ASIO_WINDOWS_RANDOM_ACCESS_HANDLE_SERVICE_HPP
diff --git a/asio/include/asio/windows/stream_handle.hpp b/asio/include/asio/windows/stream_handle.hpp
index b35dd75..a150fce 100644
--- a/asio/include/asio/windows/stream_handle.hpp
+++ b/asio/include/asio/windows/stream_handle.hpp
@@ -16,21 +16,346 @@
 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
 
 #include "asio/detail/config.hpp"
+#include "asio/windows/overlapped_handle.hpp"
 
 #if defined(ASIO_HAS_WINDOWS_STREAM_HANDLE) \
   || defined(GENERATING_DOCUMENTATION)
 
-#include "asio/windows/basic_stream_handle.hpp"
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+# include "asio/windows/basic_stream_handle.hpp"
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
+
+#include "asio/detail/push_options.hpp"
 
 namespace asio {
 namespace windows {
 
-/// Typedef for the typical usage of a stream-oriented handle.
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+// Typedef for the typical usage of a stream-oriented handle.
 typedef basic_stream_handle<> stream_handle;
+#else // defined(ASIO_ENABLE_OLD_SERVICES)
+/// Provides stream-oriented handle functionality.
+/**
+ * The windows::stream_handle class provides asynchronous and blocking
+ * stream-oriented handle functionality.
+ *
+ * @par Thread Safety
+ * @e Distinct @e objects: Safe.@n
+ * @e Shared @e objects: Unsafe.
+ *
+ * @par Concepts:
+ * AsyncReadStream, AsyncWriteStream, Stream, SyncReadStream, SyncWriteStream.
+ */
+class stream_handle
+  : public overlapped_handle
+{
+public:
+  /// Construct a stream_handle without opening it.
+  /**
+   * This constructor creates a stream handle without opening it. The handle
+   * needs to be opened and then connected or accepted before data can be sent
+   * or received on it.
+   *
+   * @param io_context The io_context object that the stream handle will use to
+   * dispatch handlers for any asynchronous operations performed on the handle.
+   */
+  explicit stream_handle(asio::io_context& io_context)
+    : overlapped_handle(io_context)
+  {
+  }
+
+  /// Construct a stream_handle on an existing native handle.
+  /**
+   * This constructor creates a stream handle object to hold an existing native
+   * handle.
+   *
+   * @param io_context The io_context object that the stream handle will use to
+   * dispatch handlers for any asynchronous operations performed on the handle.
+   *
+   * @param handle The new underlying handle implementation.
+   *
+   * @throws asio::system_error Thrown on failure.
+   */
+  stream_handle(asio::io_context& io_context,
+      const native_handle_type& handle)
+    : overlapped_handle(io_context, handle)
+  {
+  }
+
+#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+  /// Move-construct a stream_handle from another.
+  /**
+   * This constructor moves a stream handle from one object to another.
+   *
+   * @param other The other stream_handle object from which the move
+   * will occur.
+   *
+   * @note Following the move, the moved-from object is in the same state as if
+   * constructed using the @c stream_handle(io_context&) constructor.
+   */
+  stream_handle(stream_handle&& other)
+    : overlapped_handle(std::move(other))
+  {
+  }
+
+  /// Move-assign a stream_handle from another.
+  /**
+   * This assignment operator moves a stream handle from one object to
+   * another.
+   *
+   * @param other The other stream_handle object from which the move
+   * will occur.
+   *
+   * @note Following the move, the moved-from object is in the same state as if
+   * constructed using the @c stream_handle(io_context&) constructor.
+   */
+  stream_handle& operator=(stream_handle&& other)
+  {
+    overlapped_handle::operator=(std::move(other));
+    return *this;
+  }
+#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
+
+  /// Write some data to the handle.
+  /**
+   * This function is used to write data to the stream handle. The function call
+   * will block until one or more bytes of the data has been written
+   * successfully, or until an error occurs.
+   *
+   * @param buffers One or more data buffers to be written to the handle.
+   *
+   * @returns The number of bytes written.
+   *
+   * @throws asio::system_error Thrown on failure. An error code of
+   * asio::error::eof indicates that the connection was closed by the
+   * peer.
+   *
+   * @note The write_some operation may not transmit all of the data to the
+   * peer. Consider using the @ref write function if you need to ensure that
+   * all data is written before the blocking operation completes.
+   *
+   * @par Example
+   * To write a single data buffer use the @ref buffer function as follows:
+   * @code
+   * handle.write_some(asio::buffer(data, size));
+   * @endcode
+   * See the @ref buffer documentation for information on writing multiple
+   * buffers in one go, and how to use it with arrays, boost::array or
+   * std::vector.
+   */
+  template <typename ConstBufferSequence>
+  std::size_t write_some(const ConstBufferSequence& buffers)
+  {
+    asio::error_code ec;
+    std::size_t s = this->get_service().write_some(
+        this->get_implementation(), buffers, ec);
+    asio::detail::throw_error(ec, "write_some");
+    return s;
+  }
+
+  /// Write some data to the handle.
+  /**
+   * This function is used to write data to the stream handle. The function call
+   * will block until one or more bytes of the data has been written
+   * successfully, or until an error occurs.
+   *
+   * @param buffers One or more data buffers to be written to the handle.
+   *
+   * @param ec Set to indicate what error occurred, if any.
+   *
+   * @returns The number of bytes written. Returns 0 if an error occurred.
+   *
+   * @note The write_some operation may not transmit all of the data to the
+   * peer. Consider using the @ref write function if you need to ensure that
+   * all data is written before the blocking operation completes.
+   */
+  template <typename ConstBufferSequence>
+  std::size_t write_some(const ConstBufferSequence& buffers,
+      asio::error_code& ec)
+  {
+    return this->get_service().write_some(
+        this->get_implementation(), buffers, ec);
+  }
+
+  /// Start an asynchronous write.
+  /**
+   * This function is used to asynchronously write data to the stream handle.
+   * The function call always returns immediately.
+   *
+   * @param buffers One or more data buffers to be written to the handle.
+   * Although the buffers object may be copied as necessary, ownership of the
+   * underlying memory blocks is retained by the caller, which must guarantee
+   * that they remain valid until the handler is called.
+   *
+   * @param handler The handler to be called when the write operation completes.
+   * Copies will be made of the handler as required. The function signature of
+   * the handler must be:
+   * @code void handler(
+   *   const asio::error_code& error, // Result of operation.
+   *   std::size_t bytes_transferred           // Number of bytes written.
+   * ); @endcode
+   * Regardless of whether the asynchronous operation completes immediately or
+   * not, the handler will not be invoked from within this function. Invocation
+   * of the handler will be performed in a manner equivalent to using
+   * asio::io_context::post().
+   *
+   * @note The write operation may not transmit all of the data to the peer.
+   * Consider using the @ref async_write function if you need to ensure that all
+   * data is written before the asynchronous operation completes.
+   *
+   * @par Example
+   * To write a single data buffer use the @ref buffer function as follows:
+   * @code
+   * handle.async_write_some(asio::buffer(data, size), handler);
+   * @endcode
+   * See the @ref buffer documentation for information on writing multiple
+   * buffers in one go, and how to use it with arrays, boost::array or
+   * std::vector.
+   */
+  template <typename ConstBufferSequence, typename WriteHandler>
+  ASIO_INITFN_RESULT_TYPE(WriteHandler,
+      void (asio::error_code, std::size_t))
+  async_write_some(const ConstBufferSequence& buffers,
+      ASIO_MOVE_ARG(WriteHandler) handler)
+  {
+    // If you get an error on the following line it means that your handler does
+    // not meet the documented type requirements for a WriteHandler.
+    ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
+
+    asio::async_completion<WriteHandler,
+      void (asio::error_code, std::size_t)> init(handler);
+
+    this->get_service().async_write_some(
+        this->get_implementation(), buffers, init.handler);
+
+    return init.result.get();
+  }
+
+  /// Read some data from the handle.
+  /**
+   * This function is used to read data from the stream handle. The function
+   * call will block until one or more bytes of data has been read successfully,
+   * or until an error occurs.
+   *
+   * @param buffers One or more buffers into which the data will be read.
+   *
+   * @returns The number of bytes read.
+   *
+   * @throws asio::system_error Thrown on failure. An error code of
+   * asio::error::eof indicates that the connection was closed by the
+   * peer.
+   *
+   * @note The read_some operation may not read all of the requested number of
+   * bytes. Consider using the @ref read function if you need to ensure that
+   * the requested amount of data is read before the blocking operation
+   * completes.
+   *
+   * @par Example
+   * To read into a single data buffer use the @ref buffer function as follows:
+   * @code
+   * handle.read_some(asio::buffer(data, size));
+   * @endcode
+   * See the @ref buffer documentation for information on reading into multiple
+   * buffers in one go, and how to use it with arrays, boost::array or
+   * std::vector.
+   */
+  template <typename MutableBufferSequence>
+  std::size_t read_some(const MutableBufferSequence& buffers)
+  {
+    asio::error_code ec;
+    std::size_t s = this->get_service().read_some(
+        this->get_implementation(), buffers, ec);
+    asio::detail::throw_error(ec, "read_some");
+    return s;
+  }
+
+  /// Read some data from the handle.
+  /**
+   * This function is used to read data from the stream handle. The function
+   * call will block until one or more bytes of data has been read successfully,
+   * or until an error occurs.
+   *
+   * @param buffers One or more buffers into which the data will be read.
+   *
+   * @param ec Set to indicate what error occurred, if any.
+   *
+   * @returns The number of bytes read. Returns 0 if an error occurred.
+   *
+   * @note The read_some operation may not read all of the requested number of
+   * bytes. Consider using the @ref read function if you need to ensure that
+   * the requested amount of data is read before the blocking operation
+   * completes.
+   */
+  template <typename MutableBufferSequence>
+  std::size_t read_some(const MutableBufferSequence& buffers,
+      asio::error_code& ec)
+  {
+    return this->get_service().read_some(
+        this->get_implementation(), buffers, ec);
+  }
+
+  /// Start an asynchronous read.
+  /**
+   * This function is used to asynchronously read data from the stream handle.
+   * The function call always returns immediately.
+   *
+   * @param buffers One or more buffers into which the data will be read.
+   * Although the buffers object may be copied as necessary, ownership of the
+   * underlying memory blocks is retained by the caller, which must guarantee
+   * that they remain valid until the handler is called.
+   *
+   * @param handler The handler to be called when the read operation completes.
+   * Copies will be made of the handler as required. The function signature of
+   * the handler must be:
+   * @code void handler(
+   *   const asio::error_code& error, // Result of operation.
+   *   std::size_t bytes_transferred           // Number of bytes read.
+   * ); @endcode
+   * Regardless of whether the asynchronous operation completes immediately or
+   * not, the handler will not be invoked from within this function. Invocation
+   * of the handler will be performed in a manner equivalent to using
+   * asio::io_context::post().
+   *
+   * @note The read operation may not read all of the requested number of bytes.
+   * Consider using the @ref async_read function if you need to ensure that the
+   * requested amount of data is read before the asynchronous operation
+   * completes.
+   *
+   * @par Example
+   * To read into a single data buffer use the @ref buffer function as follows:
+   * @code
+   * handle.async_read_some(asio::buffer(data, size), handler);
+   * @endcode
+   * See the @ref buffer documentation for information on reading into multiple
+   * buffers in one go, and how to use it with arrays, boost::array or
+   * std::vector.
+   */
+  template <typename MutableBufferSequence, typename ReadHandler>
+  ASIO_INITFN_RESULT_TYPE(ReadHandler,
+      void (asio::error_code, std::size_t))
+  async_read_some(const MutableBufferSequence& buffers,
+      ASIO_MOVE_ARG(ReadHandler) handler)
+  {
+    // If you get an error on the following line it means that your handler does
+    // not meet the documented type requirements for a ReadHandler.
+    ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
+
+    asio::async_completion<ReadHandler,
+      void (asio::error_code, std::size_t)> init(handler);
+
+    this->get_service().async_read_some(
+        this->get_implementation(), buffers, init.handler);
+
+    return init.result.get();
+  }
+};
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
 
 } // namespace windows
 } // namespace asio
 
+#include "asio/detail/pop_options.hpp"
+
 #endif // defined(ASIO_HAS_WINDOWS_STREAM_HANDLE)
        //   || defined(GENERATING_DOCUMENTATION)
 
diff --git a/asio/include/asio/windows/stream_handle_service.hpp b/asio/include/asio/windows/stream_handle_service.hpp
index af95ba0..9f4cf68 100644
--- a/asio/include/asio/windows/stream_handle_service.hpp
+++ b/asio/include/asio/windows/stream_handle_service.hpp
@@ -17,6 +17,8 @@
 
 #include "asio/detail/config.hpp"
 
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+
 #if defined(ASIO_HAS_WINDOWS_STREAM_HANDLE) \
   || defined(GENERATING_DOCUMENTATION)
 
@@ -200,4 +202,6 @@
 #endif // defined(ASIO_HAS_WINDOWS_STREAM_HANDLE)
        //   || defined(GENERATING_DOCUMENTATION)
 
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
+
 #endif // ASIO_WINDOWS_STREAM_HANDLE_SERVICE_HPP
diff --git a/asio/src/doc/quickref.xml b/asio/src/doc/quickref.xml
index 7a2631a..b2dec81 100644
--- a/asio/src/doc/quickref.xml
+++ b/asio/src/doc/quickref.xml
@@ -120,7 +120,6 @@
             <member><link linkend="asio.reference.CompletionHandler">CompletionHandler</link></member>
             <member><link linkend="asio.reference.Executor1">Executor</link></member>
             <member><link linkend="asio.reference.Handler">Handler</link></member>
-            <member><link linkend="asio.reference.IoObjectService">IoObjectService</link></member>
             <member><link linkend="asio.reference.Service">Service</link></member>
           </simplelist>
         </entry>
@@ -292,7 +291,6 @@
           <bridgehead renderas="sect3">Class Templates</bridgehead>
           <simplelist type="vert" columns="1">
             <member><link linkend="asio.reference.basic_datagram_socket">basic_datagram_socket</link></member>
-            <member><link linkend="asio.reference.basic_deadline_timer">basic_deadline_timer</link></member>
             <member><link linkend="asio.reference.basic_raw_socket">basic_raw_socket</link></member>
             <member><link linkend="asio.reference.basic_seq_packet_socket">basic_seq_packet_socket</link></member>
             <member><link linkend="asio.reference.basic_socket">basic_socket</link></member>
@@ -307,15 +305,6 @@
             <member><link linkend="asio.reference.ip__basic_resolver_iterator">ip::basic_resolver_iterator</link></member>
             <member><link linkend="asio.reference.ip__basic_resolver_query">ip::basic_resolver_query</link></member>
           </simplelist>
-          <bridgehead renderas="sect3">Services</bridgehead>
-          <simplelist type="vert" columns="1">
-            <member><link linkend="asio.reference.datagram_socket_service">datagram_socket_service</link></member>
-            <member><link linkend="asio.reference.ip__resolver_service">ip::resolver_service</link></member>
-            <member><link linkend="asio.reference.raw_socket_service">raw_socket_service</link></member>
-            <member><link linkend="asio.reference.seq_packet_socket_service">seq_packet_socket_service</link></member>
-            <member><link linkend="asio.reference.socket_acceptor_service">socket_acceptor_service</link></member>
-            <member><link linkend="asio.reference.stream_socket_service">stream_socket_service</link></member>
-          </simplelist>
         </entry>
         <entry valign="top">
           <bridgehead renderas="sect3">Socket Options</bridgehead>
@@ -352,20 +341,13 @@
             <member><link linkend="asio.reference.AcceptHandler">AcceptHandler</link></member>
             <member><link linkend="asio.reference.ComposedConnectHandler">ComposedConnectHandler</link></member>
             <member><link linkend="asio.reference.ConnectHandler">ConnectHandler</link></member>
-            <member><link linkend="asio.reference.DatagramSocketService">DatagramSocketService</link></member>
             <member><link linkend="asio.reference.Endpoint">Endpoint</link></member>
             <member><link linkend="asio.reference.GettableSocketOption">GettableSocketOption</link></member>
             <member><link linkend="asio.reference.InternetProtocol">InternetProtocol</link></member>
             <member><link linkend="asio.reference.IoControlCommand">IoControlCommand</link></member>
             <member><link linkend="asio.reference.Protocol">Protocol</link></member>
-            <member><link linkend="asio.reference.RawSocketService">RawSocketService</link></member>
             <member><link linkend="asio.reference.ResolveHandler">ResolveHandler</link></member>
-            <member><link linkend="asio.reference.ResolverService">ResolverService</link></member>
-            <member><link linkend="asio.reference.SeqPacketSocketService">SeqPacketSocketService</link></member>
             <member><link linkend="asio.reference.SettableSocketOption">SettableSocketOption</link></member>
-            <member><link linkend="asio.reference.SocketAcceptorService">SocketAcceptorService</link></member>
-            <member><link linkend="asio.reference.SocketService">SocketService</link></member>
-            <member><link linkend="asio.reference.StreamSocketService">StreamSocketService</link></member>
           </simplelist>
         </entry>
       </row>
@@ -404,13 +386,8 @@
             <member><link linkend="asio.reference.basic_deadline_timer">basic_deadline_timer</link></member>
             <member><link linkend="asio.reference.time_traits_lt__ptime__gt_">time_traits</link></member>
           </simplelist>
-          <bridgehead renderas="sect3">Services</bridgehead>
-          <simplelist type="vert" columns="1">
-            <member><link linkend="asio.reference.deadline_timer_service">deadline_timer_service</link></member>
-          </simplelist>
           <bridgehead renderas="sect3">Type Requirements</bridgehead>
           <simplelist type="vert" columns="1">
-            <member><link linkend="asio.reference.TimerService">TimerService</link></member>
             <member><link linkend="asio.reference.TimeTraits">TimeTraits</link></member>
             <member><link linkend="asio.reference.WaitHandler">WaitHandler</link></member>
           </simplelist>
@@ -441,14 +418,6 @@
             <member><link linkend="asio.reference.serial_port">serial_port</link></member>
             <member><link linkend="asio.reference.serial_port_base">serial_port_base</link></member>
           </simplelist>
-          <bridgehead renderas="sect3">Class Templates</bridgehead>
-          <simplelist type="vert" columns="1">
-            <member><link linkend="asio.reference.basic_serial_port">basic_serial_port</link></member>
-          </simplelist>
-          <bridgehead renderas="sect3">Services</bridgehead>
-          <simplelist type="vert" columns="1">
-            <member><link linkend="asio.reference.serial_port_service">serial_port_service</link></member>
-          </simplelist>
           <bridgehead renderas="sect3">Serial Port Options</bridgehead>
           <simplelist type="vert" columns="1">
             <member><link linkend="asio.reference.serial_port_base__baud_rate">serial_port_base::baud_rate</link></member>
@@ -460,7 +429,6 @@
           <bridgehead renderas="sect3">Type Requirements</bridgehead>
           <simplelist type="vert" columns="1">
             <member><link linkend="asio.reference.GettableSerialPortOption">GettableSerialPortOption</link></member>
-            <member><link linkend="asio.reference.SerialPortService">SerialPortService</link></member>
             <member><link linkend="asio.reference.SettableSerialPortOption">SettableSerialPortOption</link></member>
           </simplelist>
         </entry>
@@ -469,17 +437,8 @@
           <simplelist type="vert" columns="1">
             <member><link linkend="asio.reference.signal_set">signal_set</link></member>
           </simplelist>
-          <bridgehead renderas="sect3">Class Templates</bridgehead>
-          <simplelist type="vert" columns="1">
-            <member><link linkend="asio.reference.basic_signal_set">basic_signal_set</link></member>
-          </simplelist>
-          <bridgehead renderas="sect3">Services</bridgehead>
-          <simplelist type="vert" columns="1">
-            <member><link linkend="asio.reference.signal_set_service">signal_set_service</link></member>
-          </simplelist>
           <bridgehead renderas="sect3">Type Requirements</bridgehead>
           <simplelist type="vert" columns="1">
-            <member><link linkend="asio.reference.SignalSetService">SignalSetService</link></member>
             <member><link linkend="asio.reference.SignalHandler">SignalHandler</link></member>
           </simplelist>
         </entry>
@@ -514,6 +473,7 @@
             <member><link linkend="asio.reference.local__datagram_protocol">local::datagram_protocol</link></member>
             <member><link linkend="asio.reference.local__datagram_protocol.endpoint">local::datagram_protocol::endpoint</link></member>
             <member><link linkend="asio.reference.local__datagram_protocol.socket">local::datagram_protocol::socket</link></member>
+            <member><link linkend="asio.reference.posix__descriptor">posix::descriptor</link></member>
             <member><link linkend="asio.reference.posix__descriptor_base">posix::descriptor_base</link></member>
             <member><link linkend="asio.reference.posix__stream_descriptor">posix::stream_descriptor</link></member>
           </simplelist>
@@ -526,43 +486,17 @@
           <bridgehead renderas="sect3">Class Templates</bridgehead>
           <simplelist type="vert" columns="1">
             <member><link linkend="asio.reference.local__basic_endpoint">local::basic_endpoint</link></member>
-            <member><link linkend="asio.reference.posix__basic_descriptor">posix::basic_descriptor</link></member>
-            <member><link linkend="asio.reference.posix__basic_stream_descriptor">posix::basic_stream_descriptor</link></member>
-          </simplelist>
-          <bridgehead renderas="sect3">Services</bridgehead>
-          <simplelist type="vert" columns="1">
-            <member><link linkend="asio.reference.posix__stream_descriptor_service">posix::stream_descriptor_service</link></member>
-          </simplelist>
-          <bridgehead renderas="sect3">Type Requirements</bridgehead>
-          <simplelist type="vert" columns="1">
-            <member><link linkend="asio.reference.DescriptorService">DescriptorService</link></member>
-            <member><link linkend="asio.reference.StreamDescriptorService">StreamDescriptorService</link></member>
           </simplelist>
         </entry>
         <entry valign="top" namest="c" nameend="d">
           <bridgehead renderas="sect3">Classes</bridgehead>
           <simplelist type="vert" columns="1">
+            <member><link linkend="asio.reference.windows__object_handle">windows::object_handle</link></member>
+            <member><link linkend="asio.reference.windows__overlapped_handle">windows::overlapped_handle</link></member>
             <member><link linkend="asio.reference.windows__overlapped_ptr">windows::overlapped_ptr</link></member>
             <member><link linkend="asio.reference.windows__random_access_handle">windows::random_access_handle</link></member>
             <member><link linkend="asio.reference.windows__stream_handle">windows::stream_handle</link></member>
           </simplelist>
-          <bridgehead renderas="sect3">Class Templates</bridgehead>
-          <simplelist type="vert" columns="1">
-            <member><link linkend="asio.reference.windows__basic_handle">windows::basic_handle</link></member>
-            <member><link linkend="asio.reference.windows__basic_random_access_handle">windows::basic_random_access_handle</link></member>
-            <member><link linkend="asio.reference.windows__basic_stream_handle">windows::basic_stream_handle</link></member>
-          </simplelist>
-          <bridgehead renderas="sect3">Services</bridgehead>
-          <simplelist type="vert" columns="1">
-            <member><link linkend="asio.reference.windows__random_access_handle_service">windows::random_access_handle_service</link></member>
-            <member><link linkend="asio.reference.windows__stream_handle_service">windows::stream_handle_service</link></member>
-          </simplelist>
-          <bridgehead renderas="sect3">Type Requirements</bridgehead>
-          <simplelist type="vert" columns="1">
-            <member><link linkend="asio.reference.HandleService">HandleService</link></member>
-            <member><link linkend="asio.reference.RandomAccessHandleService">RandomAccessHandleService</link></member>
-            <member><link linkend="asio.reference.StreamHandleService">StreamHandleService</link></member>
-          </simplelist>
         </entry>
       </row>
     </tbody>
diff --git a/asio/src/doc/reference.dox b/asio/src/doc/reference.dox
index a5d09e6..d1d52d2 100644
--- a/asio/src/doc/reference.dox
+++ b/asio/src/doc/reference.dox
@@ -199,7 +199,17 @@
                          ASIO_DECL= \
                          ASIO_CONSTEXPR=constexpr \
                          ASIO_NOEXCEPT=noexcept \
-                         ASIO_INITFN_RESULT_TYPE(t,a)=void_or_deduced
+                         ASIO_INITFN_RESULT_TYPE(t,a)=void_or_deduced \
+                         ASIO_SVC_TPARAM= \
+                         ASIO_SVC_TPARAM_DEF1()= \
+                         ASIO_SVC_TPARAM_DEF2()= \
+                         ASIO_SVC_TARG= \
+                         ASIO_SVC_TPARAM1= \
+                         ASIO_SVC_TPARAM1_DEF1()= \
+                         ASIO_SVC_TPARAM1_DEF2()= \
+                         ASIO_SVC_TARG1= \
+                         ASIO_SVC_T=asio::detail::service \
+                         ASIO_SVC_T1=asio::detail::service
 EXPAND_AS_DEFINED      = 
 SKIP_FUNCTION_MACROS   = YES
 #---------------------------------------------------------------------------
diff --git a/asio/src/doc/reference.qbk b/asio/src/doc/reference.qbk
index 0d80b34..decbd2b 100644
--- a/asio/src/doc/reference.qbk
+++ b/asio/src/doc/reference.qbk
@@ -22,49 +22,31 @@
 [include requirements/ConstBufferSequence.qbk]
 [include requirements/ConvertibleToConstBuffer.qbk]
 [include requirements/ConvertibleToMutableBuffer.qbk]
-[include requirements/DatagramSocketService.qbk]
-[include requirements/DescriptorService.qbk]
 [include requirements/DynamicBufferSequence.qbk]
 [include requirements/Endpoint.qbk]
 [include requirements/Executor.qbk]
 [include requirements/GettableSerialPortOption.qbk]
 [include requirements/GettableSocketOption.qbk]
 [include requirements/Handler.qbk]
-[include requirements/HandleService.qbk]
 [include requirements/HandshakeHandler.qbk]
 [include requirements/InternetProtocol.qbk]
 [include requirements/IoControlCommand.qbk]
-[include requirements/IoObjectService.qbk]
 [include requirements/IteratorConnectHandler.qbk]
 [include requirements/MutableBufferSequence.qbk]
-[include requirements/ObjectHandleService.qbk]
 [include requirements/Protocol.qbk]
-[include requirements/RandomAccessHandleService.qbk]
 [include requirements/RangeConnectHandler.qbk]
-[include requirements/RawSocketService.qbk]
 [include requirements/ReadHandler.qbk]
 [include requirements/ResolveHandler.qbk]
-[include requirements/ResolverService.qbk]
-[include requirements/SeqPacketSocketService.qbk]
-[include requirements/SerialPortService.qbk]
 [include requirements/Service.qbk]
 [include requirements/SettableSerialPortOption.qbk]
 [include requirements/SettableSocketOption.qbk]
 [include requirements/ShutdownHandler.qbk]
 [include requirements/SignalHandler.qbk]
-[include requirements/SignalSetService.qbk]
-[include requirements/SocketAcceptorService.qbk]
-[include requirements/SocketService.qbk]
-[include requirements/StreamDescriptorService.qbk]
-[include requirements/StreamHandleService.qbk]
-[include requirements/StreamSocketService.qbk]
 [include requirements/SyncRandomAccessReadDevice.qbk]
 [include requirements/SyncRandomAccessWriteDevice.qbk]
 [include requirements/SyncReadStream.qbk]
 [include requirements/SyncWriteStream.qbk]
 [include requirements/TimeTraits.qbk]
-[include requirements/TimerService.qbk]
-[include requirements/WaitableTimerService.qbk]
 [include requirements/WaitHandler.qbk]
 [include requirements/WaitTraits.qbk]
 [include requirements/WriteHandler.qbk]
@@ -695,11 +677,10 @@
       
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename ``[link asio.reference.EndpointSequence EndpointSequence]``,
       typename ``[link asio.reference.RangeConnectHandler RangeConnectHandler]``>
   ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.async_connect.overload1 async_connect]``(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       const EndpointSequence & endpoints,
       RangeConnectHandler && handler,
       typename enable_if< is_endpoint_sequence< EndpointSequence >::value >::type *  = 0);
@@ -707,11 +688,10 @@
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename Iterator,
       typename ``[link asio.reference.IteratorConnectHandler IteratorConnectHandler]``>
   ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.async_connect.overload2 async_connect]``(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       Iterator begin,
       IteratorConnectHandler && handler,
       typename enable_if<!is_endpoint_sequence< Iterator >::value >::type *  = 0);
@@ -719,11 +699,10 @@
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename Iterator,
       typename ``[link asio.reference.IteratorConnectHandler IteratorConnectHandler]``>
   ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.async_connect.overload3 async_connect]``(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       Iterator begin,
       Iterator end,
       IteratorConnectHandler && handler);
@@ -731,12 +710,11 @@
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename ``[link asio.reference.EndpointSequence EndpointSequence]``,
       typename ConnectCondition,
       typename ``[link asio.reference.RangeConnectHandler RangeConnectHandler]``>
   ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.async_connect.overload4 async_connect]``(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       const EndpointSequence & endpoints,
       ConnectCondition connect_condition,
       RangeConnectHandler && handler,
@@ -745,12 +723,11 @@
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename Iterator,
       typename ConnectCondition,
       typename ``[link asio.reference.IteratorConnectHandler IteratorConnectHandler]``>
   ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.async_connect.overload5 async_connect]``(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       Iterator begin,
       ConnectCondition connect_condition,
       IteratorConnectHandler && handler,
@@ -759,12 +736,11 @@
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename Iterator,
       typename ConnectCondition,
       typename ``[link asio.reference.IteratorConnectHandler IteratorConnectHandler]``>
   ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.async_connect.overload6 async_connect]``(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       Iterator begin,
       Iterator end,
       ConnectCondition connect_condition,
@@ -786,11 +762,10 @@
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename ``[link asio.reference.EndpointSequence EndpointSequence]``,
       typename ``[link asio.reference.RangeConnectHandler RangeConnectHandler]``>
   ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_connect(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       const EndpointSequence & endpoints,
       RangeConnectHandler && handler,
       typename enable_if< is_endpoint_sequence< EndpointSequence >::value >::type *  = 0);
@@ -877,11 +852,10 @@
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename Iterator,
       typename ``[link asio.reference.IteratorConnectHandler IteratorConnectHandler]``>
   ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_connect(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       Iterator begin,
       IteratorConnectHandler && handler,
       typename enable_if<!is_endpoint_sequence< Iterator >::value >::type *  = 0);
@@ -936,11 +910,10 @@
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename Iterator,
       typename ``[link asio.reference.IteratorConnectHandler IteratorConnectHandler]``>
   ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_connect(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       Iterator begin,
       Iterator end,
       IteratorConnectHandler && handler);
@@ -1015,12 +988,11 @@
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename ``[link asio.reference.EndpointSequence EndpointSequence]``,
       typename ConnectCondition,
       typename ``[link asio.reference.RangeConnectHandler RangeConnectHandler]``>
   ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_connect(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       const EndpointSequence & endpoints,
       ConnectCondition connect_condition,
       RangeConnectHandler && handler,
@@ -1140,12 +1112,11 @@
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename Iterator,
       typename ConnectCondition,
       typename ``[link asio.reference.IteratorConnectHandler IteratorConnectHandler]``>
   ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_connect(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       Iterator begin,
       ConnectCondition connect_condition,
       IteratorConnectHandler && handler,
@@ -1209,12 +1180,11 @@
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename Iterator,
       typename ConnectCondition,
       typename ``[link asio.reference.IteratorConnectHandler IteratorConnectHandler]``>
   ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_connect(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       Iterator begin,
       Iterator end,
       ConnectCondition connect_condition,
@@ -4296,10 +4266,9 @@
 
 
   template<
-      typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.DatagramSocketService DatagramSocketService]`` = datagram_socket_service<Protocol>>
+      typename ``[link asio.reference.Protocol Protocol]``>
   class basic_datagram_socket :
-    public basic_socket< Protocol, DatagramSocketService >
+    public basic_socket< Protocol >
 
 
 [heading Types]
@@ -4357,13 +4326,6 @@
 
   [
 
-    [[link asio.reference.basic_datagram_socket.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_datagram_socket.keep_alive [*keep_alive]]]
     [Socket option to send keep-alives. ]
   
@@ -4441,13 +4403,6 @@
 
   [
 
-    [[link asio.reference.basic_datagram_socket.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_datagram_socket.shutdown_type [*shutdown_type]]]
     [Different ways a socket may be shutdown. ]
   
@@ -4659,20 +4614,9 @@
     [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
   ]
   
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
   [
-    [[link asio.reference.basic_datagram_socket.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_datagram_socket.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
+    [[link asio.reference.basic_datagram_socket._basic_datagram_socket [*~basic_datagram_socket]]]
+    [Destroys the socket. ]
   ]
   
 ]
@@ -5671,10 +5615,9 @@
 
 
   template<
-      typename ``[link asio.reference.Protocol Protocol1]``,
-      typename ``[link asio.reference.DatagramSocketService DatagramSocketService1]``>
+      typename ``[link asio.reference.Protocol Protocol1]``>
   ``[link asio.reference.basic_datagram_socket.basic_datagram_socket.overload6 basic_datagram_socket]``(
-      basic_datagram_socket< Protocol1, DatagramSocketService1 > && other,
+      basic_datagram_socket< Protocol1 > && other,
       typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);
   ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.basic_datagram_socket.overload6 more...]]``
 
@@ -5878,10 +5821,9 @@
 
 
   template<
-      typename ``[link asio.reference.Protocol Protocol1]``,
-      typename ``[link asio.reference.DatagramSocketService DatagramSocketService1]``>
+      typename ``[link asio.reference.Protocol Protocol1]``>
   basic_datagram_socket(
-      basic_datagram_socket< Protocol1, DatagramSocketService1 > && other,
+      basic_datagram_socket< Protocol1 > && other,
       typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);
 
 
@@ -6669,13 +6611,13 @@
 [section:executor_type basic_datagram_socket::executor_type]
 
 
-['Inherited from basic_io_object.]
+['Inherited from basic_socket.]
 
 [indexterm2 executor_type..basic_datagram_socket] 
 The type of the executor associated with the object. 
 
 
-  typedef asio::io_context::executor_type executor_type;
+  typedef io_context::executor_type executor_type;
 
 
 [heading Member Functions]
@@ -6750,7 +6692,7 @@
 [section:get_executor basic_datagram_socket::get_executor]
 
 
-['Inherited from basic_io_object.]
+['Inherited from basic_socket.]
 
 [indexterm2 get_executor..basic_datagram_socket] 
 Get the executor associated with the object. 
@@ -6763,59 +6705,11 @@
 [endsect]
 
 
-[section:get_implementation basic_datagram_socket::get_implementation]
-
-[indexterm2 get_implementation..basic_datagram_socket] 
-Get the underlying implementation of the I/O object. 
-
-
-  implementation_type & ``[link asio.reference.basic_datagram_socket.get_implementation.overload1 get_implementation]``();
-  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.get_implementation.overload1 more...]]``
-
-  const implementation_type & ``[link asio.reference.basic_datagram_socket.get_implementation.overload2 get_implementation]``() const;
-  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.get_implementation.overload2 more...]]``
-
-
-[section:overload1 basic_datagram_socket::get_implementation (1 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the underlying implementation of the I/O object. 
-
-
-  implementation_type & get_implementation();
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_datagram_socket::get_implementation (2 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the underlying implementation of the I/O object. 
-
-
-  const implementation_type & get_implementation() const;
-
-
-
-[endsect]
-
-
-[endsect]
-
 
 [section:get_io_context basic_datagram_socket::get_io_context]
 
 
-['Inherited from basic_io_object.]
+['Inherited from basic_socket.]
 
 [indexterm2 get_io_context..basic_datagram_socket] 
 (Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
@@ -6841,7 +6735,7 @@
 [section:get_io_service basic_datagram_socket::get_io_service]
 
 
-['Inherited from basic_io_object.]
+['Inherited from basic_socket.]
 
 [indexterm2 get_io_service..basic_datagram_socket] 
 (Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
@@ -6869,10 +6763,14 @@
 Get an option from the socket. 
 
 
+  template<
+      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
   void ``[link asio.reference.basic_datagram_socket.get_option.overload1 get_option]``(
       GettableSocketOption & option) const;
   ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.get_option.overload1 more...]]``
 
+  template<
+      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
   asio::error_code ``[link asio.reference.basic_datagram_socket.get_option.overload2 get_option]``(
       GettableSocketOption & option,
       asio::error_code & ec) const;
@@ -6996,88 +6894,20 @@
 
 [endsect]
 
-[section:get_service basic_datagram_socket::get_service]
-
-[indexterm2 get_service..basic_datagram_socket] 
-Get the service associated with the I/O object. 
-
-
-  service_type & ``[link asio.reference.basic_datagram_socket.get_service.overload1 get_service]``();
-  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.get_service.overload1 more...]]``
-
-  const service_type & ``[link asio.reference.basic_datagram_socket.get_service.overload2 get_service]``() const;
-  ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.get_service.overload2 more...]]``
-
-
-[section:overload1 basic_datagram_socket::get_service (1 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the service associated with the I/O object. 
-
-
-  service_type & get_service();
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_datagram_socket::get_service (2 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the service associated with the I/O object. 
-
-
-  const service_type & get_service() const;
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:implementation_type basic_datagram_socket::implementation_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 implementation_type..basic_datagram_socket] 
-The underlying implementation type of I/O object. 
-
-
-  typedef service_type::implementation_type implementation_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/basic_datagram_socket.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
 [section:io_control basic_datagram_socket::io_control]
 
 [indexterm2 io_control..basic_datagram_socket] 
 Perform an IO control command on the socket. 
 
 
+  template<
+      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
   void ``[link asio.reference.basic_datagram_socket.io_control.overload1 io_control]``(
       IoControlCommand & command);
   ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.io_control.overload1 more...]]``
 
+  template<
+      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
   asio::error_code ``[link asio.reference.basic_datagram_socket.io_control.overload2 io_control]``(
       IoControlCommand & command,
       asio::error_code & ec);
@@ -7524,7 +7354,7 @@
 A [link asio.reference.basic_socket `basic_socket`] is always the lowest layer. 
 
 
-  typedef basic_socket< Protocol, DatagramSocketService > lowest_layer_type;
+  typedef basic_socket< Protocol > lowest_layer_type;
 
 
 [heading Types]
@@ -7582,13 +7412,6 @@
 
   [
 
-    [[link asio.reference.basic_socket.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_socket.keep_alive [*keep_alive]]]
     [Socket option to send keep-alives. ]
   
@@ -7666,13 +7489,6 @@
 
   [
 
-    [[link asio.reference.basic_socket.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_socket.shutdown_type [*shutdown_type]]]
     [Different ways a socket may be shutdown. ]
   
@@ -7851,13 +7667,13 @@
   [[Name][Description]]
 
   [
-    [[link asio.reference.basic_socket.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
+    [[link asio.reference.basic_socket.basic_socket [*basic_socket]]]
+    []
   ]
   
   [
-    [[link asio.reference.basic_socket.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
+    [[link asio.reference.basic_socket.operator_eq_ [*operator=]]]
+    []
   ]
   
   [
@@ -8055,7 +7871,7 @@
 The native representation of a socket. 
 
 
-  typedef DatagramSocketService::native_handle_type native_handle_type;
+  typedef implementation_defined native_handle_type;
 
 
 
@@ -8692,10 +8508,9 @@
 
 
   template<
-      typename ``[link asio.reference.Protocol Protocol1]``,
-      typename ``[link asio.reference.DatagramSocketService DatagramSocketService1]``>
+      typename ``[link asio.reference.Protocol Protocol1]``>
   enable_if< is_convertible< Protocol1, Protocol >::value, basic_datagram_socket >::type & ``[link asio.reference.basic_datagram_socket.operator_eq_.overload2 operator=]``(
-      basic_datagram_socket< Protocol1, DatagramSocketService1 > && other);
+      basic_datagram_socket< Protocol1 > && other);
   ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.operator_eq_.overload2 more...]]``
 
 
@@ -8740,10 +8555,9 @@
 
 
   template<
-      typename ``[link asio.reference.Protocol Protocol1]``,
-      typename ``[link asio.reference.DatagramSocketService DatagramSocketService1]``>
+      typename ``[link asio.reference.Protocol Protocol1]``>
   enable_if< is_convertible< Protocol1, Protocol >::value, basic_datagram_socket >::type & operator=(
-      basic_datagram_socket< Protocol1, DatagramSocketService1 > && other);
+      basic_datagram_socket< Protocol1 > && other);
 
 
 This assignment operator moves a datagram socket from one object to another.
@@ -9941,40 +9755,20 @@
 
 [endsect]
 
-
-[section:service_type basic_datagram_socket::service_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 service_type..basic_datagram_socket] 
-The type of the service that will be used to provide I/O operations. 
-
-
-  typedef DatagramSocketService service_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/basic_datagram_socket.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
 [section:set_option basic_datagram_socket::set_option]
 
 [indexterm2 set_option..basic_datagram_socket] 
 Set an option on the socket. 
 
 
+  template<
+      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
   void ``[link asio.reference.basic_datagram_socket.set_option.overload1 set_option]``(
       const SettableSocketOption & option);
   ``  [''''&raquo;''' [link asio.reference.basic_datagram_socket.set_option.overload1 more...]]``
 
+  template<
+      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
   asio::error_code ``[link asio.reference.basic_datagram_socket.set_option.overload2 set_option]``(
       const SettableSocketOption & option,
       asio::error_code & ec);
@@ -10413,6 +10207,22 @@
 
 
 
+[section:_basic_datagram_socket basic_datagram_socket::~basic_datagram_socket]
+
+[indexterm2 ~basic_datagram_socket..basic_datagram_socket] 
+Destroys the socket. 
+
+
+  ~basic_datagram_socket();
+
+
+This function destroys the socket, cancelling any outstanding asynchronous operations associated with the socket as if by calling `cancel`. 
+
+
+[endsect]
+
+
+
 [endsect]
 
 [section:basic_deadline_timer basic_deadline_timer]
@@ -10423,10 +10233,8 @@
 
   template<
       typename Time,
-      typename ``[link asio.reference.TimeTraits TimeTraits]`` = asio::time_traits<Time>,
-      typename ``[link asio.reference.TimerService TimerService]`` = deadline_timer_service<Time, TimeTraits>>
-  class basic_deadline_timer :
-    public basic_io_object< TimerService >
+      typename ``[link asio.reference.TimeTraits TimeTraits]`` = asio::time_traits<Time>>
+  class basic_deadline_timer
 
 
 [heading Types]
@@ -10449,20 +10257,6 @@
 
   [
 
-    [[link asio.reference.basic_deadline_timer.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.basic_deadline_timer.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_deadline_timer.time_type [*time_type]]]
     [The time type. ]
   
@@ -10539,20 +10333,9 @@
     [Perform a blocking wait on the timer. ]
   ]
   
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
   [
-    [[link asio.reference.basic_deadline_timer.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_deadline_timer.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
+    [[link asio.reference.basic_deadline_timer._basic_deadline_timer [*~basic_deadline_timer]]]
+    [Destroys the timer. ]
   ]
   
 ]
@@ -11065,14 +10848,11 @@
 
 [section:executor_type basic_deadline_timer::executor_type]
 
-
-['Inherited from basic_io_object.]
-
 [indexterm2 executor_type..basic_deadline_timer] 
 The type of the executor associated with the object. 
 
 
-  typedef asio::io_context::executor_type executor_type;
+  typedef io_context::executor_type executor_type;
 
 
 [heading Member Functions]
@@ -11432,9 +11212,6 @@
 
 [section:get_executor basic_deadline_timer::get_executor]
 
-
-['Inherited from basic_io_object.]
-
 [indexterm2 get_executor..basic_deadline_timer] 
 Get the executor associated with the object. 
 
@@ -11446,60 +11223,9 @@
 [endsect]
 
 
-[section:get_implementation basic_deadline_timer::get_implementation]
-
-[indexterm2 get_implementation..basic_deadline_timer] 
-Get the underlying implementation of the I/O object. 
-
-
-  implementation_type & ``[link asio.reference.basic_deadline_timer.get_implementation.overload1 get_implementation]``();
-  ``  [''''&raquo;''' [link asio.reference.basic_deadline_timer.get_implementation.overload1 more...]]``
-
-  const implementation_type & ``[link asio.reference.basic_deadline_timer.get_implementation.overload2 get_implementation]``() const;
-  ``  [''''&raquo;''' [link asio.reference.basic_deadline_timer.get_implementation.overload2 more...]]``
-
-
-[section:overload1 basic_deadline_timer::get_implementation (1 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the underlying implementation of the I/O object. 
-
-
-  implementation_type & get_implementation();
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_deadline_timer::get_implementation (2 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the underlying implementation of the I/O object. 
-
-
-  const implementation_type & get_implementation() const;
-
-
-
-[endsect]
-
-
-[endsect]
-
 
 [section:get_io_context basic_deadline_timer::get_io_context]
 
-
-['Inherited from basic_io_object.]
-
 [indexterm2 get_io_context..basic_deadline_timer] 
 (Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
 
@@ -11523,9 +11249,6 @@
 
 [section:get_io_service basic_deadline_timer::get_io_service]
 
-
-['Inherited from basic_io_object.]
-
 [indexterm2 get_io_service..basic_deadline_timer] 
 (Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
 
@@ -11546,102 +11269,6 @@
 [endsect]
 
 
-[section:get_service basic_deadline_timer::get_service]
-
-[indexterm2 get_service..basic_deadline_timer] 
-Get the service associated with the I/O object. 
-
-
-  service_type & ``[link asio.reference.basic_deadline_timer.get_service.overload1 get_service]``();
-  ``  [''''&raquo;''' [link asio.reference.basic_deadline_timer.get_service.overload1 more...]]``
-
-  const service_type & ``[link asio.reference.basic_deadline_timer.get_service.overload2 get_service]``() const;
-  ``  [''''&raquo;''' [link asio.reference.basic_deadline_timer.get_service.overload2 more...]]``
-
-
-[section:overload1 basic_deadline_timer::get_service (1 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the service associated with the I/O object. 
-
-
-  service_type & get_service();
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_deadline_timer::get_service (2 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the service associated with the I/O object. 
-
-
-  const service_type & get_service() const;
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:implementation_type basic_deadline_timer::implementation_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 implementation_type..basic_deadline_timer] 
-The underlying implementation type of I/O object. 
-
-
-  typedef service_type::implementation_type implementation_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/basic_deadline_timer.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:service_type basic_deadline_timer::service_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 service_type..basic_deadline_timer] 
-The type of the service that will be used to provide I/O operations. 
-
-
-  typedef TimerService service_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/basic_deadline_timer.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
 
 [section:time_type basic_deadline_timer::time_type]
 
@@ -11757,6 +11384,22 @@
 [endsect]
 
 
+[section:_basic_deadline_timer basic_deadline_timer::~basic_deadline_timer]
+
+[indexterm2 ~basic_deadline_timer..basic_deadline_timer] 
+Destroys the timer. 
+
+
+  ~basic_deadline_timer();
+
+
+This function destroys the timer, cancelling any outstanding asynchronous wait operations associated with the timer as if by calling `cancel`. 
+
+
+[endsect]
+
+
+
 [endsect]
 
 [section:basic_io_object basic_io_object]
@@ -12261,10 +11904,9 @@
 
 
   template<
-      typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.RawSocketService RawSocketService]`` = raw_socket_service<Protocol>>
+      typename ``[link asio.reference.Protocol Protocol]``>
   class basic_raw_socket :
-    public basic_socket< Protocol, RawSocketService >
+    public basic_socket< Protocol >
 
 
 [heading Types]
@@ -12322,13 +11964,6 @@
 
   [
 
-    [[link asio.reference.basic_raw_socket.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_raw_socket.keep_alive [*keep_alive]]]
     [Socket option to send keep-alives. ]
   
@@ -12406,13 +12041,6 @@
 
   [
 
-    [[link asio.reference.basic_raw_socket.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_raw_socket.shutdown_type [*shutdown_type]]]
     [Different ways a socket may be shutdown. ]
   
@@ -12624,20 +12252,9 @@
     [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
   ]
   
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
   [
-    [[link asio.reference.basic_raw_socket.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_raw_socket.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
+    [[link asio.reference.basic_raw_socket._basic_raw_socket [*~basic_raw_socket]]]
+    [Destroys the socket. ]
   ]
   
 ]
@@ -13636,10 +13253,9 @@
 
 
   template<
-      typename ``[link asio.reference.Protocol Protocol1]``,
-      typename ``[link asio.reference.RawSocketService RawSocketService1]``>
+      typename ``[link asio.reference.Protocol Protocol1]``>
   ``[link asio.reference.basic_raw_socket.basic_raw_socket.overload6 basic_raw_socket]``(
-      basic_raw_socket< Protocol1, RawSocketService1 > && other,
+      basic_raw_socket< Protocol1 > && other,
       typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);
   ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.basic_raw_socket.overload6 more...]]``
 
@@ -13843,10 +13459,9 @@
 
 
   template<
-      typename ``[link asio.reference.Protocol Protocol1]``,
-      typename ``[link asio.reference.RawSocketService RawSocketService1]``>
+      typename ``[link asio.reference.Protocol Protocol1]``>
   basic_raw_socket(
-      basic_raw_socket< Protocol1, RawSocketService1 > && other,
+      basic_raw_socket< Protocol1 > && other,
       typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);
 
 
@@ -14634,13 +14249,13 @@
 [section:executor_type basic_raw_socket::executor_type]
 
 
-['Inherited from basic_io_object.]
+['Inherited from basic_socket.]
 
 [indexterm2 executor_type..basic_raw_socket] 
 The type of the executor associated with the object. 
 
 
-  typedef asio::io_context::executor_type executor_type;
+  typedef io_context::executor_type executor_type;
 
 
 [heading Member Functions]
@@ -14715,7 +14330,7 @@
 [section:get_executor basic_raw_socket::get_executor]
 
 
-['Inherited from basic_io_object.]
+['Inherited from basic_socket.]
 
 [indexterm2 get_executor..basic_raw_socket] 
 Get the executor associated with the object. 
@@ -14728,59 +14343,11 @@
 [endsect]
 
 
-[section:get_implementation basic_raw_socket::get_implementation]
-
-[indexterm2 get_implementation..basic_raw_socket] 
-Get the underlying implementation of the I/O object. 
-
-
-  implementation_type & ``[link asio.reference.basic_raw_socket.get_implementation.overload1 get_implementation]``();
-  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.get_implementation.overload1 more...]]``
-
-  const implementation_type & ``[link asio.reference.basic_raw_socket.get_implementation.overload2 get_implementation]``() const;
-  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.get_implementation.overload2 more...]]``
-
-
-[section:overload1 basic_raw_socket::get_implementation (1 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the underlying implementation of the I/O object. 
-
-
-  implementation_type & get_implementation();
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_raw_socket::get_implementation (2 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the underlying implementation of the I/O object. 
-
-
-  const implementation_type & get_implementation() const;
-
-
-
-[endsect]
-
-
-[endsect]
-
 
 [section:get_io_context basic_raw_socket::get_io_context]
 
 
-['Inherited from basic_io_object.]
+['Inherited from basic_socket.]
 
 [indexterm2 get_io_context..basic_raw_socket] 
 (Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
@@ -14806,7 +14373,7 @@
 [section:get_io_service basic_raw_socket::get_io_service]
 
 
-['Inherited from basic_io_object.]
+['Inherited from basic_socket.]
 
 [indexterm2 get_io_service..basic_raw_socket] 
 (Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
@@ -14834,10 +14401,14 @@
 Get an option from the socket. 
 
 
+  template<
+      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
   void ``[link asio.reference.basic_raw_socket.get_option.overload1 get_option]``(
       GettableSocketOption & option) const;
   ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.get_option.overload1 more...]]``
 
+  template<
+      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
   asio::error_code ``[link asio.reference.basic_raw_socket.get_option.overload2 get_option]``(
       GettableSocketOption & option,
       asio::error_code & ec) const;
@@ -14961,88 +14532,20 @@
 
 [endsect]
 
-[section:get_service basic_raw_socket::get_service]
-
-[indexterm2 get_service..basic_raw_socket] 
-Get the service associated with the I/O object. 
-
-
-  service_type & ``[link asio.reference.basic_raw_socket.get_service.overload1 get_service]``();
-  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.get_service.overload1 more...]]``
-
-  const service_type & ``[link asio.reference.basic_raw_socket.get_service.overload2 get_service]``() const;
-  ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.get_service.overload2 more...]]``
-
-
-[section:overload1 basic_raw_socket::get_service (1 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the service associated with the I/O object. 
-
-
-  service_type & get_service();
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_raw_socket::get_service (2 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the service associated with the I/O object. 
-
-
-  const service_type & get_service() const;
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:implementation_type basic_raw_socket::implementation_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 implementation_type..basic_raw_socket] 
-The underlying implementation type of I/O object. 
-
-
-  typedef service_type::implementation_type implementation_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/basic_raw_socket.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
 [section:io_control basic_raw_socket::io_control]
 
 [indexterm2 io_control..basic_raw_socket] 
 Perform an IO control command on the socket. 
 
 
+  template<
+      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
   void ``[link asio.reference.basic_raw_socket.io_control.overload1 io_control]``(
       IoControlCommand & command);
   ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.io_control.overload1 more...]]``
 
+  template<
+      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
   asio::error_code ``[link asio.reference.basic_raw_socket.io_control.overload2 io_control]``(
       IoControlCommand & command,
       asio::error_code & ec);
@@ -15489,7 +14992,7 @@
 A [link asio.reference.basic_socket `basic_socket`] is always the lowest layer. 
 
 
-  typedef basic_socket< Protocol, RawSocketService > lowest_layer_type;
+  typedef basic_socket< Protocol > lowest_layer_type;
 
 
 [heading Types]
@@ -15547,13 +15050,6 @@
 
   [
 
-    [[link asio.reference.basic_socket.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_socket.keep_alive [*keep_alive]]]
     [Socket option to send keep-alives. ]
   
@@ -15631,13 +15127,6 @@
 
   [
 
-    [[link asio.reference.basic_socket.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_socket.shutdown_type [*shutdown_type]]]
     [Different ways a socket may be shutdown. ]
   
@@ -15816,13 +15305,13 @@
   [[Name][Description]]
 
   [
-    [[link asio.reference.basic_socket.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
+    [[link asio.reference.basic_socket.basic_socket [*basic_socket]]]
+    []
   ]
   
   [
-    [[link asio.reference.basic_socket.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
+    [[link asio.reference.basic_socket.operator_eq_ [*operator=]]]
+    []
   ]
   
   [
@@ -16020,7 +15509,7 @@
 The native representation of a socket. 
 
 
-  typedef RawSocketService::native_handle_type native_handle_type;
+  typedef implementation_defined native_handle_type;
 
 
 
@@ -16657,10 +16146,9 @@
 
 
   template<
-      typename ``[link asio.reference.Protocol Protocol1]``,
-      typename ``[link asio.reference.RawSocketService RawSocketService1]``>
+      typename ``[link asio.reference.Protocol Protocol1]``>
   enable_if< is_convertible< Protocol1, Protocol >::value, basic_raw_socket >::type & ``[link asio.reference.basic_raw_socket.operator_eq_.overload2 operator=]``(
-      basic_raw_socket< Protocol1, RawSocketService1 > && other);
+      basic_raw_socket< Protocol1 > && other);
   ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.operator_eq_.overload2 more...]]``
 
 
@@ -16705,10 +16193,9 @@
 
 
   template<
-      typename ``[link asio.reference.Protocol Protocol1]``,
-      typename ``[link asio.reference.RawSocketService RawSocketService1]``>
+      typename ``[link asio.reference.Protocol Protocol1]``>
   enable_if< is_convertible< Protocol1, Protocol >::value, basic_raw_socket >::type & operator=(
-      basic_raw_socket< Protocol1, RawSocketService1 > && other);
+      basic_raw_socket< Protocol1 > && other);
 
 
 This assignment operator moves a raw socket from one object to another.
@@ -17906,40 +17393,20 @@
 
 [endsect]
 
-
-[section:service_type basic_raw_socket::service_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 service_type..basic_raw_socket] 
-The type of the service that will be used to provide I/O operations. 
-
-
-  typedef RawSocketService service_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/basic_raw_socket.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
 [section:set_option basic_raw_socket::set_option]
 
 [indexterm2 set_option..basic_raw_socket] 
 Set an option on the socket. 
 
 
+  template<
+      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
   void ``[link asio.reference.basic_raw_socket.set_option.overload1 set_option]``(
       const SettableSocketOption & option);
   ``  [''''&raquo;''' [link asio.reference.basic_raw_socket.set_option.overload1 more...]]``
 
+  template<
+      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
   asio::error_code ``[link asio.reference.basic_raw_socket.set_option.overload2 set_option]``(
       const SettableSocketOption & option,
       asio::error_code & ec);
@@ -18378,6 +17845,22 @@
 
 
 
+[section:_basic_raw_socket basic_raw_socket::~basic_raw_socket]
+
+[indexterm2 ~basic_raw_socket..basic_raw_socket] 
+Destroys the socket. 
+
+
+  ~basic_raw_socket();
+
+
+This function destroys the socket, cancelling any outstanding asynchronous operations associated with the socket as if by calling `cancel`. 
+
+
+[endsect]
+
+
+
 [endsect]
 
 [section:basic_seq_packet_socket basic_seq_packet_socket]
@@ -18387,10 +17870,9 @@
 
 
   template<
-      typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SeqPacketSocketService SeqPacketSocketService]`` = seq_packet_socket_service<Protocol>>
+      typename ``[link asio.reference.Protocol Protocol]``>
   class basic_seq_packet_socket :
-    public basic_socket< Protocol, SeqPacketSocketService >
+    public basic_socket< Protocol >
 
 
 [heading Types]
@@ -18448,13 +17930,6 @@
 
   [
 
-    [[link asio.reference.basic_seq_packet_socket.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_seq_packet_socket.keep_alive [*keep_alive]]]
     [Socket option to send keep-alives. ]
   
@@ -18532,13 +18007,6 @@
 
   [
 
-    [[link asio.reference.basic_seq_packet_socket.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_seq_packet_socket.shutdown_type [*shutdown_type]]]
     [Different ways a socket may be shutdown. ]
   
@@ -18732,20 +18200,9 @@
     [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
   ]
   
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
   [
-    [[link asio.reference.basic_seq_packet_socket.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_seq_packet_socket.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
+    [[link asio.reference.basic_seq_packet_socket._basic_seq_packet_socket [*~basic_seq_packet_socket]]]
+    [Destroys the socket. ]
   ]
   
 ]
@@ -19413,10 +18870,9 @@
 
 
   template<
-      typename ``[link asio.reference.Protocol Protocol1]``,
-      typename ``[link asio.reference.SeqPacketSocketService SeqPacketSocketService1]``>
+      typename ``[link asio.reference.Protocol Protocol1]``>
   ``[link asio.reference.basic_seq_packet_socket.basic_seq_packet_socket.overload6 basic_seq_packet_socket]``(
-      basic_seq_packet_socket< Protocol1, SeqPacketSocketService1 > && other,
+      basic_seq_packet_socket< Protocol1 > && other,
       typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);
   ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.basic_seq_packet_socket.overload6 more...]]``
 
@@ -19620,10 +19076,9 @@
 
 
   template<
-      typename ``[link asio.reference.Protocol Protocol1]``,
-      typename ``[link asio.reference.SeqPacketSocketService SeqPacketSocketService1]``>
+      typename ``[link asio.reference.Protocol Protocol1]``>
   basic_seq_packet_socket(
-      basic_seq_packet_socket< Protocol1, SeqPacketSocketService1 > && other,
+      basic_seq_packet_socket< Protocol1 > && other,
       typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);
 
 
@@ -20411,13 +19866,13 @@
 [section:executor_type basic_seq_packet_socket::executor_type]
 
 
-['Inherited from basic_io_object.]
+['Inherited from basic_socket.]
 
 [indexterm2 executor_type..basic_seq_packet_socket] 
 The type of the executor associated with the object. 
 
 
-  typedef asio::io_context::executor_type executor_type;
+  typedef io_context::executor_type executor_type;
 
 
 [heading Member Functions]
@@ -20492,7 +19947,7 @@
 [section:get_executor basic_seq_packet_socket::get_executor]
 
 
-['Inherited from basic_io_object.]
+['Inherited from basic_socket.]
 
 [indexterm2 get_executor..basic_seq_packet_socket] 
 Get the executor associated with the object. 
@@ -20505,59 +19960,11 @@
 [endsect]
 
 
-[section:get_implementation basic_seq_packet_socket::get_implementation]
-
-[indexterm2 get_implementation..basic_seq_packet_socket] 
-Get the underlying implementation of the I/O object. 
-
-
-  implementation_type & ``[link asio.reference.basic_seq_packet_socket.get_implementation.overload1 get_implementation]``();
-  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.get_implementation.overload1 more...]]``
-
-  const implementation_type & ``[link asio.reference.basic_seq_packet_socket.get_implementation.overload2 get_implementation]``() const;
-  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.get_implementation.overload2 more...]]``
-
-
-[section:overload1 basic_seq_packet_socket::get_implementation (1 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the underlying implementation of the I/O object. 
-
-
-  implementation_type & get_implementation();
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_seq_packet_socket::get_implementation (2 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the underlying implementation of the I/O object. 
-
-
-  const implementation_type & get_implementation() const;
-
-
-
-[endsect]
-
-
-[endsect]
-
 
 [section:get_io_context basic_seq_packet_socket::get_io_context]
 
 
-['Inherited from basic_io_object.]
+['Inherited from basic_socket.]
 
 [indexterm2 get_io_context..basic_seq_packet_socket] 
 (Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
@@ -20583,7 +19990,7 @@
 [section:get_io_service basic_seq_packet_socket::get_io_service]
 
 
-['Inherited from basic_io_object.]
+['Inherited from basic_socket.]
 
 [indexterm2 get_io_service..basic_seq_packet_socket] 
 (Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
@@ -20611,10 +20018,14 @@
 Get an option from the socket. 
 
 
+  template<
+      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
   void ``[link asio.reference.basic_seq_packet_socket.get_option.overload1 get_option]``(
       GettableSocketOption & option) const;
   ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.get_option.overload1 more...]]``
 
+  template<
+      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
   asio::error_code ``[link asio.reference.basic_seq_packet_socket.get_option.overload2 get_option]``(
       GettableSocketOption & option,
       asio::error_code & ec) const;
@@ -20738,88 +20149,20 @@
 
 [endsect]
 
-[section:get_service basic_seq_packet_socket::get_service]
-
-[indexterm2 get_service..basic_seq_packet_socket] 
-Get the service associated with the I/O object. 
-
-
-  service_type & ``[link asio.reference.basic_seq_packet_socket.get_service.overload1 get_service]``();
-  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.get_service.overload1 more...]]``
-
-  const service_type & ``[link asio.reference.basic_seq_packet_socket.get_service.overload2 get_service]``() const;
-  ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.get_service.overload2 more...]]``
-
-
-[section:overload1 basic_seq_packet_socket::get_service (1 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the service associated with the I/O object. 
-
-
-  service_type & get_service();
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_seq_packet_socket::get_service (2 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the service associated with the I/O object. 
-
-
-  const service_type & get_service() const;
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:implementation_type basic_seq_packet_socket::implementation_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 implementation_type..basic_seq_packet_socket] 
-The underlying implementation type of I/O object. 
-
-
-  typedef service_type::implementation_type implementation_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/basic_seq_packet_socket.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
 [section:io_control basic_seq_packet_socket::io_control]
 
 [indexterm2 io_control..basic_seq_packet_socket] 
 Perform an IO control command on the socket. 
 
 
+  template<
+      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
   void ``[link asio.reference.basic_seq_packet_socket.io_control.overload1 io_control]``(
       IoControlCommand & command);
   ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.io_control.overload1 more...]]``
 
+  template<
+      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
   asio::error_code ``[link asio.reference.basic_seq_packet_socket.io_control.overload2 io_control]``(
       IoControlCommand & command,
       asio::error_code & ec);
@@ -21266,7 +20609,7 @@
 A [link asio.reference.basic_socket `basic_socket`] is always the lowest layer. 
 
 
-  typedef basic_socket< Protocol, SeqPacketSocketService > lowest_layer_type;
+  typedef basic_socket< Protocol > lowest_layer_type;
 
 
 [heading Types]
@@ -21324,13 +20667,6 @@
 
   [
 
-    [[link asio.reference.basic_socket.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_socket.keep_alive [*keep_alive]]]
     [Socket option to send keep-alives. ]
   
@@ -21408,13 +20744,6 @@
 
   [
 
-    [[link asio.reference.basic_socket.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_socket.shutdown_type [*shutdown_type]]]
     [Different ways a socket may be shutdown. ]
   
@@ -21593,13 +20922,13 @@
   [[Name][Description]]
 
   [
-    [[link asio.reference.basic_socket.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
+    [[link asio.reference.basic_socket.basic_socket [*basic_socket]]]
+    []
   ]
   
   [
-    [[link asio.reference.basic_socket.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
+    [[link asio.reference.basic_socket.operator_eq_ [*operator=]]]
+    []
   ]
   
   [
@@ -21797,7 +21126,7 @@
 The native representation of a socket. 
 
 
-  typedef SeqPacketSocketService::native_handle_type native_handle_type;
+  typedef implementation_defined native_handle_type;
 
 
 
@@ -22434,10 +21763,9 @@
 
 
   template<
-      typename ``[link asio.reference.Protocol Protocol1]``,
-      typename ``[link asio.reference.SeqPacketSocketService SeqPacketSocketService1]``>
+      typename ``[link asio.reference.Protocol Protocol1]``>
   enable_if< is_convertible< Protocol1, Protocol >::value, basic_seq_packet_socket >::type & ``[link asio.reference.basic_seq_packet_socket.operator_eq_.overload2 operator=]``(
-      basic_seq_packet_socket< Protocol1, SeqPacketSocketService1 > && other);
+      basic_seq_packet_socket< Protocol1 > && other);
   ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.operator_eq_.overload2 more...]]``
 
 
@@ -22482,10 +21810,9 @@
 
 
   template<
-      typename ``[link asio.reference.Protocol Protocol1]``,
-      typename ``[link asio.reference.SeqPacketSocketService SeqPacketSocketService1]``>
+      typename ``[link asio.reference.Protocol Protocol1]``>
   enable_if< is_convertible< Protocol1, Protocol >::value, basic_seq_packet_socket >::type & operator=(
-      basic_seq_packet_socket< Protocol1, SeqPacketSocketService1 > && other);
+      basic_seq_packet_socket< Protocol1 > && other);
 
 
 This assignment operator moves a sequenced packet socket from one object to another.
@@ -23262,40 +22589,20 @@
 [endsect]
 
 
-
-[section:service_type basic_seq_packet_socket::service_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 service_type..basic_seq_packet_socket] 
-The type of the service that will be used to provide I/O operations. 
-
-
-  typedef SeqPacketSocketService service_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/basic_seq_packet_socket.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
 [section:set_option basic_seq_packet_socket::set_option]
 
 [indexterm2 set_option..basic_seq_packet_socket] 
 Set an option on the socket. 
 
 
+  template<
+      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
   void ``[link asio.reference.basic_seq_packet_socket.set_option.overload1 set_option]``(
       const SettableSocketOption & option);
   ``  [''''&raquo;''' [link asio.reference.basic_seq_packet_socket.set_option.overload1 more...]]``
 
+  template<
+      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
   asio::error_code ``[link asio.reference.basic_seq_packet_socket.set_option.overload2 set_option]``(
       const SettableSocketOption & option,
       asio::error_code & ec);
@@ -23734,3067 +23041,16 @@
 
 
 
-[endsect]
+[section:_basic_seq_packet_socket basic_seq_packet_socket::~basic_seq_packet_socket]
 
-[section:basic_serial_port basic_serial_port]
+[indexterm2 ~basic_seq_packet_socket..basic_seq_packet_socket] 
+Destroys the socket. 
 
 
-Provides serial port functionality. 
+  ~basic_seq_packet_socket();
 
 
-  template<
-      typename ``[link asio.reference.SerialPortService SerialPortService]`` = serial_port_service>
-  class basic_serial_port :
-    public basic_io_object< SerialPortService >,
-    public serial_port_base
-
-
-[heading Types]
-[table
-  [[Name][Description]]
-
-  [
-
-    [[link asio.reference.basic_serial_port.executor_type [*executor_type]]]
-    [The type of the executor associated with the object. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.basic_serial_port.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.basic_serial_port.lowest_layer_type [*lowest_layer_type]]]
-    [A basic_serial_port is always the lowest layer. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.basic_serial_port.native_handle_type [*native_handle_type]]]
-    [The native representation of a serial port. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.basic_serial_port.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-]
-
-[heading Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.basic_serial_port.assign [*assign]]]
-    [Assign an existing native serial port to the serial port. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.async_read_some [*async_read_some]]]
-    [Start an asynchronous read. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.async_write_some [*async_write_some]]]
-    [Start an asynchronous write. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.basic_serial_port [*basic_serial_port]]]
-    [Construct a basic_serial_port without opening it. 
-
-     Construct and open a basic_serial_port. 
-
-     Construct a basic_serial_port on an existing native serial port. 
-
-     Move-construct a basic_serial_port from another. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.cancel [*cancel]]]
-    [Cancel all asynchronous operations associated with the serial port. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.close [*close]]]
-    [Close the serial port. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.get_executor [*get_executor]]]
-    [Get the executor associated with the object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.get_io_context [*get_io_context]]]
-    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.get_io_service [*get_io_service]]]
-    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.get_option [*get_option]]]
-    [Get an option from the serial port. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.is_open [*is_open]]]
-    [Determine whether the serial port is open. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.lowest_layer [*lowest_layer]]]
-    [Get a reference to the lowest layer. 
-
-     Get a const reference to the lowest layer. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.native_handle [*native_handle]]]
-    [Get the native serial port representation. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.open [*open]]]
-    [Open the serial port using the specified device name. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.operator_eq_ [*operator=]]]
-    [Move-assign a basic_serial_port from another. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.read_some [*read_some]]]
-    [Read some data from the serial port. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.send_break [*send_break]]]
-    [Send a break sequence to the serial port. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.set_option [*set_option]]]
-    [Set an option on the serial port. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.write_some [*write_some]]]
-    [Write some data to the serial port. ]
-  ]
-  
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.basic_serial_port.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
-  ]
-  
-]
-
-The [link asio.reference.basic_serial_port `basic_serial_port`] class template provides functionality that is common to all serial ports.
-
-
-[heading Thread Safety]
-  
-['Distinct] ['objects:] Safe.
-
-['Shared] ['objects:] Unsafe. 
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/basic_serial_port.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-[section:assign basic_serial_port::assign]
-
-[indexterm2 assign..basic_serial_port] 
-Assign an existing native serial port to the serial port. 
-
-
-  void ``[link asio.reference.basic_serial_port.assign.overload1 assign]``(
-      const native_handle_type & native_serial_port);
-  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.assign.overload1 more...]]``
-
-  asio::error_code ``[link asio.reference.basic_serial_port.assign.overload2 assign]``(
-      const native_handle_type & native_serial_port,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.assign.overload2 more...]]``
-
-
-[section:overload1 basic_serial_port::assign (1 of 2 overloads)]
-
-
-Assign an existing native serial port to the serial port. 
-
-
-  void assign(
-      const native_handle_type & native_serial_port);
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_serial_port::assign (2 of 2 overloads)]
-
-
-Assign an existing native serial port to the serial port. 
-
-
-  asio::error_code assign(
-      const native_handle_type & native_serial_port,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:async_read_some basic_serial_port::async_read_some]
-
-[indexterm2 async_read_some..basic_serial_port] 
-Start an asynchronous read. 
-
-
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
-      typename ``[link asio.reference.ReadHandler ReadHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_some(
-      const MutableBufferSequence & buffers,
-      ReadHandler && handler);
-
-
-This function is used to asynchronously read data from the serial port. The function call always returns immediately.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[buffers][One or more buffers into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]
-
-[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
-``
-   void handler(
-     const asio::error_code& error, // Result of operation.
-     std::size_t bytes_transferred           // Number of bytes read.
-   ); 
-``
-Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using `asio::io_context::post()`.]]
-
-]
-
-
-[heading Remarks]
-      
-The read operation may not read all of the requested number of bytes. Consider using the [link asio.reference.async_read `async_read`]  function if you need to ensure that the requested amount of data is read before the asynchronous operation completes.
-
-
-[heading Example]
-  
-To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 
-
-   serial_port.async_read_some(asio::buffer(data, size), handler);
-
-
-See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 
-
-
-
-
-[endsect]
-
-
-
-[section:async_write_some basic_serial_port::async_write_some]
-
-[indexterm2 async_write_some..basic_serial_port] 
-Start an asynchronous write. 
-
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
-      typename ``[link asio.reference.WriteHandler WriteHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_write_some(
-      const ConstBufferSequence & buffers,
-      WriteHandler && handler);
-
-
-This function is used to asynchronously write data to the serial port. The function call always returns immediately.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[buffers][One or more data buffers to be written to the serial port. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]
-
-[[handler][The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
-``
-   void handler(
-     const asio::error_code& error, // Result of operation.
-     std::size_t bytes_transferred           // Number of bytes written.
-   ); 
-``
-Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using `asio::io_context::post()`.]]
-
-]
-
-
-[heading Remarks]
-      
-The write operation may not transmit all of the data to the peer. Consider using the [link asio.reference.async_write `async_write`]  function if you need to ensure that all data is written before the asynchronous operation completes.
-
-
-[heading Example]
-  
-To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 
-
-   serial_port.async_write_some(asio::buffer(data, size), handler);
-
-
-See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 
-
-
-
-
-[endsect]
-
-
-[section:basic_serial_port basic_serial_port::basic_serial_port]
-
-[indexterm2 basic_serial_port..basic_serial_port] 
-Construct a [link asio.reference.basic_serial_port `basic_serial_port`] without opening it. 
-
-
-  explicit ``[link asio.reference.basic_serial_port.basic_serial_port.overload1 basic_serial_port]``(
-      asio::io_context & io_context);
-  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.basic_serial_port.overload1 more...]]``
-
-
-Construct and open a [link asio.reference.basic_serial_port `basic_serial_port`]. 
-
-
-  explicit ``[link asio.reference.basic_serial_port.basic_serial_port.overload2 basic_serial_port]``(
-      asio::io_context & io_context,
-      const char * device);
-  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.basic_serial_port.overload2 more...]]``
-
-  explicit ``[link asio.reference.basic_serial_port.basic_serial_port.overload3 basic_serial_port]``(
-      asio::io_context & io_context,
-      const std::string & device);
-  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.basic_serial_port.overload3 more...]]``
-
-
-Construct a [link asio.reference.basic_serial_port `basic_serial_port`] on an existing native serial port. 
-
-
-  ``[link asio.reference.basic_serial_port.basic_serial_port.overload4 basic_serial_port]``(
-      asio::io_context & io_context,
-      const native_handle_type & native_serial_port);
-  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.basic_serial_port.overload4 more...]]``
-
-
-Move-construct a [link asio.reference.basic_serial_port `basic_serial_port`] from another. 
-
-
-  ``[link asio.reference.basic_serial_port.basic_serial_port.overload5 basic_serial_port]``(
-      basic_serial_port && other);
-  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.basic_serial_port.overload5 more...]]``
-
-
-[section:overload1 basic_serial_port::basic_serial_port (1 of 5 overloads)]
-
-
-Construct a [link asio.reference.basic_serial_port `basic_serial_port`] without opening it. 
-
-
-  basic_serial_port(
-      asio::io_context & io_context);
-
-
-This constructor creates a serial port without opening it.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[io_context][The [link asio.reference.io_context `io_context`] object that the serial port will use to dispatch handlers for any asynchronous operations performed on the port. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_serial_port::basic_serial_port (2 of 5 overloads)]
-
-
-Construct and open a [link asio.reference.basic_serial_port `basic_serial_port`]. 
-
-
-  basic_serial_port(
-      asio::io_context & io_context,
-      const char * device);
-
-
-This constructor creates and opens a serial port for the specified device name.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[io_context][The [link asio.reference.io_context `io_context`] object that the serial port will use to dispatch handlers for any asynchronous operations performed on the port.]]
-
-[[device][The platform-specific device name for this serial port. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-
-[section:overload3 basic_serial_port::basic_serial_port (3 of 5 overloads)]
-
-
-Construct and open a [link asio.reference.basic_serial_port `basic_serial_port`]. 
-
-
-  basic_serial_port(
-      asio::io_context & io_context,
-      const std::string & device);
-
-
-This constructor creates and opens a serial port for the specified device name.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[io_context][The [link asio.reference.io_context `io_context`] object that the serial port will use to dispatch handlers for any asynchronous operations performed on the port.]]
-
-[[device][The platform-specific device name for this serial port. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-
-[section:overload4 basic_serial_port::basic_serial_port (4 of 5 overloads)]
-
-
-Construct a [link asio.reference.basic_serial_port `basic_serial_port`] on an existing native serial port. 
-
-
-  basic_serial_port(
-      asio::io_context & io_context,
-      const native_handle_type & native_serial_port);
-
-
-This constructor creates a serial port object to hold an existing native serial port.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[io_context][The [link asio.reference.io_context `io_context`] object that the serial port will use to dispatch handlers for any asynchronous operations performed on the port.]]
-
-[[native_serial_port][A native serial port.]]
-
-]
-
-
-[heading Exceptions]
-    
-
-[variablelist
-  
-[[asio::system_error][Thrown on failure. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-
-[section:overload5 basic_serial_port::basic_serial_port (5 of 5 overloads)]
-
-
-Move-construct a [link asio.reference.basic_serial_port `basic_serial_port`] from another. 
-
-
-  basic_serial_port(
-      basic_serial_port && other);
-
-
-This constructor moves a serial port from one object to another.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[other][The other [link asio.reference.basic_serial_port `basic_serial_port`] object from which the move will occur.]]
-
-]
-
-
-[heading Remarks]
-      
-Following the move, the moved-from object is in the same state as if constructed using the `basic_serial_port(io_context&) constructor`. 
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-[section:cancel basic_serial_port::cancel]
-
-[indexterm2 cancel..basic_serial_port] 
-Cancel all asynchronous operations associated with the serial port. 
-
-
-  void ``[link asio.reference.basic_serial_port.cancel.overload1 cancel]``();
-  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.cancel.overload1 more...]]``
-
-  asio::error_code ``[link asio.reference.basic_serial_port.cancel.overload2 cancel]``(
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.cancel.overload2 more...]]``
-
-
-[section:overload1 basic_serial_port::cancel (1 of 2 overloads)]
-
-
-Cancel all asynchronous operations associated with the serial port. 
-
-
-  void cancel();
-
-
-This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.
-
-
-[heading Exceptions]
-    
-
-[variablelist
-  
-[[asio::system_error][Thrown on failure. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_serial_port::cancel (2 of 2 overloads)]
-
-
-Cancel all asynchronous operations associated with the serial port. 
-
-
-  asio::error_code cancel(
-      asio::error_code & ec);
-
-
-This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[ec][Set to indicate what error occurred, if any. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-[section:close basic_serial_port::close]
-
-[indexterm2 close..basic_serial_port] 
-Close the serial port. 
-
-
-  void ``[link asio.reference.basic_serial_port.close.overload1 close]``();
-  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.close.overload1 more...]]``
-
-  asio::error_code ``[link asio.reference.basic_serial_port.close.overload2 close]``(
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.close.overload2 more...]]``
-
-
-[section:overload1 basic_serial_port::close (1 of 2 overloads)]
-
-
-Close the serial port. 
-
-
-  void close();
-
-
-This function is used to close the serial port. Any asynchronous read or write operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.
-
-
-[heading Exceptions]
-    
-
-[variablelist
-  
-[[asio::system_error][Thrown on failure. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_serial_port::close (2 of 2 overloads)]
-
-
-Close the serial port. 
-
-
-  asio::error_code close(
-      asio::error_code & ec);
-
-
-This function is used to close the serial port. Any asynchronous read or write operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[ec][Set to indicate what error occurred, if any. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:executor_type basic_serial_port::executor_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 executor_type..basic_serial_port] 
-The type of the executor associated with the object. 
-
-
-  typedef asio::io_context::executor_type executor_type;
-
-
-[heading Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.io_context__executor_type.context [*context]]]
-    [Obtain the underlying execution context. ]
-  ]
-  
-  [
-    [[link asio.reference.io_context__executor_type.defer [*defer]]]
-    [Request the io_context to invoke the given function object. ]
-  ]
-  
-  [
-    [[link asio.reference.io_context__executor_type.dispatch [*dispatch]]]
-    [Request the io_context to invoke the given function object. ]
-  ]
-  
-  [
-    [[link asio.reference.io_context__executor_type.on_work_finished [*on_work_finished]]]
-    [Inform the io_context that some work is no longer outstanding. ]
-  ]
-  
-  [
-    [[link asio.reference.io_context__executor_type.on_work_started [*on_work_started]]]
-    [Inform the io_context that it has some outstanding work to do. ]
-  ]
-  
-  [
-    [[link asio.reference.io_context__executor_type.post [*post]]]
-    [Request the io_context to invoke the given function object. ]
-  ]
-  
-  [
-    [[link asio.reference.io_context__executor_type.running_in_this_thread [*running_in_this_thread]]]
-    [Determine whether the io_context is running in the current thread. ]
-  ]
-  
-]
-
-[heading Friends]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.io_context__executor_type.operator_not__eq_ [*operator!=]]]
-    [Compare two executors for inequality. ]
-  ]
-  
-  [
-    [[link asio.reference.io_context__executor_type.operator_eq__eq_ [*operator==]]]
-    [Compare two executors for equality. ]
-  ]
-  
-]
-
-
-[heading Requirements]
-
-['Header: ][^asio/basic_serial_port.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:get_executor basic_serial_port::get_executor]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 get_executor..basic_serial_port] 
-Get the executor associated with the object. 
-
-
-  executor_type get_executor();
-
-
-
-[endsect]
-
-
-[section:get_implementation basic_serial_port::get_implementation]
-
-[indexterm2 get_implementation..basic_serial_port] 
-Get the underlying implementation of the I/O object. 
-
-
-  implementation_type & ``[link asio.reference.basic_serial_port.get_implementation.overload1 get_implementation]``();
-  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.get_implementation.overload1 more...]]``
-
-  const implementation_type & ``[link asio.reference.basic_serial_port.get_implementation.overload2 get_implementation]``() const;
-  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.get_implementation.overload2 more...]]``
-
-
-[section:overload1 basic_serial_port::get_implementation (1 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the underlying implementation of the I/O object. 
-
-
-  implementation_type & get_implementation();
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_serial_port::get_implementation (2 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the underlying implementation of the I/O object. 
-
-
-  const implementation_type & get_implementation() const;
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:get_io_context basic_serial_port::get_io_context]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 get_io_context..basic_serial_port] 
-(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
-
-
-  asio::io_context & get_io_context();
-
-
-This function may be used to obtain the [link asio.reference.io_context `io_context`] object that the I/O object uses to dispatch handlers for asynchronous operations.
-
-
-[heading Return Value]
-      
-A reference to the [link asio.reference.io_context `io_context`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 
-
-
-
-
-[endsect]
-
-
-
-[section:get_io_service basic_serial_port::get_io_service]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 get_io_service..basic_serial_port] 
-(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
-
-
-  asio::io_context & get_io_service();
-
-
-This function may be used to obtain the [link asio.reference.io_context `io_context`] object that the I/O object uses to dispatch handlers for asynchronous operations.
-
-
-[heading Return Value]
-      
-A reference to the [link asio.reference.io_context `io_context`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 
-
-
-
-
-[endsect]
-
-
-[section:get_option basic_serial_port::get_option]
-
-[indexterm2 get_option..basic_serial_port] 
-Get an option from the serial port. 
-
-
-  template<
-      typename ``[link asio.reference.GettableSerialPortOption GettableSerialPortOption]``>
-  void ``[link asio.reference.basic_serial_port.get_option.overload1 get_option]``(
-      GettableSerialPortOption & option);
-  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.get_option.overload1 more...]]``
-
-  template<
-      typename ``[link asio.reference.GettableSerialPortOption GettableSerialPortOption]``>
-  asio::error_code ``[link asio.reference.basic_serial_port.get_option.overload2 get_option]``(
-      GettableSerialPortOption & option,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.get_option.overload2 more...]]``
-
-
-[section:overload1 basic_serial_port::get_option (1 of 2 overloads)]
-
-
-Get an option from the serial port. 
-
-
-  template<
-      typename ``[link asio.reference.GettableSerialPortOption GettableSerialPortOption]``>
-  void get_option(
-      GettableSerialPortOption & option);
-
-
-This function is used to get the current value of an option on the serial port.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[option][The option value to be obtained from the serial port.]]
-
-]
-
-
-[heading Exceptions]
-    
-
-[variablelist
-  
-[[asio::system_error][Thrown on failure.]]
-
-]
-
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_serial_port::get_option (2 of 2 overloads)]
-
-
-Get an option from the serial port. 
-
-
-  template<
-      typename ``[link asio.reference.GettableSerialPortOption GettableSerialPortOption]``>
-  asio::error_code get_option(
-      GettableSerialPortOption & option,
-      asio::error_code & ec);
-
-
-This function is used to get the current value of an option on the serial port.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[option][The option value to be obtained from the serial port.]]
-
-[[ec][Set to indicate what error occurred, if any.]]
-
-]
-
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-[section:get_service basic_serial_port::get_service]
-
-[indexterm2 get_service..basic_serial_port] 
-Get the service associated with the I/O object. 
-
-
-  service_type & ``[link asio.reference.basic_serial_port.get_service.overload1 get_service]``();
-  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.get_service.overload1 more...]]``
-
-  const service_type & ``[link asio.reference.basic_serial_port.get_service.overload2 get_service]``() const;
-  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.get_service.overload2 more...]]``
-
-
-[section:overload1 basic_serial_port::get_service (1 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the service associated with the I/O object. 
-
-
-  service_type & get_service();
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_serial_port::get_service (2 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the service associated with the I/O object. 
-
-
-  const service_type & get_service() const;
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:implementation_type basic_serial_port::implementation_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 implementation_type..basic_serial_port] 
-The underlying implementation type of I/O object. 
-
-
-  typedef service_type::implementation_type implementation_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/basic_serial_port.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:is_open basic_serial_port::is_open]
-
-[indexterm2 is_open..basic_serial_port] 
-Determine whether the serial port is open. 
-
-
-  bool is_open() const;
-
-
-
-[endsect]
-
-
-[section:lowest_layer basic_serial_port::lowest_layer]
-
-[indexterm2 lowest_layer..basic_serial_port] 
-Get a reference to the lowest layer. 
-
-
-  lowest_layer_type & ``[link asio.reference.basic_serial_port.lowest_layer.overload1 lowest_layer]``();
-  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.lowest_layer.overload1 more...]]``
-
-
-Get a const reference to the lowest layer. 
-
-
-  const lowest_layer_type & ``[link asio.reference.basic_serial_port.lowest_layer.overload2 lowest_layer]``() const;
-  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.lowest_layer.overload2 more...]]``
-
-
-[section:overload1 basic_serial_port::lowest_layer (1 of 2 overloads)]
-
-
-Get a reference to the lowest layer. 
-
-
-  lowest_layer_type & lowest_layer();
-
-
-This function returns a reference to the lowest layer in a stack of layers. Since a [link asio.reference.basic_serial_port `basic_serial_port`] cannot contain any further layers, it simply returns a reference to itself.
-
-
-[heading Return Value]
-      
-A reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_serial_port::lowest_layer (2 of 2 overloads)]
-
-
-Get a const reference to the lowest layer. 
-
-
-  const lowest_layer_type & lowest_layer() const;
-
-
-This function returns a const reference to the lowest layer in a stack of layers. Since a [link asio.reference.basic_serial_port `basic_serial_port`] cannot contain any further layers, it simply returns a reference to itself.
-
-
-[heading Return Value]
-      
-A const reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:lowest_layer_type basic_serial_port::lowest_layer_type]
-
-[indexterm2 lowest_layer_type..basic_serial_port] 
-A [link asio.reference.basic_serial_port `basic_serial_port`] is always the lowest layer. 
-
-
-  typedef basic_serial_port< SerialPortService > lowest_layer_type;
-
-
-[heading Types]
-[table
-  [[Name][Description]]
-
-  [
-
-    [[link asio.reference.basic_serial_port.executor_type [*executor_type]]]
-    [The type of the executor associated with the object. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.basic_serial_port.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.basic_serial_port.lowest_layer_type [*lowest_layer_type]]]
-    [A basic_serial_port is always the lowest layer. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.basic_serial_port.native_handle_type [*native_handle_type]]]
-    [The native representation of a serial port. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.basic_serial_port.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-]
-
-[heading Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.basic_serial_port.assign [*assign]]]
-    [Assign an existing native serial port to the serial port. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.async_read_some [*async_read_some]]]
-    [Start an asynchronous read. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.async_write_some [*async_write_some]]]
-    [Start an asynchronous write. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.basic_serial_port [*basic_serial_port]]]
-    [Construct a basic_serial_port without opening it. 
-
-     Construct and open a basic_serial_port. 
-
-     Construct a basic_serial_port on an existing native serial port. 
-
-     Move-construct a basic_serial_port from another. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.cancel [*cancel]]]
-    [Cancel all asynchronous operations associated with the serial port. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.close [*close]]]
-    [Close the serial port. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.get_executor [*get_executor]]]
-    [Get the executor associated with the object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.get_io_context [*get_io_context]]]
-    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.get_io_service [*get_io_service]]]
-    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.get_option [*get_option]]]
-    [Get an option from the serial port. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.is_open [*is_open]]]
-    [Determine whether the serial port is open. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.lowest_layer [*lowest_layer]]]
-    [Get a reference to the lowest layer. 
-
-     Get a const reference to the lowest layer. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.native_handle [*native_handle]]]
-    [Get the native serial port representation. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.open [*open]]]
-    [Open the serial port using the specified device name. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.operator_eq_ [*operator=]]]
-    [Move-assign a basic_serial_port from another. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.read_some [*read_some]]]
-    [Read some data from the serial port. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.send_break [*send_break]]]
-    [Send a break sequence to the serial port. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.set_option [*set_option]]]
-    [Set an option on the serial port. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.write_some [*write_some]]]
-    [Write some data to the serial port. ]
-  ]
-  
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.basic_serial_port.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
-  ]
-  
-]
-
-The [link asio.reference.basic_serial_port `basic_serial_port`] class template provides functionality that is common to all serial ports.
-
-
-[heading Thread Safety]
-  
-['Distinct] ['objects:] Safe.
-
-['Shared] ['objects:] Unsafe. 
-
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/basic_serial_port.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:native_handle basic_serial_port::native_handle]
-
-[indexterm2 native_handle..basic_serial_port] 
-Get the native serial port representation. 
-
-
-  native_handle_type native_handle();
-
-
-This function may be used to obtain the underlying representation of the serial port. This is intended to allow access to native serial port functionality that is not otherwise provided. 
-
-
-[endsect]
-
-
-
-[section:native_handle_type basic_serial_port::native_handle_type]
-
-[indexterm2 native_handle_type..basic_serial_port] 
-The native representation of a serial port. 
-
-
-  typedef SerialPortService::native_handle_type native_handle_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/basic_serial_port.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-[section:open basic_serial_port::open]
-
-[indexterm2 open..basic_serial_port] 
-Open the serial port using the specified device name. 
-
-
-  void ``[link asio.reference.basic_serial_port.open.overload1 open]``(
-      const std::string & device);
-  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.open.overload1 more...]]``
-
-  asio::error_code ``[link asio.reference.basic_serial_port.open.overload2 open]``(
-      const std::string & device,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.open.overload2 more...]]``
-
-
-[section:overload1 basic_serial_port::open (1 of 2 overloads)]
-
-
-Open the serial port using the specified device name. 
-
-
-  void open(
-      const std::string & device);
-
-
-This function opens the serial port for the specified device name.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[device][The platform-specific device name.]]
-
-]
-
-
-[heading Exceptions]
-    
-
-[variablelist
-  
-[[asio::system_error][Thrown on failure. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_serial_port::open (2 of 2 overloads)]
-
-
-Open the serial port using the specified device name. 
-
-
-  asio::error_code open(
-      const std::string & device,
-      asio::error_code & ec);
-
-
-This function opens the serial port using the given platform-specific device name.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[device][The platform-specific device name.]]
-
-[[ec][Set the indicate what error occurred, if any. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:operator_eq_ basic_serial_port::operator=]
-
-[indexterm2 operator=..basic_serial_port] 
-Move-assign a [link asio.reference.basic_serial_port `basic_serial_port`] from another. 
-
-
-  basic_serial_port & operator=(
-      basic_serial_port && other);
-
-
-This assignment operator moves a serial port from one object to another.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[other][The other [link asio.reference.basic_serial_port `basic_serial_port`] object from which the move will occur.]]
-
-]
-
-
-[heading Remarks]
-      
-Following the move, the moved-from object is in the same state as if constructed using the `basic_serial_port(io_context&) constructor`. 
-
-
-
-
-[endsect]
-
-
-[section:read_some basic_serial_port::read_some]
-
-[indexterm2 read_some..basic_serial_port] 
-Read some data from the serial port. 
-
-
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
-  std::size_t ``[link asio.reference.basic_serial_port.read_some.overload1 read_some]``(
-      const MutableBufferSequence & buffers);
-  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.read_some.overload1 more...]]``
-
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
-  std::size_t ``[link asio.reference.basic_serial_port.read_some.overload2 read_some]``(
-      const MutableBufferSequence & buffers,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.read_some.overload2 more...]]``
-
-
-[section:overload1 basic_serial_port::read_some (1 of 2 overloads)]
-
-
-Read some data from the serial port. 
-
-
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
-  std::size_t read_some(
-      const MutableBufferSequence & buffers);
-
-
-This function is used to read data from the serial port. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[buffers][One or more buffers into which the data will be read.]]
-
-]
-
-
-[heading Return Value]
-      
-The number of bytes read.
-
-
-[heading Exceptions]
-    
-
-[variablelist
-  
-[[asio::system_error][Thrown on failure. An error code of `asio::error::eof` indicates that the connection was closed by the peer.]]
-
-]
-
-
-[heading Remarks]
-      
-The read\_some operation may not read all of the requested number of bytes. Consider using the [link asio.reference.read `read`]  function if you need to ensure that the requested amount of data is read before the blocking operation completes.
-
-
-[heading Example]
-  
-To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 
-
-   serial_port.read_some(asio::buffer(data, size));
-
-
-See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_serial_port::read_some (2 of 2 overloads)]
-
-
-Read some data from the serial port. 
-
-
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
-  std::size_t read_some(
-      const MutableBufferSequence & buffers,
-      asio::error_code & ec);
-
-
-This function is used to read data from the serial port. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[buffers][One or more buffers into which the data will be read.]]
-
-[[ec][Set to indicate what error occurred, if any.]]
-
-]
-
-
-[heading Return Value]
-      
-The number of bytes read. Returns 0 if an error occurred.
-
-
-[heading Remarks]
-      
-The read\_some operation may not read all of the requested number of bytes. Consider using the [link asio.reference.read `read`]  function if you need to ensure that the requested amount of data is read before the blocking operation completes. 
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-[section:send_break basic_serial_port::send_break]
-
-[indexterm2 send_break..basic_serial_port] 
-Send a break sequence to the serial port. 
-
-
-  void ``[link asio.reference.basic_serial_port.send_break.overload1 send_break]``();
-  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.send_break.overload1 more...]]``
-
-  asio::error_code ``[link asio.reference.basic_serial_port.send_break.overload2 send_break]``(
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.send_break.overload2 more...]]``
-
-
-[section:overload1 basic_serial_port::send_break (1 of 2 overloads)]
-
-
-Send a break sequence to the serial port. 
-
-
-  void send_break();
-
-
-This function causes a break sequence of platform-specific duration to be sent out the serial port.
-
-
-[heading Exceptions]
-    
-
-[variablelist
-  
-[[asio::system_error][Thrown on failure. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_serial_port::send_break (2 of 2 overloads)]
-
-
-Send a break sequence to the serial port. 
-
-
-  asio::error_code send_break(
-      asio::error_code & ec);
-
-
-This function causes a break sequence of platform-specific duration to be sent out the serial port.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[ec][Set to indicate what error occurred, if any. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:service_type basic_serial_port::service_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 service_type..basic_serial_port] 
-The type of the service that will be used to provide I/O operations. 
-
-
-  typedef SerialPortService service_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/basic_serial_port.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-[section:set_option basic_serial_port::set_option]
-
-[indexterm2 set_option..basic_serial_port] 
-Set an option on the serial port. 
-
-
-  template<
-      typename ``[link asio.reference.SettableSerialPortOption SettableSerialPortOption]``>
-  void ``[link asio.reference.basic_serial_port.set_option.overload1 set_option]``(
-      const SettableSerialPortOption & option);
-  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.set_option.overload1 more...]]``
-
-  template<
-      typename ``[link asio.reference.SettableSerialPortOption SettableSerialPortOption]``>
-  asio::error_code ``[link asio.reference.basic_serial_port.set_option.overload2 set_option]``(
-      const SettableSerialPortOption & option,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.set_option.overload2 more...]]``
-
-
-[section:overload1 basic_serial_port::set_option (1 of 2 overloads)]
-
-
-Set an option on the serial port. 
-
-
-  template<
-      typename ``[link asio.reference.SettableSerialPortOption SettableSerialPortOption]``>
-  void set_option(
-      const SettableSerialPortOption & option);
-
-
-This function is used to set an option on the serial port.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[option][The option value to be set on the serial port.]]
-
-]
-
-
-[heading Exceptions]
-    
-
-[variablelist
-  
-[[asio::system_error][Thrown on failure.]]
-
-]
-
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_serial_port::set_option (2 of 2 overloads)]
-
-
-Set an option on the serial port. 
-
-
-  template<
-      typename ``[link asio.reference.SettableSerialPortOption SettableSerialPortOption]``>
-  asio::error_code set_option(
-      const SettableSerialPortOption & option,
-      asio::error_code & ec);
-
-
-This function is used to set an option on the serial port.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[option][The option value to be set on the serial port.]]
-
-[[ec][Set to indicate what error occurred, if any.]]
-
-]
-
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-[section:write_some basic_serial_port::write_some]
-
-[indexterm2 write_some..basic_serial_port] 
-Write some data to the serial port. 
-
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
-  std::size_t ``[link asio.reference.basic_serial_port.write_some.overload1 write_some]``(
-      const ConstBufferSequence & buffers);
-  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.write_some.overload1 more...]]``
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
-  std::size_t ``[link asio.reference.basic_serial_port.write_some.overload2 write_some]``(
-      const ConstBufferSequence & buffers,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.basic_serial_port.write_some.overload2 more...]]``
-
-
-[section:overload1 basic_serial_port::write_some (1 of 2 overloads)]
-
-
-Write some data to the serial port. 
-
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
-  std::size_t write_some(
-      const ConstBufferSequence & buffers);
-
-
-This function is used to write data to the serial port. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[buffers][One or more data buffers to be written to the serial port.]]
-
-]
-
-
-[heading Return Value]
-      
-The number of bytes written.
-
-
-[heading Exceptions]
-    
-
-[variablelist
-  
-[[asio::system_error][Thrown on failure. An error code of `asio::error::eof` indicates that the connection was closed by the peer.]]
-
-]
-
-
-[heading Remarks]
-      
-The write\_some operation may not transmit all of the data to the peer. Consider using the [link asio.reference.write `write`]  function if you need to ensure that all data is written before the blocking operation completes.
-
-
-[heading Example]
-  
-To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 
-
-   serial_port.write_some(asio::buffer(data, size));
-
-
-See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_serial_port::write_some (2 of 2 overloads)]
-
-
-Write some data to the serial port. 
-
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
-  std::size_t write_some(
-      const ConstBufferSequence & buffers,
-      asio::error_code & ec);
-
-
-This function is used to write data to the serial port. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[buffers][One or more data buffers to be written to the serial port.]]
-
-[[ec][Set to indicate what error occurred, if any.]]
-
-]
-
-
-[heading Return Value]
-      
-The number of bytes written. Returns 0 if an error occurred.
-
-
-[heading Remarks]
-      
-The write\_some operation may not transmit all of the data to the peer. Consider using the [link asio.reference.write `write`]  function if you need to ensure that all data is written before the blocking operation completes. 
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[endsect]
-
-[section:basic_signal_set basic_signal_set]
-
-
-Provides signal functionality. 
-
-
-  template<
-      typename ``[link asio.reference.SignalSetService SignalSetService]`` = signal_set_service>
-  class basic_signal_set :
-    public basic_io_object< SignalSetService >
-
-
-[heading Types]
-[table
-  [[Name][Description]]
-
-  [
-
-    [[link asio.reference.basic_signal_set.executor_type [*executor_type]]]
-    [The type of the executor associated with the object. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.basic_signal_set.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.basic_signal_set.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-]
-
-[heading Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.basic_signal_set.add [*add]]]
-    [Add a signal to a signal_set. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_signal_set.async_wait [*async_wait]]]
-    [Start an asynchronous operation to wait for a signal to be delivered. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_signal_set.basic_signal_set [*basic_signal_set]]]
-    [Construct a signal set without adding any signals. 
-
-     Construct a signal set and add one signal. 
-
-     Construct a signal set and add two signals. 
-
-     Construct a signal set and add three signals. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_signal_set.cancel [*cancel]]]
-    [Cancel all operations associated with the signal set. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_signal_set.clear [*clear]]]
-    [Remove all signals from a signal_set. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_signal_set.get_executor [*get_executor]]]
-    [Get the executor associated with the object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_signal_set.get_io_context [*get_io_context]]]
-    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_signal_set.get_io_service [*get_io_service]]]
-    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_signal_set.remove [*remove]]]
-    [Remove a signal from a signal_set. ]
-  ]
-  
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.basic_signal_set.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_signal_set.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
-  ]
-  
-]
-
-The [link asio.reference.basic_signal_set `basic_signal_set`] class template provides the ability to perform an asynchronous wait for one or more signals to occur.
-
-Most applications will use the [link asio.reference.signal_set `signal_set`] typedef.
-
-
-[heading Thread Safety]
-  
-['Distinct] ['objects:] Safe.
-
-['Shared] ['objects:] Unsafe.
-
-
-[heading Example]
-  
-Performing an asynchronous wait: 
-
-   void handler(
-       const asio::error_code& error,
-       int signal_number)
-   {
-     if (!error)
-     {
-       // A signal occurred.
-     }
-   }
-
-   ...
-
-   // Construct a signal set registered for process termination.
-   asio::signal_set signals(io_context, SIGINT, SIGTERM);
-
-   // Start an asynchronous wait for one of the signals to occur.
-   signals.async_wait(handler);
-
-
-
-
-
-[heading Queueing of signal notifications]
-  
-
-
-If a signal is registered with a signal\_set, and the signal occurs when there are no waiting handlers, then the signal notification is queued. The next async\_wait operation on that signal\_set will dequeue the notification. If multiple notifications are queued, subsequent async\_wait operations dequeue them one at a time. Signal notifications are dequeued in order of ascending signal number.
-
-If a signal number is removed from a signal\_set (using the `remove` or `erase` member functions) then any queued notifications for that signal are discarded.
-
-
-[heading Multiple registration of signals]
-  
-
-
-The same signal number may be registered with different signal\_set objects. When the signal occurs, one handler is called for each signal\_set object.
-
-Note that multiple registration only works for signals that are registered using Asio. The application must not also register a signal handler using functions such as `signal()` or `sigaction()`.
-
-
-[heading Signal masking on POSIX platforms]
-  
-
-
-POSIX allows signals to be blocked using functions such as `sigprocmask()` and `pthread_sigmask()`. For signals to be delivered, programs must ensure that any signals registered using signal\_set objects are unblocked in at least one thread. 
-
-[heading Requirements]
-
-['Header: ][^asio/basic_signal_set.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-[section:add basic_signal_set::add]
-
-[indexterm2 add..basic_signal_set] 
-Add a signal to a signal\_set. 
-
-
-  void ``[link asio.reference.basic_signal_set.add.overload1 add]``(
-      int signal_number);
-  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.add.overload1 more...]]``
-
-  asio::error_code ``[link asio.reference.basic_signal_set.add.overload2 add]``(
-      int signal_number,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.add.overload2 more...]]``
-
-
-[section:overload1 basic_signal_set::add (1 of 2 overloads)]
-
-
-Add a signal to a signal\_set. 
-
-
-  void add(
-      int signal_number);
-
-
-This function adds the specified signal to the set. It has no effect if the signal is already in the set.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[signal_number][The signal to be added to the set.]]
-
-]
-
-
-[heading Exceptions]
-    
-
-[variablelist
-  
-[[asio::system_error][Thrown on failure. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_signal_set::add (2 of 2 overloads)]
-
-
-Add a signal to a signal\_set. 
-
-
-  asio::error_code add(
-      int signal_number,
-      asio::error_code & ec);
-
-
-This function adds the specified signal to the set. It has no effect if the signal is already in the set.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[signal_number][The signal to be added to the set.]]
-
-[[ec][Set to indicate what error occurred, if any. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:async_wait basic_signal_set::async_wait]
-
-[indexterm2 async_wait..basic_signal_set] 
-Start an asynchronous operation to wait for a signal to be delivered. 
-
-
-  template<
-      typename ``[link asio.reference.SignalHandler SignalHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
-      SignalHandler && handler);
-
-
-This function may be used to initiate an asynchronous wait against the signal set. It always returns immediately.
-
-For each call to `async_wait()`, the supplied handler will be called exactly once. The handler will be called when:
-
-
-* One of the registered signals in the signal set occurs; or
-
-
-* The signal set was cancelled, in which case the handler is passed the error code `asio::error::operation_aborted`.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[handler][The handler to be called when the signal occurs. Copies will be made of the handler as required. The function signature of the handler must be: 
-``
-   void handler(
-     const asio::error_code& error, // Result of operation.
-     int signal_number // Indicates which signal occurred.
-   ); 
-``
-Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using `asio::io_context::post()`. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-[section:basic_signal_set basic_signal_set::basic_signal_set]
-
-[indexterm2 basic_signal_set..basic_signal_set] 
-Construct a signal set without adding any signals. 
-
-
-  explicit ``[link asio.reference.basic_signal_set.basic_signal_set.overload1 basic_signal_set]``(
-      asio::io_context & io_context);
-  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.basic_signal_set.overload1 more...]]``
-
-
-Construct a signal set and add one signal. 
-
-
-  ``[link asio.reference.basic_signal_set.basic_signal_set.overload2 basic_signal_set]``(
-      asio::io_context & io_context,
-      int signal_number_1);
-  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.basic_signal_set.overload2 more...]]``
-
-
-Construct a signal set and add two signals. 
-
-
-  ``[link asio.reference.basic_signal_set.basic_signal_set.overload3 basic_signal_set]``(
-      asio::io_context & io_context,
-      int signal_number_1,
-      int signal_number_2);
-  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.basic_signal_set.overload3 more...]]``
-
-
-Construct a signal set and add three signals. 
-
-
-  ``[link asio.reference.basic_signal_set.basic_signal_set.overload4 basic_signal_set]``(
-      asio::io_context & io_context,
-      int signal_number_1,
-      int signal_number_2,
-      int signal_number_3);
-  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.basic_signal_set.overload4 more...]]``
-
-
-[section:overload1 basic_signal_set::basic_signal_set (1 of 4 overloads)]
-
-
-Construct a signal set without adding any signals. 
-
-
-  basic_signal_set(
-      asio::io_context & io_context);
-
-
-This constructor creates a signal set without registering for any signals.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[io_context][The [link asio.reference.io_context `io_context`] object that the signal set will use to dispatch handlers for any asynchronous operations performed on the set. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_signal_set::basic_signal_set (2 of 4 overloads)]
-
-
-Construct a signal set and add one signal. 
-
-
-  basic_signal_set(
-      asio::io_context & io_context,
-      int signal_number_1);
-
-
-This constructor creates a signal set and registers for one signal.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[io_context][The [link asio.reference.io_context `io_context`] object that the signal set will use to dispatch handlers for any asynchronous operations performed on the set.]]
-
-[[signal_number_1][The signal number to be added.]]
-
-]
-
-
-[heading Remarks]
-      
-This constructor is equivalent to performing: 
-
-   asio::signal_set signals(io_context);
-   signals.add(signal_number_1); 
-
-
-
-
-
-
-
-[endsect]
-
-
-
-[section:overload3 basic_signal_set::basic_signal_set (3 of 4 overloads)]
-
-
-Construct a signal set and add two signals. 
-
-
-  basic_signal_set(
-      asio::io_context & io_context,
-      int signal_number_1,
-      int signal_number_2);
-
-
-This constructor creates a signal set and registers for two signals.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[io_context][The [link asio.reference.io_context `io_context`] object that the signal set will use to dispatch handlers for any asynchronous operations performed on the set.]]
-
-[[signal_number_1][The first signal number to be added.]]
-
-[[signal_number_2][The second signal number to be added.]]
-
-]
-
-
-[heading Remarks]
-      
-This constructor is equivalent to performing: 
-
-   asio::signal_set signals(io_context);
-   signals.add(signal_number_1);
-   signals.add(signal_number_2); 
-
-
-
-
-
-
-
-[endsect]
-
-
-
-[section:overload4 basic_signal_set::basic_signal_set (4 of 4 overloads)]
-
-
-Construct a signal set and add three signals. 
-
-
-  basic_signal_set(
-      asio::io_context & io_context,
-      int signal_number_1,
-      int signal_number_2,
-      int signal_number_3);
-
-
-This constructor creates a signal set and registers for three signals.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[io_context][The [link asio.reference.io_context `io_context`] object that the signal set will use to dispatch handlers for any asynchronous operations performed on the set.]]
-
-[[signal_number_1][The first signal number to be added.]]
-
-[[signal_number_2][The second signal number to be added.]]
-
-[[signal_number_3][The third signal number to be added.]]
-
-]
-
-
-[heading Remarks]
-      
-This constructor is equivalent to performing: 
-
-   asio::signal_set signals(io_context);
-   signals.add(signal_number_1);
-   signals.add(signal_number_2);
-   signals.add(signal_number_3); 
-
-
-
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-[section:cancel basic_signal_set::cancel]
-
-[indexterm2 cancel..basic_signal_set] 
-Cancel all operations associated with the signal set. 
-
-
-  void ``[link asio.reference.basic_signal_set.cancel.overload1 cancel]``();
-  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.cancel.overload1 more...]]``
-
-  asio::error_code ``[link asio.reference.basic_signal_set.cancel.overload2 cancel]``(
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.cancel.overload2 more...]]``
-
-
-[section:overload1 basic_signal_set::cancel (1 of 2 overloads)]
-
-
-Cancel all operations associated with the signal set. 
-
-
-  void cancel();
-
-
-This function forces the completion of any pending asynchronous wait operations against the signal set. The handler for each cancelled operation will be invoked with the `asio::error::operation_aborted` error code.
-
-Cancellation does not alter the set of registered signals.
-
-
-[heading Exceptions]
-    
-
-[variablelist
-  
-[[asio::system_error][Thrown on failure.]]
-
-]
-
-
-[heading Remarks]
-      
-If a registered signal occurred before `cancel()` is called, then the handlers for asynchronous wait operations will:
-
-
-* have already been invoked; or
-
-
-* have been queued for invocation in the near future.
-
-These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation. 
-
-
-[endsect]
-
-
-
-[section:overload2 basic_signal_set::cancel (2 of 2 overloads)]
-
-
-Cancel all operations associated with the signal set. 
-
-
-  asio::error_code cancel(
-      asio::error_code & ec);
-
-
-This function forces the completion of any pending asynchronous wait operations against the signal set. The handler for each cancelled operation will be invoked with the `asio::error::operation_aborted` error code.
-
-Cancellation does not alter the set of registered signals.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[ec][Set to indicate what error occurred, if any.]]
-
-]
-
-
-[heading Remarks]
-      
-If a registered signal occurred before `cancel()` is called, then the handlers for asynchronous wait operations will:
-
-
-* have already been invoked; or
-
-
-* have been queued for invocation in the near future.
-
-These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation. 
-
-
-[endsect]
-
-
-[endsect]
-
-[section:clear basic_signal_set::clear]
-
-[indexterm2 clear..basic_signal_set] 
-Remove all signals from a signal\_set. 
-
-
-  void ``[link asio.reference.basic_signal_set.clear.overload1 clear]``();
-  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.clear.overload1 more...]]``
-
-  asio::error_code ``[link asio.reference.basic_signal_set.clear.overload2 clear]``(
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.clear.overload2 more...]]``
-
-
-[section:overload1 basic_signal_set::clear (1 of 2 overloads)]
-
-
-Remove all signals from a signal\_set. 
-
-
-  void clear();
-
-
-This function removes all signals from the set. It has no effect if the set is already empty.
-
-
-[heading Exceptions]
-    
-
-[variablelist
-  
-[[asio::system_error][Thrown on failure.]]
-
-]
-
-
-[heading Remarks]
-      
-Removes all queued notifications. 
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_signal_set::clear (2 of 2 overloads)]
-
-
-Remove all signals from a signal\_set. 
-
-
-  asio::error_code clear(
-      asio::error_code & ec);
-
-
-This function removes all signals from the set. It has no effect if the set is already empty.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[ec][Set to indicate what error occurred, if any.]]
-
-]
-
-
-[heading Remarks]
-      
-Removes all queued notifications. 
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:executor_type basic_signal_set::executor_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 executor_type..basic_signal_set] 
-The type of the executor associated with the object. 
-
-
-  typedef asio::io_context::executor_type executor_type;
-
-
-[heading Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.io_context__executor_type.context [*context]]]
-    [Obtain the underlying execution context. ]
-  ]
-  
-  [
-    [[link asio.reference.io_context__executor_type.defer [*defer]]]
-    [Request the io_context to invoke the given function object. ]
-  ]
-  
-  [
-    [[link asio.reference.io_context__executor_type.dispatch [*dispatch]]]
-    [Request the io_context to invoke the given function object. ]
-  ]
-  
-  [
-    [[link asio.reference.io_context__executor_type.on_work_finished [*on_work_finished]]]
-    [Inform the io_context that some work is no longer outstanding. ]
-  ]
-  
-  [
-    [[link asio.reference.io_context__executor_type.on_work_started [*on_work_started]]]
-    [Inform the io_context that it has some outstanding work to do. ]
-  ]
-  
-  [
-    [[link asio.reference.io_context__executor_type.post [*post]]]
-    [Request the io_context to invoke the given function object. ]
-  ]
-  
-  [
-    [[link asio.reference.io_context__executor_type.running_in_this_thread [*running_in_this_thread]]]
-    [Determine whether the io_context is running in the current thread. ]
-  ]
-  
-]
-
-[heading Friends]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.io_context__executor_type.operator_not__eq_ [*operator!=]]]
-    [Compare two executors for inequality. ]
-  ]
-  
-  [
-    [[link asio.reference.io_context__executor_type.operator_eq__eq_ [*operator==]]]
-    [Compare two executors for equality. ]
-  ]
-  
-]
-
-
-[heading Requirements]
-
-['Header: ][^asio/basic_signal_set.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:get_executor basic_signal_set::get_executor]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 get_executor..basic_signal_set] 
-Get the executor associated with the object. 
-
-
-  executor_type get_executor();
-
-
-
-[endsect]
-
-
-[section:get_implementation basic_signal_set::get_implementation]
-
-[indexterm2 get_implementation..basic_signal_set] 
-Get the underlying implementation of the I/O object. 
-
-
-  implementation_type & ``[link asio.reference.basic_signal_set.get_implementation.overload1 get_implementation]``();
-  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.get_implementation.overload1 more...]]``
-
-  const implementation_type & ``[link asio.reference.basic_signal_set.get_implementation.overload2 get_implementation]``() const;
-  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.get_implementation.overload2 more...]]``
-
-
-[section:overload1 basic_signal_set::get_implementation (1 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the underlying implementation of the I/O object. 
-
-
-  implementation_type & get_implementation();
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_signal_set::get_implementation (2 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the underlying implementation of the I/O object. 
-
-
-  const implementation_type & get_implementation() const;
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:get_io_context basic_signal_set::get_io_context]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 get_io_context..basic_signal_set] 
-(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
-
-
-  asio::io_context & get_io_context();
-
-
-This function may be used to obtain the [link asio.reference.io_context `io_context`] object that the I/O object uses to dispatch handlers for asynchronous operations.
-
-
-[heading Return Value]
-      
-A reference to the [link asio.reference.io_context `io_context`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 
-
-
-
-
-[endsect]
-
-
-
-[section:get_io_service basic_signal_set::get_io_service]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 get_io_service..basic_signal_set] 
-(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
-
-
-  asio::io_context & get_io_service();
-
-
-This function may be used to obtain the [link asio.reference.io_context `io_context`] object that the I/O object uses to dispatch handlers for asynchronous operations.
-
-
-[heading Return Value]
-      
-A reference to the [link asio.reference.io_context `io_context`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 
-
-
-
-
-[endsect]
-
-
-[section:get_service basic_signal_set::get_service]
-
-[indexterm2 get_service..basic_signal_set] 
-Get the service associated with the I/O object. 
-
-
-  service_type & ``[link asio.reference.basic_signal_set.get_service.overload1 get_service]``();
-  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.get_service.overload1 more...]]``
-
-  const service_type & ``[link asio.reference.basic_signal_set.get_service.overload2 get_service]``() const;
-  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.get_service.overload2 more...]]``
-
-
-[section:overload1 basic_signal_set::get_service (1 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the service associated with the I/O object. 
-
-
-  service_type & get_service();
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_signal_set::get_service (2 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the service associated with the I/O object. 
-
-
-  const service_type & get_service() const;
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:implementation_type basic_signal_set::implementation_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 implementation_type..basic_signal_set] 
-The underlying implementation type of I/O object. 
-
-
-  typedef service_type::implementation_type implementation_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/basic_signal_set.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-[section:remove basic_signal_set::remove]
-
-[indexterm2 remove..basic_signal_set] 
-Remove a signal from a signal\_set. 
-
-
-  void ``[link asio.reference.basic_signal_set.remove.overload1 remove]``(
-      int signal_number);
-  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.remove.overload1 more...]]``
-
-  asio::error_code ``[link asio.reference.basic_signal_set.remove.overload2 remove]``(
-      int signal_number,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.basic_signal_set.remove.overload2 more...]]``
-
-
-[section:overload1 basic_signal_set::remove (1 of 2 overloads)]
-
-
-Remove a signal from a signal\_set. 
-
-
-  void remove(
-      int signal_number);
-
-
-This function removes the specified signal from the set. It has no effect if the signal is not in the set.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[signal_number][The signal to be removed from the set.]]
-
-]
-
-
-[heading Exceptions]
-    
-
-[variablelist
-  
-[[asio::system_error][Thrown on failure.]]
-
-]
-
-
-[heading Remarks]
-      
-Removes any notifications that have been queued for the specified signal number. 
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_signal_set::remove (2 of 2 overloads)]
-
-
-Remove a signal from a signal\_set. 
-
-
-  asio::error_code remove(
-      int signal_number,
-      asio::error_code & ec);
-
-
-This function removes the specified signal from the set. It has no effect if the signal is not in the set.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[signal_number][The signal to be removed from the set.]]
-
-[[ec][Set to indicate what error occurred, if any.]]
-
-]
-
-
-[heading Remarks]
-      
-Removes any notifications that have been queued for the specified signal number. 
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:service_type basic_signal_set::service_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 service_type..basic_signal_set] 
-The type of the service that will be used to provide I/O operations. 
-
-
-  typedef SignalSetService service_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/basic_signal_set.hpp]
-
-['Convenience header: ][^asio.hpp]
+This function destroys the socket, cancelling any outstanding asynchronous operations associated with the socket as if by calling `cancel`. 
 
 
 [endsect]
@@ -26810,10 +23066,8 @@
 
 
   template<
-      typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``>
+      typename ``[link asio.reference.Protocol Protocol]``>
   class basic_socket :
-    public basic_io_object< SocketService >,
     public socket_base
 
 
@@ -26872,13 +23126,6 @@
 
   [
 
-    [[link asio.reference.basic_socket.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_socket.keep_alive [*keep_alive]]]
     [Socket option to send keep-alives. ]
   
@@ -26956,13 +23203,6 @@
 
   [
 
-    [[link asio.reference.basic_socket.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_socket.shutdown_type [*shutdown_type]]]
     [Different ways a socket may be shutdown. ]
   
@@ -27141,13 +23381,13 @@
   [[Name][Description]]
 
   [
-    [[link asio.reference.basic_socket.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
+    [[link asio.reference.basic_socket.basic_socket [*basic_socket]]]
+    []
   ]
   
   [
-    [[link asio.reference.basic_socket.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
+    [[link asio.reference.basic_socket.operator_eq_ [*operator=]]]
+    []
   ]
   
   [
@@ -27599,10 +23839,9 @@
 
 
   template<
-      typename ``[link asio.reference.Protocol Protocol1]``,
-      typename ``[link asio.reference.SocketService SocketService1]``>
+      typename ``[link asio.reference.Protocol Protocol1]``>
   ``[link asio.reference.basic_socket.basic_socket.overload6 basic_socket]``(
-      basic_socket< Protocol1, SocketService1 > && other,
+      basic_socket< Protocol1 > && other,
       typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);
   ``  [''''&raquo;''' [link asio.reference.basic_socket.basic_socket.overload6 more...]]``
 
@@ -27806,10 +24045,9 @@
 
 
   template<
-      typename ``[link asio.reference.Protocol Protocol1]``,
-      typename ``[link asio.reference.SocketService SocketService1]``>
+      typename ``[link asio.reference.Protocol Protocol1]``>
   basic_socket(
-      basic_socket< Protocol1, SocketService1 > && other,
+      basic_socket< Protocol1 > && other,
       typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);
 
 
@@ -27838,6 +24076,19 @@
 
 [endsect]
 
+
+[section:basic_socket basic_socket::basic_socket]
+
+[indexterm2 basic_socket..basic_socket] 
+
+  basic_socket(
+      const basic_socket & );
+
+
+
+[endsect]
+
+
 [section:bind basic_socket::bind]
 
 [indexterm2 bind..basic_socket] 
@@ -28572,14 +24823,11 @@
 
 [section:executor_type basic_socket::executor_type]
 
-
-['Inherited from basic_io_object.]
-
 [indexterm2 executor_type..basic_socket] 
 The type of the executor associated with the object. 
 
 
-  typedef asio::io_context::executor_type executor_type;
+  typedef io_context::executor_type executor_type;
 
 
 [heading Member Functions]
@@ -28653,9 +24901,6 @@
 
 [section:get_executor basic_socket::get_executor]
 
-
-['Inherited from basic_io_object.]
-
 [indexterm2 get_executor..basic_socket] 
 Get the executor associated with the object. 
 
@@ -28667,60 +24912,9 @@
 [endsect]
 
 
-[section:get_implementation basic_socket::get_implementation]
-
-[indexterm2 get_implementation..basic_socket] 
-Get the underlying implementation of the I/O object. 
-
-
-  implementation_type & ``[link asio.reference.basic_socket.get_implementation.overload1 get_implementation]``();
-  ``  [''''&raquo;''' [link asio.reference.basic_socket.get_implementation.overload1 more...]]``
-
-  const implementation_type & ``[link asio.reference.basic_socket.get_implementation.overload2 get_implementation]``() const;
-  ``  [''''&raquo;''' [link asio.reference.basic_socket.get_implementation.overload2 more...]]``
-
-
-[section:overload1 basic_socket::get_implementation (1 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the underlying implementation of the I/O object. 
-
-
-  implementation_type & get_implementation();
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_socket::get_implementation (2 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the underlying implementation of the I/O object. 
-
-
-  const implementation_type & get_implementation() const;
-
-
-
-[endsect]
-
-
-[endsect]
-
 
 [section:get_io_context basic_socket::get_io_context]
 
-
-['Inherited from basic_io_object.]
-
 [indexterm2 get_io_context..basic_socket] 
 (Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
 
@@ -28744,9 +24938,6 @@
 
 [section:get_io_service basic_socket::get_io_service]
 
-
-['Inherited from basic_io_object.]
-
 [indexterm2 get_io_service..basic_socket] 
 (Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
 
@@ -28898,78 +25089,6 @@
 
 [endsect]
 
-[section:get_service basic_socket::get_service]
-
-[indexterm2 get_service..basic_socket] 
-Get the service associated with the I/O object. 
-
-
-  service_type & ``[link asio.reference.basic_socket.get_service.overload1 get_service]``();
-  ``  [''''&raquo;''' [link asio.reference.basic_socket.get_service.overload1 more...]]``
-
-  const service_type & ``[link asio.reference.basic_socket.get_service.overload2 get_service]``() const;
-  ``  [''''&raquo;''' [link asio.reference.basic_socket.get_service.overload2 more...]]``
-
-
-[section:overload1 basic_socket::get_service (1 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the service associated with the I/O object. 
-
-
-  service_type & get_service();
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_socket::get_service (2 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the service associated with the I/O object. 
-
-
-  const service_type & get_service() const;
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:implementation_type basic_socket::implementation_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 implementation_type..basic_socket] 
-The underlying implementation type of I/O object. 
-
-
-  typedef service_type::implementation_type implementation_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/basic_socket.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
 [section:io_control basic_socket::io_control]
 
 [indexterm2 io_control..basic_socket] 
@@ -29406,7 +25525,7 @@
 A [link asio.reference.basic_socket `basic_socket`] is always the lowest layer. 
 
 
-  typedef basic_socket< Protocol, SocketService > lowest_layer_type;
+  typedef basic_socket< Protocol > lowest_layer_type;
 
 
 [heading Types]
@@ -29464,13 +25583,6 @@
 
   [
 
-    [[link asio.reference.basic_socket.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_socket.keep_alive [*keep_alive]]]
     [Socket option to send keep-alives. ]
   
@@ -29548,13 +25660,6 @@
 
   [
 
-    [[link asio.reference.basic_socket.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_socket.shutdown_type [*shutdown_type]]]
     [Different ways a socket may be shutdown. ]
   
@@ -29733,13 +25838,13 @@
   [[Name][Description]]
 
   [
-    [[link asio.reference.basic_socket.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
+    [[link asio.reference.basic_socket.basic_socket [*basic_socket]]]
+    []
   ]
   
   [
-    [[link asio.reference.basic_socket.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
+    [[link asio.reference.basic_socket.operator_eq_ [*operator=]]]
+    []
   ]
   
   [
@@ -29934,7 +26039,7 @@
 The native representation of a socket. 
 
 
-  typedef SocketService::native_handle_type native_handle_type;
+  typedef implementation_defined native_handle_type;
 
 
 
@@ -30547,10 +26652,9 @@
 
 
   template<
-      typename ``[link asio.reference.Protocol Protocol1]``,
-      typename ``[link asio.reference.SocketService SocketService1]``>
+      typename ``[link asio.reference.Protocol Protocol1]``>
   enable_if< is_convertible< Protocol1, Protocol >::value, basic_socket >::type & ``[link asio.reference.basic_socket.operator_eq_.overload2 operator=]``(
-      basic_socket< Protocol1, SocketService1 > && other);
+      basic_socket< Protocol1 > && other);
   ``  [''''&raquo;''' [link asio.reference.basic_socket.operator_eq_.overload2 more...]]``
 
 
@@ -30595,10 +26699,9 @@
 
 
   template<
-      typename ``[link asio.reference.Protocol Protocol1]``,
-      typename ``[link asio.reference.SocketService SocketService1]``>
+      typename ``[link asio.reference.Protocol Protocol1]``>
   enable_if< is_convertible< Protocol1, Protocol >::value, basic_socket >::type & operator=(
-      basic_socket< Protocol1, SocketService1 > && other);
+      basic_socket< Protocol1 > && other);
 
 
 This assignment operator moves a socket from one object to another.
@@ -30627,6 +26730,19 @@
 [endsect]
 
 
+[section:operator_eq_ basic_socket::operator=]
+
+[indexterm2 operator=..basic_socket] 
+
+  basic_socket & operator=(
+      const basic_socket & );
+
+
+
+[endsect]
+
+
+
 [section:protocol_type basic_socket::protocol_type]
 
 [indexterm2 protocol_type..basic_socket] 
@@ -31028,30 +27144,6 @@
 [endsect]
 
 
-
-[section:service_type basic_socket::service_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 service_type..basic_socket] 
-The type of the service that will be used to provide I/O operations. 
-
-
-  typedef SocketService service_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/basic_socket.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
 [section:set_option basic_socket::set_option]
 
 [indexterm2 set_option..basic_socket] 
@@ -31495,6 +27587,8 @@
   ~basic_socket();
 
 
+This function destroys the socket, cancelling any outstanding asynchronous operations associated with the socket as if by calling `cancel`. 
+
 
 [endsect]
 
@@ -31509,10 +27603,8 @@
 
 
   template<
-      typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketAcceptorService SocketAcceptorService]`` = socket_acceptor_service<Protocol>>
+      typename ``[link asio.reference.Protocol Protocol]``>
   class basic_socket_acceptor :
-    public basic_io_object< SocketAcceptorService >,
     public socket_base
 
 
@@ -31571,13 +27663,6 @@
 
   [
 
-    [[link asio.reference.basic_socket_acceptor.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_socket_acceptor.keep_alive [*keep_alive]]]
     [Socket option to send keep-alives. ]
   
@@ -31648,13 +27733,6 @@
 
   [
 
-    [[link asio.reference.basic_socket_acceptor.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_socket_acceptor.shutdown_type [*shutdown_type]]]
     [Different ways a socket may be shutdown. ]
   
@@ -31806,20 +27884,9 @@
     [Wait for the acceptor to become ready to read, ready to write, or to have pending error conditions. ]
   ]
   
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
   [
-    [[link asio.reference.basic_socket_acceptor.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_socket_acceptor.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
+    [[link asio.reference.basic_socket_acceptor._basic_socket_acceptor [*~basic_socket_acceptor]]]
+    [Destroys the acceptor. ]
   ]
   
 ]
@@ -31894,18 +27961,16 @@
 
 
   template<
-      typename ``[link asio.reference.Protocol Protocol1]``,
-      typename ``[link asio.reference.SocketService SocketService]``>
+      typename ``[link asio.reference.Protocol Protocol1]``>
   void ``[link asio.reference.basic_socket_acceptor.accept.overload1 accept]``(
-      basic_socket< Protocol1, SocketService > & peer,
+      basic_socket< Protocol1 > & peer,
       typename enable_if< is_convertible< Protocol, Protocol1 >::value >::type *  = 0);
   ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.accept.overload1 more...]]``
 
   template<
-      typename ``[link asio.reference.Protocol Protocol1]``,
-      typename ``[link asio.reference.SocketService SocketService]``>
+      typename ``[link asio.reference.Protocol Protocol1]``>
   asio::error_code ``[link asio.reference.basic_socket_acceptor.accept.overload2 accept]``(
-      basic_socket< Protocol1, SocketService > & peer,
+      basic_socket< Protocol1 > & peer,
       asio::error_code & ec,
       typename enable_if< is_convertible< Protocol, Protocol1 >::value >::type *  = 0);
   ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.accept.overload2 more...]]``
@@ -31914,17 +27979,13 @@
 Accept a new connection and obtain the endpoint of the peer. 
 
 
-  template<
-      typename ``[link asio.reference.SocketService SocketService]``>
   void ``[link asio.reference.basic_socket_acceptor.accept.overload3 accept]``(
-      basic_socket< protocol_type, SocketService > & peer,
+      basic_socket< protocol_type > & peer,
       endpoint_type & peer_endpoint);
   ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.accept.overload3 more...]]``
 
-  template<
-      typename ``[link asio.reference.SocketService SocketService]``>
   asio::error_code ``[link asio.reference.basic_socket_acceptor.accept.overload4 accept]``(
-      basic_socket< protocol_type, SocketService > & peer,
+      basic_socket< protocol_type > & peer,
       endpoint_type & peer_endpoint,
       asio::error_code & ec);
   ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.accept.overload4 more...]]``
@@ -31973,10 +28034,9 @@
 
 
   template<
-      typename ``[link asio.reference.Protocol Protocol1]``,
-      typename ``[link asio.reference.SocketService SocketService]``>
+      typename ``[link asio.reference.Protocol Protocol1]``>
   void accept(
-      basic_socket< Protocol1, SocketService > & peer,
+      basic_socket< Protocol1 > & peer,
       typename enable_if< is_convertible< Protocol, Protocol1 >::value >::type *  = 0);
 
 
@@ -32029,10 +28089,9 @@
 
 
   template<
-      typename ``[link asio.reference.Protocol Protocol1]``,
-      typename ``[link asio.reference.SocketService SocketService]``>
+      typename ``[link asio.reference.Protocol Protocol1]``>
   asio::error_code accept(
-      basic_socket< Protocol1, SocketService > & peer,
+      basic_socket< Protocol1 > & peer,
       asio::error_code & ec,
       typename enable_if< is_convertible< Protocol, Protocol1 >::value >::type *  = 0);
 
@@ -32082,10 +28141,8 @@
 Accept a new connection and obtain the endpoint of the peer. 
 
 
-  template<
-      typename ``[link asio.reference.SocketService SocketService]``>
   void accept(
-      basic_socket< protocol_type, SocketService > & peer,
+      basic_socket< protocol_type > & peer,
       endpoint_type & peer_endpoint);
 
 
@@ -32140,10 +28197,8 @@
 Accept a new connection and obtain the endpoint of the peer. 
 
 
-  template<
-      typename ``[link asio.reference.SocketService SocketService]``>
   asio::error_code accept(
-      basic_socket< protocol_type, SocketService > & peer,
+      basic_socket< protocol_type > & peer,
       endpoint_type & peer_endpoint,
       asio::error_code & ec);
 
@@ -32701,19 +28756,17 @@
 
   template<
       typename ``[link asio.reference.Protocol Protocol1]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename ``[link asio.reference.AcceptHandler AcceptHandler]``>
   ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.basic_socket_acceptor.async_accept.overload1 async_accept]``(
-      basic_socket< Protocol1, SocketService > & peer,
+      basic_socket< Protocol1 > & peer,
       AcceptHandler && handler,
       typename enable_if< is_convertible< Protocol, Protocol1 >::value >::type *  = 0);
   ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.async_accept.overload1 more...]]``
 
   template<
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename ``[link asio.reference.AcceptHandler AcceptHandler]``>
   ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.basic_socket_acceptor.async_accept.overload2 async_accept]``(
-      basic_socket< protocol_type, SocketService > & peer,
+      basic_socket< protocol_type > & peer,
       endpoint_type & peer_endpoint,
       AcceptHandler && handler);
   ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.async_accept.overload2 more...]]``
@@ -32755,10 +28808,9 @@
 
   template<
       typename ``[link asio.reference.Protocol Protocol1]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename ``[link asio.reference.AcceptHandler AcceptHandler]``>
   ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_accept(
-      basic_socket< Protocol1, SocketService > & peer,
+      basic_socket< Protocol1 > & peer,
       AcceptHandler && handler,
       typename enable_if< is_convertible< Protocol, Protocol1 >::value >::type *  = 0);
 
@@ -32820,10 +28872,9 @@
 
 
   template<
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename ``[link asio.reference.AcceptHandler AcceptHandler]``>
   ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_accept(
-      basic_socket< protocol_type, SocketService > & peer,
+      basic_socket< protocol_type > & peer,
       endpoint_type & peer_endpoint,
       AcceptHandler && handler);
 
@@ -33240,10 +29291,9 @@
 
 
   template<
-      typename ``[link asio.reference.Protocol Protocol1]``,
-      typename ``[link asio.reference.SocketAcceptorService SocketAcceptorService1]``>
+      typename ``[link asio.reference.Protocol Protocol1]``>
   ``[link asio.reference.basic_socket_acceptor.basic_socket_acceptor.overload6 basic_socket_acceptor]``(
-      basic_socket_acceptor< Protocol1, SocketAcceptorService1 > && other,
+      basic_socket_acceptor< Protocol1 > && other,
       typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);
   ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.basic_socket_acceptor.overload6 more...]]``
 
@@ -33465,10 +29515,9 @@
 
 
   template<
-      typename ``[link asio.reference.Protocol Protocol1]``,
-      typename ``[link asio.reference.SocketAcceptorService SocketAcceptorService1]``>
+      typename ``[link asio.reference.Protocol Protocol1]``>
   basic_socket_acceptor(
-      basic_socket_acceptor< Protocol1, SocketAcceptorService1 > && other,
+      basic_socket_acceptor< Protocol1 > && other,
       typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);
 
 
@@ -34064,14 +30113,11 @@
 
 [section:executor_type basic_socket_acceptor::executor_type]
 
-
-['Inherited from basic_io_object.]
-
 [indexterm2 executor_type..basic_socket_acceptor] 
 The type of the executor associated with the object. 
 
 
-  typedef asio::io_context::executor_type executor_type;
+  typedef io_context::executor_type executor_type;
 
 
 [heading Member Functions]
@@ -34145,9 +30191,6 @@
 
 [section:get_executor basic_socket_acceptor::get_executor]
 
-
-['Inherited from basic_io_object.]
-
 [indexterm2 get_executor..basic_socket_acceptor] 
 Get the executor associated with the object. 
 
@@ -34159,60 +30202,9 @@
 [endsect]
 
 
-[section:get_implementation basic_socket_acceptor::get_implementation]
-
-[indexterm2 get_implementation..basic_socket_acceptor] 
-Get the underlying implementation of the I/O object. 
-
-
-  implementation_type & ``[link asio.reference.basic_socket_acceptor.get_implementation.overload1 get_implementation]``();
-  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.get_implementation.overload1 more...]]``
-
-  const implementation_type & ``[link asio.reference.basic_socket_acceptor.get_implementation.overload2 get_implementation]``() const;
-  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.get_implementation.overload2 more...]]``
-
-
-[section:overload1 basic_socket_acceptor::get_implementation (1 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the underlying implementation of the I/O object. 
-
-
-  implementation_type & get_implementation();
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_socket_acceptor::get_implementation (2 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the underlying implementation of the I/O object. 
-
-
-  const implementation_type & get_implementation() const;
-
-
-
-[endsect]
-
-
-[endsect]
-
 
 [section:get_io_context basic_socket_acceptor::get_io_context]
 
-
-['Inherited from basic_io_object.]
-
 [indexterm2 get_io_context..basic_socket_acceptor] 
 (Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
 
@@ -34236,9 +30228,6 @@
 
 [section:get_io_service basic_socket_acceptor::get_io_service]
 
-
-['Inherited from basic_io_object.]
-
 [indexterm2 get_io_service..basic_socket_acceptor] 
 (Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
 
@@ -34390,78 +30379,6 @@
 
 [endsect]
 
-[section:get_service basic_socket_acceptor::get_service]
-
-[indexterm2 get_service..basic_socket_acceptor] 
-Get the service associated with the I/O object. 
-
-
-  service_type & ``[link asio.reference.basic_socket_acceptor.get_service.overload1 get_service]``();
-  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.get_service.overload1 more...]]``
-
-  const service_type & ``[link asio.reference.basic_socket_acceptor.get_service.overload2 get_service]``() const;
-  ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.get_service.overload2 more...]]``
-
-
-[section:overload1 basic_socket_acceptor::get_service (1 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the service associated with the I/O object. 
-
-
-  service_type & get_service();
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_socket_acceptor::get_service (2 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the service associated with the I/O object. 
-
-
-  const service_type & get_service() const;
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:implementation_type basic_socket_acceptor::implementation_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 implementation_type..basic_socket_acceptor] 
-The underlying implementation type of I/O object. 
-
-
-  typedef service_type::implementation_type implementation_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/basic_socket_acceptor.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
 [section:io_control basic_socket_acceptor::io_control]
 
 [indexterm2 io_control..basic_socket_acceptor] 
@@ -35062,7 +30979,7 @@
 The native representation of an acceptor. 
 
 
-  typedef SocketAcceptorService::native_handle_type native_handle_type;
+  typedef implementation_defined native_handle_type;
 
 
 
@@ -35456,10 +31373,9 @@
 
 
   template<
-      typename ``[link asio.reference.Protocol Protocol1]``,
-      typename ``[link asio.reference.SocketAcceptorService SocketAcceptorService1]``>
+      typename ``[link asio.reference.Protocol Protocol1]``>
   enable_if< is_convertible< Protocol1, Protocol >::value, basic_socket_acceptor >::type & ``[link asio.reference.basic_socket_acceptor.operator_eq_.overload2 operator=]``(
-      basic_socket_acceptor< Protocol1, SocketAcceptorService1 > && other);
+      basic_socket_acceptor< Protocol1 > && other);
   ``  [''''&raquo;''' [link asio.reference.basic_socket_acceptor.operator_eq_.overload2 more...]]``
 
 
@@ -35504,10 +31420,9 @@
 
 
   template<
-      typename ``[link asio.reference.Protocol Protocol1]``,
-      typename ``[link asio.reference.SocketAcceptorService SocketAcceptorService1]``>
+      typename ``[link asio.reference.Protocol Protocol1]``>
   enable_if< is_convertible< Protocol1, Protocol >::value, basic_socket_acceptor >::type & operator=(
-      basic_socket_acceptor< Protocol1, SocketAcceptorService1 > && other);
+      basic_socket_acceptor< Protocol1 > && other);
 
 
 This assignment operator moves an acceptor from one object to another.
@@ -35826,30 +31741,6 @@
 [endsect]
 
 
-
-[section:service_type basic_socket_acceptor::service_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 service_type..basic_socket_acceptor] 
-The type of the service that will be used to provide I/O operations. 
-
-
-  typedef SocketAcceptorService service_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/basic_socket_acceptor.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
 [section:set_option basic_socket_acceptor::set_option]
 
 [indexterm2 set_option..basic_socket_acceptor] 
@@ -36167,6 +32058,22 @@
 
 
 
+[section:_basic_socket_acceptor basic_socket_acceptor::~basic_socket_acceptor]
+
+[indexterm2 ~basic_socket_acceptor..basic_socket_acceptor] 
+Destroys the acceptor. 
+
+
+  ~basic_socket_acceptor();
+
+
+This function destroys the acceptor, cancelling any outstanding asynchronous operations associated with the acceptor as if by calling `cancel`. 
+
+
+[endsect]
+
+
+
 [endsect]
 
 [section:basic_socket_iostream basic_socket_iostream]
@@ -36177,10 +32084,8 @@
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.StreamSocketService StreamSocketService]`` = stream_socket_service<Protocol>,
       typename Time = boost::posix_time::ptime,
-      typename ``[link asio.reference.TimeTraits TimeTraits]`` = asio::time_traits<Time>,
-      typename ``[link asio.reference.TimerService TimerService]`` = deadline_timer_service<Time, TimeTraits>>
+      typename ``[link asio.reference.TimeTraits TimeTraits]`` = asio::time_traits<Time>>
   class basic_socket_iostream
 
 
@@ -36680,7 +32585,7 @@
 Return a pointer to the underlying streambuf. 
 
 
-  basic_socket_streambuf< Protocol, StreamSocketService, Time, TimeTraits, TimerService > * rdbuf() const;
+  basic_socket_streambuf< Protocol, Time, TimeTraits > * rdbuf() const;
 
 
 
@@ -36740,12 +32645,10 @@
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.StreamSocketService StreamSocketService]`` = stream_socket_service<Protocol>,
       typename Time = boost::posix_time::ptime,
-      typename ``[link asio.reference.TimeTraits TimeTraits]`` = asio::time_traits<Time>,
-      typename ``[link asio.reference.TimerService TimerService]`` = deadline_timer_service<Time, TimeTraits>>
+      typename ``[link asio.reference.TimeTraits TimeTraits]`` = asio::time_traits<Time>>
   class basic_socket_streambuf :
-    public basic_socket< Protocol, StreamSocketService >
+    public basic_socket< Protocol >
 
 
 [heading Types]
@@ -36817,13 +32720,6 @@
 
   [
 
-    [[link asio.reference.basic_socket_streambuf.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_socket_streambuf.keep_alive [*keep_alive]]]
     [Socket option to send keep-alives. ]
   
@@ -36901,13 +32797,6 @@
 
   [
 
-    [[link asio.reference.basic_socket_streambuf.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_socket_streambuf.shutdown_type [*shutdown_type]]]
     [Different ways a socket may be shutdown. ]
   
@@ -37003,9 +32892,7 @@
     [[link asio.reference.basic_socket_streambuf.expires_at [*expires_at]]]
     [(Deprecated: Use expiry().) Get the stream buffer's expiry time as an absolute time. 
 
-     Set the stream buffer's expiry time as an absolute time. 
-
-     Set the stream buffer's expiry time relative to now. ]
+     Set the stream buffer's expiry time as an absolute time. ]
   ]
   
   [
@@ -37128,16 +33015,6 @@
   ]
   
   [
-    [[link asio.reference.basic_socket_streambuf.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_socket_streambuf.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
-  ]
-  
-  [
     [[link asio.reference.basic_socket_streambuf.overflow [*overflow]]]
     []
   ]
@@ -37937,7 +33814,7 @@
 Close the connection. 
 
 
-  basic_socket_streambuf< Protocol, StreamSocketService, Time, TimeTraits, TimerService > * ``[link asio.reference.basic_socket_streambuf.close.overload1 close]``();
+  basic_socket_streambuf * ``[link asio.reference.basic_socket_streambuf.close.overload1 close]``();
   ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.close.overload1 more...]]``
 
 
@@ -37955,7 +33832,7 @@
 Close the connection. 
 
 
-  basic_socket_streambuf< Protocol, StreamSocketService, Time, TimeTraits, TimerService > * close();
+  basic_socket_streambuf * close();
 
 
 
@@ -38031,7 +33908,7 @@
 Establish a connection. 
 
 
-  basic_socket_streambuf< Protocol, StreamSocketService, Time, TimeTraits, TimerService > * ``[link asio.reference.basic_socket_streambuf.connect.overload1 connect]``(
+  basic_socket_streambuf * ``[link asio.reference.basic_socket_streambuf.connect.overload1 connect]``(
       const endpoint_type & endpoint);
   ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.connect.overload1 more...]]``
 
@@ -38039,7 +33916,7 @@
       typename T1,
       ... ,
       typename TN>
-  basic_socket_streambuf< Protocol, StreamSocketService > * ``[link asio.reference.basic_socket_streambuf.connect.overload2 connect]``(
+  basic_socket_streambuf * ``[link asio.reference.basic_socket_streambuf.connect.overload2 connect]``(
       T1 t1,
       ... ,
       TN tn);
@@ -38061,7 +33938,7 @@
 Establish a connection. 
 
 
-  basic_socket_streambuf< Protocol, StreamSocketService, Time, TimeTraits, TimerService > * connect(
+  basic_socket_streambuf * connect(
       const endpoint_type & endpoint);
 
 
@@ -38089,7 +33966,7 @@
       typename T1,
       ... ,
       typename TN>
-  basic_socket_streambuf< Protocol, StreamSocketService > * connect(
+  basic_socket_streambuf * connect(
       T1 t1,
       ... ,
       TN tn);
@@ -38415,13 +34292,13 @@
 [section:executor_type basic_socket_streambuf::executor_type]
 
 
-['Inherited from basic_io_object.]
+['Inherited from basic_socket.]
 
 [indexterm2 executor_type..basic_socket_streambuf] 
 The type of the executor associated with the object. 
 
 
-  typedef asio::io_context::executor_type executor_type;
+  typedef io_context::executor_type executor_type;
 
 
 [heading Member Functions]
@@ -38539,15 +34416,7 @@
   ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.expires_at.overload2 more...]]``
 
 
-Set the stream buffer's expiry time relative to now. 
-
-
-  void ``[link asio.reference.basic_socket_streambuf.expires_at.overload3 expires_at]``(
-      const duration & expiry_time);
-  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.expires_at.overload3 more...]]``
-
-
-[section:overload1 basic_socket_streambuf::expires_at (1 of 3 overloads)]
+[section:overload1 basic_socket_streambuf::expires_at (1 of 2 overloads)]
 
 
 (Deprecated: Use `expiry()`.) Get the stream buffer's expiry time as an absolute time. 
@@ -38568,7 +34437,7 @@
 
 
 
-[section:overload2 basic_socket_streambuf::expires_at (2 of 3 overloads)]
+[section:overload2 basic_socket_streambuf::expires_at (2 of 2 overloads)]
 
 
 Set the stream buffer's expiry time as an absolute time. 
@@ -38596,35 +34465,6 @@
 [endsect]
 
 
-
-[section:overload3 basic_socket_streambuf::expires_at (3 of 3 overloads)]
-
-
-Set the stream buffer's expiry time relative to now. 
-
-
-  void expires_at(
-      const duration & expiry_time);
-
-
-This function sets the expiry time associated with the stream. Stream operations performed after this time (where the operations cannot be completed using the internal buffers) will fail with the error `asio::error::operation_aborted`.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[expiry_time][The expiry time to be used for the timer. ]]
-
-]
-
-
-
-
-[endsect]
-
-
 [endsect]
 
 [section:expires_from_now basic_socket_streambuf::expires_from_now]
@@ -38721,7 +34561,7 @@
 [section:get_executor basic_socket_streambuf::get_executor]
 
 
-['Inherited from basic_io_object.]
+['Inherited from basic_socket.]
 
 [indexterm2 get_executor..basic_socket_streambuf] 
 Get the executor associated with the object. 
@@ -38734,59 +34574,11 @@
 [endsect]
 
 
-[section:get_implementation basic_socket_streambuf::get_implementation]
-
-[indexterm2 get_implementation..basic_socket_streambuf] 
-Get the underlying implementation of the I/O object. 
-
-
-  implementation_type & ``[link asio.reference.basic_socket_streambuf.get_implementation.overload1 get_implementation]``();
-  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.get_implementation.overload1 more...]]``
-
-  const implementation_type & ``[link asio.reference.basic_socket_streambuf.get_implementation.overload2 get_implementation]``() const;
-  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.get_implementation.overload2 more...]]``
-
-
-[section:overload1 basic_socket_streambuf::get_implementation (1 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the underlying implementation of the I/O object. 
-
-
-  implementation_type & get_implementation();
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_socket_streambuf::get_implementation (2 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the underlying implementation of the I/O object. 
-
-
-  const implementation_type & get_implementation() const;
-
-
-
-[endsect]
-
-
-[endsect]
-
 
 [section:get_io_context basic_socket_streambuf::get_io_context]
 
 
-['Inherited from basic_io_object.]
+['Inherited from basic_socket.]
 
 [indexterm2 get_io_context..basic_socket_streambuf] 
 (Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
@@ -38812,7 +34604,7 @@
 [section:get_io_service basic_socket_streambuf::get_io_service]
 
 
-['Inherited from basic_io_object.]
+['Inherited from basic_socket.]
 
 [indexterm2 get_io_service..basic_socket_streambuf] 
 (Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
@@ -38840,10 +34632,14 @@
 Get an option from the socket. 
 
 
+  template<
+      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
   void ``[link asio.reference.basic_socket_streambuf.get_option.overload1 get_option]``(
       GettableSocketOption & option) const;
   ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.get_option.overload1 more...]]``
 
+  template<
+      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
   asio::error_code ``[link asio.reference.basic_socket_streambuf.get_option.overload2 get_option]``(
       GettableSocketOption & option,
       asio::error_code & ec) const;
@@ -38967,88 +34763,20 @@
 
 [endsect]
 
-[section:get_service basic_socket_streambuf::get_service]
-
-[indexterm2 get_service..basic_socket_streambuf] 
-Get the service associated with the I/O object. 
-
-
-  service_type & ``[link asio.reference.basic_socket_streambuf.get_service.overload1 get_service]``();
-  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.get_service.overload1 more...]]``
-
-  const service_type & ``[link asio.reference.basic_socket_streambuf.get_service.overload2 get_service]``() const;
-  ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.get_service.overload2 more...]]``
-
-
-[section:overload1 basic_socket_streambuf::get_service (1 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the service associated with the I/O object. 
-
-
-  service_type & get_service();
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_socket_streambuf::get_service (2 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the service associated with the I/O object. 
-
-
-  const service_type & get_service() const;
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:implementation_type basic_socket_streambuf::implementation_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 implementation_type..basic_socket_streambuf] 
-The underlying implementation type of I/O object. 
-
-
-  typedef service_type::implementation_type implementation_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/basic_socket_streambuf.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
 [section:io_control basic_socket_streambuf::io_control]
 
 [indexterm2 io_control..basic_socket_streambuf] 
 Perform an IO control command on the socket. 
 
 
+  template<
+      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
   void ``[link asio.reference.basic_socket_streambuf.io_control.overload1 io_control]``(
       IoControlCommand & command);
   ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.io_control.overload1 more...]]``
 
+  template<
+      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
   asio::error_code ``[link asio.reference.basic_socket_streambuf.io_control.overload2 io_control]``(
       IoControlCommand & command,
       asio::error_code & ec);
@@ -39513,7 +35241,7 @@
 A [link asio.reference.basic_socket `basic_socket`] is always the lowest layer. 
 
 
-  typedef basic_socket< Protocol, StreamSocketService > lowest_layer_type;
+  typedef basic_socket< Protocol > lowest_layer_type;
 
 
 [heading Types]
@@ -39571,13 +35299,6 @@
 
   [
 
-    [[link asio.reference.basic_socket.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_socket.keep_alive [*keep_alive]]]
     [Socket option to send keep-alives. ]
   
@@ -39655,13 +35376,6 @@
 
   [
 
-    [[link asio.reference.basic_socket.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_socket.shutdown_type [*shutdown_type]]]
     [Different ways a socket may be shutdown. ]
   
@@ -39840,13 +35554,13 @@
   [[Name][Description]]
 
   [
-    [[link asio.reference.basic_socket.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
+    [[link asio.reference.basic_socket.basic_socket [*basic_socket]]]
+    []
   ]
   
   [
-    [[link asio.reference.basic_socket.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
+    [[link asio.reference.basic_socket.operator_eq_ [*operator=]]]
+    []
   ]
   
   [
@@ -40047,7 +35761,7 @@
 The native representation of a socket. 
 
 
-  typedef StreamSocketService::native_handle_type native_handle_type;
+  typedef implementation_defined native_handle_type;
 
 
 
@@ -41114,40 +36828,20 @@
 [endsect]
 
 
-
-[section:service_type basic_socket_streambuf::service_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 service_type..basic_socket_streambuf] 
-The type of the service that will be used to provide I/O operations. 
-
-
-  typedef StreamSocketService service_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/basic_socket_streambuf.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
 [section:set_option basic_socket_streambuf::set_option]
 
 [indexterm2 set_option..basic_socket_streambuf] 
 Set an option on the socket. 
 
 
+  template<
+      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
   void ``[link asio.reference.basic_socket_streambuf.set_option.overload1 set_option]``(
       const SettableSocketOption & option);
   ``  [''''&raquo;''' [link asio.reference.basic_socket_streambuf.set_option.overload1 more...]]``
 
+  template<
+      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
   asio::error_code ``[link asio.reference.basic_socket_streambuf.set_option.overload2 set_option]``(
       const SettableSocketOption & option,
       asio::error_code & ec);
@@ -41707,10 +37401,9 @@
 
 
   template<
-      typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.StreamSocketService StreamSocketService]`` = stream_socket_service<Protocol>>
+      typename ``[link asio.reference.Protocol Protocol]``>
   class basic_stream_socket :
-    public basic_socket< Protocol, StreamSocketService >
+    public basic_socket< Protocol >
 
 
 [heading Types]
@@ -41768,13 +37461,6 @@
 
   [
 
-    [[link asio.reference.basic_stream_socket.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_stream_socket.keep_alive [*keep_alive]]]
     [Socket option to send keep-alives. ]
   
@@ -41852,13 +37538,6 @@
 
   [
 
-    [[link asio.reference.basic_stream_socket.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_stream_socket.shutdown_type [*shutdown_type]]]
     [Different ways a socket may be shutdown. ]
   
@@ -42072,20 +37751,9 @@
     [Write some data to the socket. ]
   ]
   
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
   [
-    [[link asio.reference.basic_stream_socket.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_stream_socket.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
+    [[link asio.reference.basic_stream_socket._basic_stream_socket [*~basic_stream_socket]]]
+    [Destroys the socket. ]
   ]
   
 ]
@@ -42955,10 +38623,9 @@
 
 
   template<
-      typename ``[link asio.reference.Protocol Protocol1]``,
-      typename ``[link asio.reference.StreamSocketService StreamSocketService1]``>
+      typename ``[link asio.reference.Protocol Protocol1]``>
   ``[link asio.reference.basic_stream_socket.basic_stream_socket.overload6 basic_stream_socket]``(
-      basic_stream_socket< Protocol1, StreamSocketService1 > && other,
+      basic_stream_socket< Protocol1 > && other,
       typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);
   ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.basic_stream_socket.overload6 more...]]``
 
@@ -43162,10 +38829,9 @@
 
 
   template<
-      typename ``[link asio.reference.Protocol Protocol1]``,
-      typename ``[link asio.reference.StreamSocketService StreamSocketService1]``>
+      typename ``[link asio.reference.Protocol Protocol1]``>
   basic_stream_socket(
-      basic_stream_socket< Protocol1, StreamSocketService1 > && other,
+      basic_stream_socket< Protocol1 > && other,
       typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);
 
 
@@ -43953,13 +39619,13 @@
 [section:executor_type basic_stream_socket::executor_type]
 
 
-['Inherited from basic_io_object.]
+['Inherited from basic_socket.]
 
 [indexterm2 executor_type..basic_stream_socket] 
 The type of the executor associated with the object. 
 
 
-  typedef asio::io_context::executor_type executor_type;
+  typedef io_context::executor_type executor_type;
 
 
 [heading Member Functions]
@@ -44034,7 +39700,7 @@
 [section:get_executor basic_stream_socket::get_executor]
 
 
-['Inherited from basic_io_object.]
+['Inherited from basic_socket.]
 
 [indexterm2 get_executor..basic_stream_socket] 
 Get the executor associated with the object. 
@@ -44047,59 +39713,11 @@
 [endsect]
 
 
-[section:get_implementation basic_stream_socket::get_implementation]
-
-[indexterm2 get_implementation..basic_stream_socket] 
-Get the underlying implementation of the I/O object. 
-
-
-  implementation_type & ``[link asio.reference.basic_stream_socket.get_implementation.overload1 get_implementation]``();
-  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.get_implementation.overload1 more...]]``
-
-  const implementation_type & ``[link asio.reference.basic_stream_socket.get_implementation.overload2 get_implementation]``() const;
-  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.get_implementation.overload2 more...]]``
-
-
-[section:overload1 basic_stream_socket::get_implementation (1 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the underlying implementation of the I/O object. 
-
-
-  implementation_type & get_implementation();
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_stream_socket::get_implementation (2 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the underlying implementation of the I/O object. 
-
-
-  const implementation_type & get_implementation() const;
-
-
-
-[endsect]
-
-
-[endsect]
-
 
 [section:get_io_context basic_stream_socket::get_io_context]
 
 
-['Inherited from basic_io_object.]
+['Inherited from basic_socket.]
 
 [indexterm2 get_io_context..basic_stream_socket] 
 (Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
@@ -44125,7 +39743,7 @@
 [section:get_io_service basic_stream_socket::get_io_service]
 
 
-['Inherited from basic_io_object.]
+['Inherited from basic_socket.]
 
 [indexterm2 get_io_service..basic_stream_socket] 
 (Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
@@ -44153,10 +39771,14 @@
 Get an option from the socket. 
 
 
+  template<
+      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
   void ``[link asio.reference.basic_stream_socket.get_option.overload1 get_option]``(
       GettableSocketOption & option) const;
   ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.get_option.overload1 more...]]``
 
+  template<
+      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
   asio::error_code ``[link asio.reference.basic_stream_socket.get_option.overload2 get_option]``(
       GettableSocketOption & option,
       asio::error_code & ec) const;
@@ -44280,88 +39902,20 @@
 
 [endsect]
 
-[section:get_service basic_stream_socket::get_service]
-
-[indexterm2 get_service..basic_stream_socket] 
-Get the service associated with the I/O object. 
-
-
-  service_type & ``[link asio.reference.basic_stream_socket.get_service.overload1 get_service]``();
-  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.get_service.overload1 more...]]``
-
-  const service_type & ``[link asio.reference.basic_stream_socket.get_service.overload2 get_service]``() const;
-  ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.get_service.overload2 more...]]``
-
-
-[section:overload1 basic_stream_socket::get_service (1 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the service associated with the I/O object. 
-
-
-  service_type & get_service();
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_stream_socket::get_service (2 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the service associated with the I/O object. 
-
-
-  const service_type & get_service() const;
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:implementation_type basic_stream_socket::implementation_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 implementation_type..basic_stream_socket] 
-The underlying implementation type of I/O object. 
-
-
-  typedef service_type::implementation_type implementation_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/basic_stream_socket.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
 [section:io_control basic_stream_socket::io_control]
 
 [indexterm2 io_control..basic_stream_socket] 
 Perform an IO control command on the socket. 
 
 
+  template<
+      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
   void ``[link asio.reference.basic_stream_socket.io_control.overload1 io_control]``(
       IoControlCommand & command);
   ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.io_control.overload1 more...]]``
 
+  template<
+      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
   asio::error_code ``[link asio.reference.basic_stream_socket.io_control.overload2 io_control]``(
       IoControlCommand & command,
       asio::error_code & ec);
@@ -44808,7 +40362,7 @@
 A [link asio.reference.basic_socket `basic_socket`] is always the lowest layer. 
 
 
-  typedef basic_socket< Protocol, StreamSocketService > lowest_layer_type;
+  typedef basic_socket< Protocol > lowest_layer_type;
 
 
 [heading Types]
@@ -44866,13 +40420,6 @@
 
   [
 
-    [[link asio.reference.basic_socket.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_socket.keep_alive [*keep_alive]]]
     [Socket option to send keep-alives. ]
   
@@ -44950,13 +40497,6 @@
 
   [
 
-    [[link asio.reference.basic_socket.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_socket.shutdown_type [*shutdown_type]]]
     [Different ways a socket may be shutdown. ]
   
@@ -45135,13 +40675,13 @@
   [[Name][Description]]
 
   [
-    [[link asio.reference.basic_socket.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
+    [[link asio.reference.basic_socket.basic_socket [*basic_socket]]]
+    []
   ]
   
   [
-    [[link asio.reference.basic_socket.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
+    [[link asio.reference.basic_socket.operator_eq_ [*operator=]]]
+    []
   ]
   
   [
@@ -45339,7 +40879,7 @@
 The native representation of a socket. 
 
 
-  typedef StreamSocketService::native_handle_type native_handle_type;
+  typedef implementation_defined native_handle_type;
 
 
 
@@ -45976,10 +41516,9 @@
 
 
   template<
-      typename ``[link asio.reference.Protocol Protocol1]``,
-      typename ``[link asio.reference.StreamSocketService StreamSocketService1]``>
+      typename ``[link asio.reference.Protocol Protocol1]``>
   enable_if< is_convertible< Protocol1, Protocol >::value, basic_stream_socket >::type & ``[link asio.reference.basic_stream_socket.operator_eq_.overload2 operator=]``(
-      basic_stream_socket< Protocol1, StreamSocketService1 > && other);
+      basic_stream_socket< Protocol1 > && other);
   ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.operator_eq_.overload2 more...]]``
 
 
@@ -46024,10 +41563,9 @@
 
 
   template<
-      typename ``[link asio.reference.Protocol Protocol1]``,
-      typename ``[link asio.reference.StreamSocketService StreamSocketService1]``>
+      typename ``[link asio.reference.Protocol Protocol1]``>
   enable_if< is_convertible< Protocol1, Protocol >::value, basic_stream_socket >::type & operator=(
-      basic_stream_socket< Protocol1, StreamSocketService1 > && other);
+      basic_stream_socket< Protocol1 > && other);
 
 
 This assignment operator moves a stream socket from one object to another.
@@ -46995,40 +42533,20 @@
 [endsect]
 
 
-
-[section:service_type basic_stream_socket::service_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 service_type..basic_stream_socket] 
-The type of the service that will be used to provide I/O operations. 
-
-
-  typedef StreamSocketService service_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/basic_stream_socket.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
 [section:set_option basic_stream_socket::set_option]
 
 [indexterm2 set_option..basic_stream_socket] 
 Set an option on the socket. 
 
 
+  template<
+      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
   void ``[link asio.reference.basic_stream_socket.set_option.overload1 set_option]``(
       const SettableSocketOption & option);
   ``  [''''&raquo;''' [link asio.reference.basic_stream_socket.set_option.overload1 more...]]``
 
+  template<
+      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
   asio::error_code ``[link asio.reference.basic_stream_socket.set_option.overload2 set_option]``(
       const SettableSocketOption & option,
       asio::error_code & ec);
@@ -47593,6 +43111,22 @@
 [endsect]
 
 
+[section:_basic_stream_socket basic_stream_socket::~basic_stream_socket]
+
+[indexterm2 ~basic_stream_socket..basic_stream_socket] 
+Destroys the socket. 
+
+
+  ~basic_stream_socket();
+
+
+This function destroys the socket, cancelling any outstanding asynchronous operations associated with the socket as if by calling `cancel`. 
+
+
+[endsect]
+
+
+
 [endsect]
 
 [section:basic_streambuf basic_streambuf]
@@ -48026,7 +43560,7 @@
    while (i != bufs.end())
    {
      const_buffer buf(*i++);
-     s += buffer_size(buf);
+     s += buf.size();
    }
 
 
@@ -48661,10 +44195,8 @@
 
   template<
       typename Clock,
-      typename ``[link asio.reference.WaitTraits WaitTraits]`` = asio::wait_traits<Clock>,
-      typename ``[link asio.reference.WaitableTimerService WaitableTimerService]`` = waitable_timer_service<Clock, WaitTraits>>
-  class basic_waitable_timer :
-    public basic_io_object< WaitableTimerService >
+      typename ``[link asio.reference.WaitTraits WaitTraits]`` = asio::wait_traits<Clock>>
+  class basic_waitable_timer
 
 
 [heading Types]
@@ -48694,20 +44226,6 @@
 
   [
 
-    [[link asio.reference.basic_waitable_timer.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.basic_waitable_timer.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_waitable_timer.time_point [*time_point]]]
     [The time point type of the clock. ]
   
@@ -48744,12 +44262,16 @@
   
   [
     [[link asio.reference.basic_waitable_timer.cancel [*cancel]]]
-    [Cancel any asynchronous operations that are waiting on the timer. ]
+    [Cancel any asynchronous operations that are waiting on the timer. 
+
+     (Deprecated: Use non-error_code overload.) Cancel any asynchronous operations that are waiting on the timer. ]
   ]
   
   [
     [[link asio.reference.basic_waitable_timer.cancel_one [*cancel_one]]]
-    [Cancels one asynchronous operation that is waiting on the timer. ]
+    [Cancels one asynchronous operation that is waiting on the timer. 
+
+     (Deprecated: Use non-error_code overload.) Cancels one asynchronous operation that is waiting on the timer. ]
   ]
   
   [
@@ -48761,7 +44283,9 @@
     [[link asio.reference.basic_waitable_timer.expires_at [*expires_at]]]
     [(Deprecated: Use expiry().) Get the timer's expiry time as an absolute time. 
 
-     Set the timer's expiry time as an absolute time. ]
+     Set the timer's expiry time as an absolute time. 
+
+     (Deprecated: Use non-error_code overload.) Set the timer's expiry time as an absolute time. ]
   ]
   
   [
@@ -48801,20 +44325,9 @@
     [Perform a blocking wait on the timer. ]
   ]
   
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
   [
-    [[link asio.reference.basic_waitable_timer.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_waitable_timer.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
+    [[link asio.reference.basic_waitable_timer._basic_waitable_timer [*~basic_waitable_timer]]]
+    [Destroys the timer. ]
   ]
   
 ]
@@ -49143,6 +44656,10 @@
   std::size_t ``[link asio.reference.basic_waitable_timer.cancel.overload1 cancel]``();
   ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.cancel.overload1 more...]]``
 
+
+(Deprecated: Use non-error\_code overload.) Cancel any asynchronous operations that are waiting on the timer. 
+
+
   std::size_t ``[link asio.reference.basic_waitable_timer.cancel.overload2 cancel]``(
       asio::error_code & ec);
   ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.cancel.overload2 more...]]``
@@ -49197,7 +44714,7 @@
 [section:overload2 basic_waitable_timer::cancel (2 of 2 overloads)]
 
 
-Cancel any asynchronous operations that are waiting on the timer. 
+(Deprecated: Use non-error\_code overload.) Cancel any asynchronous operations that are waiting on the timer. 
 
 
   std::size_t cancel(
@@ -49251,6 +44768,10 @@
   std::size_t ``[link asio.reference.basic_waitable_timer.cancel_one.overload1 cancel_one]``();
   ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.cancel_one.overload1 more...]]``
 
+
+(Deprecated: Use non-error\_code overload.) Cancels one asynchronous operation that is waiting on the timer. 
+
+
   std::size_t ``[link asio.reference.basic_waitable_timer.cancel_one.overload2 cancel_one]``(
       asio::error_code & ec);
   ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.cancel_one.overload2 more...]]``
@@ -49305,7 +44826,7 @@
 [section:overload2 basic_waitable_timer::cancel_one (2 of 2 overloads)]
 
 
-Cancels one asynchronous operation that is waiting on the timer. 
+(Deprecated: Use non-error\_code overload.) Cancels one asynchronous operation that is waiting on the timer. 
 
 
   std::size_t cancel_one(
@@ -49395,14 +44916,11 @@
 
 [section:executor_type basic_waitable_timer::executor_type]
 
-
-['Inherited from basic_io_object.]
-
 [indexterm2 executor_type..basic_waitable_timer] 
 The type of the executor associated with the object. 
 
 
-  typedef asio::io_context::executor_type executor_type;
+  typedef io_context::executor_type executor_type;
 
 
 [heading Member Functions]
@@ -49473,28 +44991,13 @@
 [endsect]
 
 
+
 [section:expires_after basic_waitable_timer::expires_after]
 
 [indexterm2 expires_after..basic_waitable_timer] 
 Set the timer's expiry time relative to now. 
 
 
-  std::size_t ``[link asio.reference.basic_waitable_timer.expires_after.overload1 expires_after]``(
-      const duration & expiry_time);
-  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.expires_after.overload1 more...]]``
-
-  std::size_t ``[link asio.reference.basic_waitable_timer.expires_after.overload2 expires_after]``(
-      const duration & expiry_time,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.expires_after.overload2 more...]]``
-
-
-[section:overload1 basic_waitable_timer::expires_after (1 of 2 overloads)]
-
-
-Set the timer's expiry time relative to now. 
-
-
   std::size_t expires_after(
       const duration & expiry_time);
 
@@ -49543,56 +45046,6 @@
 [endsect]
 
 
-
-[section:overload2 basic_waitable_timer::expires_after (2 of 2 overloads)]
-
-
-Set the timer's expiry time relative to now. 
-
-
-  std::size_t expires_after(
-      const duration & expiry_time,
-      asio::error_code & ec);
-
-
-This function sets the expiry time. Any pending asynchronous wait operations will be cancelled. The handler for each cancelled operation will be invoked with the `asio::error::operation_aborted` error code.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[expiry_time][The expiry time to be used for the timer.]]
-
-[[ec][Set to indicate what error occurred, if any.]]
-
-]
-
-
-[heading Return Value]
-      
-The number of asynchronous operations that were cancelled.
-
-
-[heading Remarks]
-      
-If the timer has already expired when `expires_after()` is called, then the handlers for asynchronous wait operations will:
-
-
-* have already been invoked; or
-
-
-* have been queued for invocation in the near future.
-
-These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation. 
-
-
-[endsect]
-
-
-[endsect]
-
 [section:expires_at basic_waitable_timer::expires_at]
 
 [indexterm2 expires_at..basic_waitable_timer] 
@@ -49610,6 +45063,10 @@
       const time_point & expiry_time);
   ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.expires_at.overload2 more...]]``
 
+
+(Deprecated: Use non-error\_code overload.) Set the timer's expiry time as an absolute time. 
+
+
   std::size_t ``[link asio.reference.basic_waitable_timer.expires_at.overload3 expires_at]``(
       const time_point & expiry_time,
       asio::error_code & ec);
@@ -49690,7 +45147,7 @@
 [section:overload3 basic_waitable_timer::expires_at (3 of 3 overloads)]
 
 
-Set the timer's expiry time as an absolute time. 
+(Deprecated: Use non-error\_code overload.) Set the timer's expiry time as an absolute time. 
 
 
   std::size_t expires_at(
@@ -49898,9 +45355,6 @@
 
 [section:get_executor basic_waitable_timer::get_executor]
 
-
-['Inherited from basic_io_object.]
-
 [indexterm2 get_executor..basic_waitable_timer] 
 Get the executor associated with the object. 
 
@@ -49912,60 +45366,9 @@
 [endsect]
 
 
-[section:get_implementation basic_waitable_timer::get_implementation]
-
-[indexterm2 get_implementation..basic_waitable_timer] 
-Get the underlying implementation of the I/O object. 
-
-
-  implementation_type & ``[link asio.reference.basic_waitable_timer.get_implementation.overload1 get_implementation]``();
-  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.get_implementation.overload1 more...]]``
-
-  const implementation_type & ``[link asio.reference.basic_waitable_timer.get_implementation.overload2 get_implementation]``() const;
-  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.get_implementation.overload2 more...]]``
-
-
-[section:overload1 basic_waitable_timer::get_implementation (1 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the underlying implementation of the I/O object. 
-
-
-  implementation_type & get_implementation();
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_waitable_timer::get_implementation (2 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the underlying implementation of the I/O object. 
-
-
-  const implementation_type & get_implementation() const;
-
-
-
-[endsect]
-
-
-[endsect]
-
 
 [section:get_io_context basic_waitable_timer::get_io_context]
 
-
-['Inherited from basic_io_object.]
-
 [indexterm2 get_io_context..basic_waitable_timer] 
 (Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
 
@@ -49989,9 +45392,6 @@
 
 [section:get_io_service basic_waitable_timer::get_io_service]
 
-
-['Inherited from basic_io_object.]
-
 [indexterm2 get_io_service..basic_waitable_timer] 
 (Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
 
@@ -50012,78 +45412,6 @@
 [endsect]
 
 
-[section:get_service basic_waitable_timer::get_service]
-
-[indexterm2 get_service..basic_waitable_timer] 
-Get the service associated with the I/O object. 
-
-
-  service_type & ``[link asio.reference.basic_waitable_timer.get_service.overload1 get_service]``();
-  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.get_service.overload1 more...]]``
-
-  const service_type & ``[link asio.reference.basic_waitable_timer.get_service.overload2 get_service]``() const;
-  ``  [''''&raquo;''' [link asio.reference.basic_waitable_timer.get_service.overload2 more...]]``
-
-
-[section:overload1 basic_waitable_timer::get_service (1 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the service associated with the I/O object. 
-
-
-  service_type & get_service();
-
-
-
-[endsect]
-
-
-
-[section:overload2 basic_waitable_timer::get_service (2 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the service associated with the I/O object. 
-
-
-  const service_type & get_service() const;
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:implementation_type basic_waitable_timer::implementation_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 implementation_type..basic_waitable_timer] 
-The underlying implementation type of I/O object. 
-
-
-  typedef service_type::implementation_type implementation_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/basic_waitable_timer.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
 
 [section:operator_eq_ basic_waitable_timer::operator=]
 
@@ -50095,7 +45423,7 @@
       basic_waitable_timer && other);
 
 
-This assignment operator moves a timer from one object to another.
+This assignment operator moves a timer from one object to another. Cancels any outstanding asynchronous operations associated with the target object.
 
 
 [heading Parameters]
@@ -50119,30 +45447,6 @@
 
 
 
-[section:service_type basic_waitable_timer::service_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 service_type..basic_waitable_timer] 
-The type of the service that will be used to provide I/O operations. 
-
-
-  typedef WaitableTimerService service_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/basic_waitable_timer.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
 [section:time_point basic_waitable_timer::time_point]
 
 [indexterm2 time_point..basic_waitable_timer] 
@@ -50257,6 +45561,22 @@
 [endsect]
 
 
+[section:_basic_waitable_timer basic_waitable_timer::~basic_waitable_timer]
+
+[indexterm2 ~basic_waitable_timer..basic_waitable_timer] 
+Destroys the timer. 
+
+
+  ~basic_waitable_timer();
+
+
+This function destroys the timer, cancelling any outstanding asynchronous wait operations associated with the timer as if by calling `cancel`. 
+
+
+[endsect]
+
+
+
 [endsect]
 
 [section:basic_yield_context basic_yield_context]
@@ -50825,24 +46145,24 @@
   
 
 
-The contents of a buffer may be accessed using the [link asio.reference.buffer_size `buffer_size`]  and [link asio.reference.buffer_cast `buffer_cast`]  functions:
+The contents of a buffer may be accessed using the `data()` and `size()` member functions:
 
 
 
    asio::mutable_buffer b1 = ...;
-   std::size_t s1 = asio::buffer_size(b1);
-   unsigned char* p1 = asio::buffer_cast<unsigned char*>(b1);
+   std::size_t s1 = b1.size();
+   unsigned char* p1 = static_cast<unsigned char*>(b1.data());
 
    asio::const_buffer b2 = ...;
-   std::size_t s2 = asio::buffer_size(b2);
-   const void* p2 = asio::buffer_cast<const void*>(b2); 
+   std::size_t s2 = b2.size();
+   const void* p2 = b2.data(); 
 
 
 
 
-The `asio::buffer_cast` function permits violations of type safety, so uses of it in application code should be carefully considered.
+The `data()` member function permits violations of type safety, so uses of it in application code should be carefully considered.
 
-For convenience, the [link asio.reference.buffer_size `buffer_size`]  function also works on buffer sequences (that is, types meeting the ConstBufferSequence or MutableBufferSequence type requirements). In this case, the function returns the total size of all buffers in the sequence.
+For convenience, a [link asio.reference.buffer_size `buffer_size`]  function is provided that works with both buffers and buffer sequences (that is, types meeting the ConstBufferSequence or MutableBufferSequence type requirements). In this case, the function returns the total size of all buffers in the sequence.
 
 
 [heading Buffer Copying]
@@ -51006,8 +46326,8 @@
 A [link asio.reference.mutable_buffers_1 `mutable_buffers_1`] value equivalent to: 
 
    mutable_buffers_1(
-       buffer_cast<void*>(b),
-       min(buffer_size(b), max_size_in_bytes)); 
+       b.data(),
+       min(b.size(), max_size_in_bytes)); 
 
 
 
@@ -51058,8 +46378,8 @@
 A [link asio.reference.const_buffers_1 `const_buffers_1`] value equivalent to: 
 
    const_buffers_1(
-       buffer_cast<const void*>(b),
-       min(buffer_size(b), max_size_in_bytes)); 
+       b.data(),
+       min(b.size(), max_size_in_bytes)); 
 
 
 
@@ -51931,7 +47251,7 @@
 [section:buffer_cast buffer_cast]
 
 [indexterm1 buffer_cast] 
-The `asio::buffer_cast` function is used to obtain a pointer to the underlying memory region associated with a buffer. 
+(Deprecated: Use the `data()` member function.) The `asio::buffer_cast` function is used to obtain a pointer to the underlying memory region associated with a buffer. 
 
       
   template<
@@ -53906,6 +49226,13 @@
 
   [
 
+    [[link asio.reference.buffered_read_stream.executor_type [*executor_type]]]
+    [The type of the executor associated with the object. ]
+  
+  ]
+
+  [
+
     [[link asio.reference.buffered_read_stream.lowest_layer_type [*lowest_layer_type]]]
     [The type of the lowest layer. ]
   
@@ -53957,13 +49284,18 @@
   ]
   
   [
+    [[link asio.reference.buffered_read_stream.get_executor [*get_executor]]]
+    [Get the executor associated with the object. ]
+  ]
+  
+  [
     [[link asio.reference.buffered_read_stream.get_io_context [*get_io_context]]]
-    [Get the io_context associated with the object. ]
+    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
   ]
   
   [
     [[link asio.reference.buffered_read_stream.get_io_service [*get_io_service]]]
-    [(Deprecated: Use get_io_context().) Get the io_context associated with the object. ]
+    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
   ]
   
   [
@@ -54204,6 +49536,27 @@
 [endsect]
 
 
+
+[section:executor_type buffered_read_stream::executor_type]
+
+[indexterm2 executor_type..buffered_read_stream] 
+The type of the executor associated with the object. 
+
+
+  typedef lowest_layer_type::executor_type executor_type;
+
+
+
+[heading Requirements]
+
+['Header: ][^asio/buffered_read_stream.hpp]
+
+['Convenience header: ][^asio.hpp]
+
+
+[endsect]
+
+
 [section:fill buffered_read_stream::fill]
 
 [indexterm2 fill..buffered_read_stream] 
@@ -54253,10 +49606,24 @@
 [endsect]
 
 
+[section:get_executor buffered_read_stream::get_executor]
+
+[indexterm2 get_executor..buffered_read_stream] 
+Get the executor associated with the object. 
+
+
+  executor_type get_executor();
+
+
+
+[endsect]
+
+
+
 [section:get_io_context buffered_read_stream::get_io_context]
 
 [indexterm2 get_io_context..buffered_read_stream] 
-Get the [link asio.reference.io_context `io_context`] associated with the object. 
+(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
 
 
   asio::io_context & get_io_context();
@@ -54270,7 +49637,7 @@
 [section:get_io_service buffered_read_stream::get_io_service]
 
 [indexterm2 get_io_service..buffered_read_stream] 
-(Deprecated: Use `get_io_context()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
+(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
 
 
   asio::io_context & get_io_service();
@@ -54627,6 +49994,13 @@
 
   [
 
+    [[link asio.reference.buffered_stream.executor_type [*executor_type]]]
+    [The type of the executor associated with the object. ]
+  
+  ]
+
+  [
+
     [[link asio.reference.buffered_stream.lowest_layer_type [*lowest_layer_type]]]
     [The type of the lowest layer. ]
   
@@ -54690,13 +50064,18 @@
   ]
   
   [
+    [[link asio.reference.buffered_stream.get_executor [*get_executor]]]
+    [Get the executor associated with the object. ]
+  ]
+  
+  [
     [[link asio.reference.buffered_stream.get_io_context [*get_io_context]]]
-    [Get the io_context associated with the object. ]
+    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
   ]
   
   [
     [[link asio.reference.buffered_stream.get_io_service [*get_io_service]]]
-    [(Deprecated: Use get_io_context().) Get the io_context associated with the object. ]
+    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
   ]
   
   [
@@ -54931,6 +50310,27 @@
 
 [endsect]
 
+
+[section:executor_type buffered_stream::executor_type]
+
+[indexterm2 executor_type..buffered_stream] 
+The type of the executor associated with the object. 
+
+
+  typedef lowest_layer_type::executor_type executor_type;
+
+
+
+[heading Requirements]
+
+['Header: ][^asio/buffered_stream.hpp]
+
+['Convenience header: ][^asio.hpp]
+
+
+[endsect]
+
+
 [section:fill buffered_stream::fill]
 
 [indexterm2 fill..buffered_stream] 
@@ -55028,10 +50428,24 @@
 [endsect]
 
 
+[section:get_executor buffered_stream::get_executor]
+
+[indexterm2 get_executor..buffered_stream] 
+Get the executor associated with the object. 
+
+
+  executor_type get_executor();
+
+
+
+[endsect]
+
+
+
 [section:get_io_context buffered_stream::get_io_context]
 
 [indexterm2 get_io_context..buffered_stream] 
-Get the [link asio.reference.io_context `io_context`] associated with the object. 
+(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
 
 
   asio::io_context & get_io_context();
@@ -55045,7 +50459,7 @@
 [section:get_io_service buffered_stream::get_io_service]
 
 [indexterm2 get_io_service..buffered_stream] 
-(Deprecated: Use `get_io_context()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
+(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
 
 
   asio::io_context & get_io_service();
@@ -55402,6 +50816,13 @@
 
   [
 
+    [[link asio.reference.buffered_write_stream.executor_type [*executor_type]]]
+    [The type of the executor associated with the object. ]
+  
+  ]
+
+  [
+
     [[link asio.reference.buffered_write_stream.lowest_layer_type [*lowest_layer_type]]]
     [The type of the lowest layer. ]
   
@@ -55453,13 +50874,18 @@
   ]
   
   [
+    [[link asio.reference.buffered_write_stream.get_executor [*get_executor]]]
+    [Get the executor associated with the object. ]
+  ]
+  
+  [
     [[link asio.reference.buffered_write_stream.get_io_context [*get_io_context]]]
-    [Get the io_context associated with the object. ]
+    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
   ]
   
   [
     [[link asio.reference.buffered_write_stream.get_io_service [*get_io_service]]]
-    [(Deprecated: Use get_io_context().) Get the io_context associated with the object. ]
+    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
   ]
   
   [
@@ -55700,6 +51126,27 @@
 [endsect]
 
 
+
+[section:executor_type buffered_write_stream::executor_type]
+
+[indexterm2 executor_type..buffered_write_stream] 
+The type of the executor associated with the object. 
+
+
+  typedef lowest_layer_type::executor_type executor_type;
+
+
+
+[heading Requirements]
+
+['Header: ][^asio/buffered_write_stream.hpp]
+
+['Convenience header: ][^asio.hpp]
+
+
+[endsect]
+
+
 [section:flush buffered_write_stream::flush]
 
 [indexterm2 flush..buffered_write_stream] 
@@ -55749,10 +51196,24 @@
 [endsect]
 
 
+[section:get_executor buffered_write_stream::get_executor]
+
+[indexterm2 get_executor..buffered_write_stream] 
+Get the executor associated with the object. 
+
+
+  executor_type get_executor();
+
+
+
+[endsect]
+
+
+
 [section:get_io_context buffered_write_stream::get_io_context]
 
 [indexterm2 get_io_context..buffered_write_stream] 
-Get the [link asio.reference.io_context `io_context`] associated with the object. 
+(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
 
 
   asio::io_context & get_io_context();
@@ -55766,7 +51227,7 @@
 [section:get_io_service buffered_write_stream::get_io_service]
 
 [indexterm2 get_io_service..buffered_write_stream] 
-(Deprecated: Use `get_io_context()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
+(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
 
 
   asio::io_context & get_io_service();
@@ -56905,20 +52366,18 @@
       
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename ``[link asio.reference.EndpointSequence EndpointSequence]``>
   Protocol::endpoint ``[link asio.reference.connect.overload1 connect]``(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       const EndpointSequence & endpoints,
       typename enable_if< is_endpoint_sequence< EndpointSequence >::value >::type *  = 0);
   ``  [''''&raquo;''' [link asio.reference.connect.overload1 more...]]``
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename ``[link asio.reference.EndpointSequence EndpointSequence]``>
   Protocol::endpoint ``[link asio.reference.connect.overload2 connect]``(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       const EndpointSequence & endpoints,
       asio::error_code & ec,
       typename enable_if< is_endpoint_sequence< EndpointSequence >::value >::type *  = 0);
@@ -56926,20 +52385,18 @@
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename Iterator>
   Iterator ``[link asio.reference.connect.overload3 connect]``(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       Iterator begin,
       typename enable_if<!is_endpoint_sequence< Iterator >::value >::type *  = 0);
   ``  [''''&raquo;''' [link asio.reference.connect.overload3 more...]]``
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename Iterator>
   Iterator ``[link asio.reference.connect.overload4 connect]``(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       Iterator begin,
       asio::error_code & ec,
       typename enable_if<!is_endpoint_sequence< Iterator >::value >::type *  = 0);
@@ -56947,20 +52404,18 @@
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename Iterator>
   Iterator ``[link asio.reference.connect.overload5 connect]``(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       Iterator begin,
       Iterator end);
   ``  [''''&raquo;''' [link asio.reference.connect.overload5 more...]]``
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename Iterator>
   Iterator ``[link asio.reference.connect.overload6 connect]``(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       Iterator begin,
       Iterator end,
       asio::error_code & ec);
@@ -56968,11 +52423,10 @@
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename ``[link asio.reference.EndpointSequence EndpointSequence]``,
       typename ConnectCondition>
   Protocol::endpoint ``[link asio.reference.connect.overload7 connect]``(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       const EndpointSequence & endpoints,
       ConnectCondition connect_condition,
       typename enable_if< is_endpoint_sequence< EndpointSequence >::value >::type *  = 0);
@@ -56980,11 +52434,10 @@
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename ``[link asio.reference.EndpointSequence EndpointSequence]``,
       typename ConnectCondition>
   Protocol::endpoint ``[link asio.reference.connect.overload8 connect]``(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       const EndpointSequence & endpoints,
       ConnectCondition connect_condition,
       asio::error_code & ec,
@@ -56993,11 +52446,10 @@
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename Iterator,
       typename ConnectCondition>
   Iterator ``[link asio.reference.connect.overload9 connect]``(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       Iterator begin,
       ConnectCondition connect_condition,
       typename enable_if<!is_endpoint_sequence< Iterator >::value >::type *  = 0);
@@ -57005,11 +52457,10 @@
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename Iterator,
       typename ConnectCondition>
   Iterator ``[link asio.reference.connect.overload10 connect]``(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       Iterator begin,
       ConnectCondition connect_condition,
       asio::error_code & ec,
@@ -57018,11 +52469,10 @@
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename Iterator,
       typename ConnectCondition>
   Iterator ``[link asio.reference.connect.overload11 connect]``(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       Iterator begin,
       Iterator end,
       ConnectCondition connect_condition);
@@ -57030,11 +52480,10 @@
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename Iterator,
       typename ConnectCondition>
   Iterator ``[link asio.reference.connect.overload12 connect]``(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       Iterator begin,
       Iterator end,
       ConnectCondition connect_condition,
@@ -57056,10 +52505,9 @@
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename ``[link asio.reference.EndpointSequence EndpointSequence]``>
   Protocol::endpoint connect(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       const EndpointSequence & endpoints,
       typename enable_if< is_endpoint_sequence< EndpointSequence >::value >::type *  = 0);
 
@@ -57121,10 +52569,9 @@
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename ``[link asio.reference.EndpointSequence EndpointSequence]``>
   Protocol::endpoint connect(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       const EndpointSequence & endpoints,
       asio::error_code & ec,
       typename enable_if< is_endpoint_sequence< EndpointSequence >::value >::type *  = 0);
@@ -57184,10 +52631,9 @@
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename Iterator>
   Iterator connect(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       Iterator begin,
       typename enable_if<!is_endpoint_sequence< Iterator >::value >::type *  = 0);
 
@@ -57241,10 +52687,9 @@
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename Iterator>
   Iterator connect(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       Iterator begin,
       asio::error_code & ec,
       typename enable_if<!is_endpoint_sequence< Iterator >::value >::type *  = 0);
@@ -57291,10 +52736,9 @@
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename Iterator>
   Iterator connect(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       Iterator begin,
       Iterator end);
 
@@ -57359,10 +52803,9 @@
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename Iterator>
   Iterator connect(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       Iterator begin,
       Iterator end,
       asio::error_code & ec);
@@ -57425,11 +52868,10 @@
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename ``[link asio.reference.EndpointSequence EndpointSequence]``,
       typename ConnectCondition>
   Protocol::endpoint connect(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       const EndpointSequence & endpoints,
       ConnectCondition connect_condition,
       typename enable_if< is_endpoint_sequence< EndpointSequence >::value >::type *  = 0);
@@ -57517,11 +52959,10 @@
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename ``[link asio.reference.EndpointSequence EndpointSequence]``,
       typename ConnectCondition>
   Protocol::endpoint connect(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       const EndpointSequence & endpoints,
       ConnectCondition connect_condition,
       asio::error_code & ec,
@@ -57610,11 +53051,10 @@
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename Iterator,
       typename ConnectCondition>
   Iterator connect(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       Iterator begin,
       ConnectCondition connect_condition,
       typename enable_if<!is_endpoint_sequence< Iterator >::value >::type *  = 0);
@@ -57677,11 +53117,10 @@
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename Iterator,
       typename ConnectCondition>
   Iterator connect(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       Iterator begin,
       ConnectCondition connect_condition,
       asio::error_code & ec,
@@ -57737,11 +53176,10 @@
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename Iterator,
       typename ConnectCondition>
   Iterator connect(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       Iterator begin,
       Iterator end,
       ConnectCondition connect_condition);
@@ -57832,11 +53270,10 @@
 
   template<
       typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
       typename Iterator,
       typename ConnectCondition>
   Iterator connect(
-      basic_socket< Protocol, SocketService > & s,
+      basic_socket< Protocol > & s,
       Iterator begin,
       Iterator end,
       ConnectCondition connect_condition,
@@ -57943,6 +53380,16 @@
      Construct a non-modifiable buffer from a modifiable one. ]
   ]
   
+  [
+    [[link asio.reference.const_buffer.data [*data]]]
+    [Get a pointer to the beginning of the memory range. ]
+  ]
+  
+  [
+    [[link asio.reference.const_buffer.size [*size]]]
+    [Get the size of the memory range. ]
+  ]
+  
 ]
 
 [heading Related Functions]
@@ -57963,18 +53410,18 @@
   
 
 
-The contents of a buffer may be accessed using the [link asio.reference.buffer_size `buffer_size`]  and [link asio.reference.buffer_cast `buffer_cast`]  functions:
+The contents of a buffer may be accessed using the `data()` and `size()` member functions:
 
 
 
    asio::const_buffer b1 = ...;
-   std::size_t s1 = asio::buffer_size(b1);
-   const unsigned char* p1 = asio::buffer_cast<const unsigned char*>(b1);
+   std::size_t s1 = b1.size();
+   const unsigned char* p1 = static_cast<const unsigned char*>(b1.data());
 
 
 
 
-The `asio::buffer_cast` function permits violations of type safety, so uses of it in application code should be carefully considered. 
+The `data()` member function permits violations of type safety, so uses of it in application code should be carefully considered. 
 
 [heading Requirements]
 
@@ -58055,6 +53502,20 @@
 
 [endsect]
 
+
+[section:data const_buffer::data]
+
+[indexterm2 data..const_buffer] 
+Get a pointer to the beginning of the memory range. 
+
+
+  const void * data() const;
+
+
+
+[endsect]
+
+
 [section:operator_plus_ const_buffer::operator+]
 
 [indexterm2 operator+..const_buffer] 
@@ -58106,6 +53567,20 @@
 [endsect]
 
 
+[section:size const_buffer::size]
+
+[indexterm2 size..const_buffer] 
+Get the size of the memory range. 
+
+
+  std::size_t size() const;
+
+
+
+[endsect]
+
+
+
 [endsect]
 
 [section:const_buffers_1 const_buffers_1]
@@ -58155,10 +53630,20 @@
   ]
   
   [
+    [[link asio.reference.const_buffers_1.data [*data]]]
+    [Get a pointer to the beginning of the memory range. ]
+  ]
+  
+  [
     [[link asio.reference.const_buffers_1.end [*end]]]
     [Get a random-access iterator for one past the last element. ]
   ]
   
+  [
+    [[link asio.reference.const_buffers_1.size [*size]]]
+    [Get the size of the memory range. ]
+  ]
+  
 ]
 
 [heading Related Functions]
@@ -58266,6 +53751,23 @@
 
 
 
+[section:data const_buffers_1::data]
+
+
+['Inherited from const_buffer.]
+
+[indexterm2 data..const_buffers_1] 
+Get a pointer to the beginning of the memory range. 
+
+
+  const void * data() const;
+
+
+
+[endsect]
+
+
+
 [section:end const_buffers_1::end]
 
 [indexterm2 end..const_buffers_1] 
@@ -58336,6 +53838,23 @@
 [endsect]
 
 
+[section:size const_buffers_1::size]
+
+
+['Inherited from const_buffer.]
+
+[indexterm2 size..const_buffers_1] 
+Get the size of the memory range. 
+
+
+  std::size_t size() const;
+
+
+
+[endsect]
+
+
+
 [section:value_type const_buffers_1::value_type]
 
 [indexterm2 value_type..const_buffers_1] 
@@ -58358,6 +53877,16 @@
      Construct a non-modifiable buffer from a modifiable one. ]
   ]
   
+  [
+    [[link asio.reference.const_buffer.data [*data]]]
+    [Get a pointer to the beginning of the memory range. ]
+  ]
+  
+  [
+    [[link asio.reference.const_buffer.size [*size]]]
+    [Get the size of the memory range. ]
+  ]
+  
 ]
 
 [heading Related Functions]
@@ -58378,18 +53907,18 @@
   
 
 
-The contents of a buffer may be accessed using the [link asio.reference.buffer_size `buffer_size`]  and [link asio.reference.buffer_cast `buffer_cast`]  functions:
+The contents of a buffer may be accessed using the `data()` and `size()` member functions:
 
 
 
    asio::const_buffer b1 = ...;
-   std::size_t s1 = asio::buffer_size(b1);
-   const unsigned char* p1 = asio::buffer_cast<const unsigned char*>(b1);
+   std::size_t s1 = b1.size();
+   const unsigned char* p1 = static_cast<const unsigned char*>(b1.data());
 
 
 
 
-The `asio::buffer_cast` function permits violations of type safety, so uses of it in application code should be carefully considered. 
+The `data()` member function permits violations of type safety, so uses of it in application code should be carefully considered. 
 
 
 [heading Requirements]
@@ -58778,1092 +54307,6 @@
 
 [endsect]
 
-[section:datagram_socket_service datagram_socket_service]
-
-
-Default service implementation for a datagram socket. 
-
-
-  template<
-      typename ``[link asio.reference.Protocol Protocol]``>
-  class datagram_socket_service :
-    public io_context::service
-
-
-[heading Types]
-[table
-  [[Name][Description]]
-
-  [
-
-    [[link asio.reference.datagram_socket_service.endpoint_type [*endpoint_type]]]
-    [The endpoint type. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.datagram_socket_service.implementation_type [*implementation_type]]]
-    [The type of a datagram socket. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.datagram_socket_service.native_handle_type [*native_handle_type]]]
-    [The native socket type. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.datagram_socket_service.protocol_type [*protocol_type]]]
-    [The protocol type. ]
-  
-  ]
-
-]
-
-[heading Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.datagram_socket_service.assign [*assign]]]
-    [Assign an existing native socket to a datagram socket. ]
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.async_connect [*async_connect]]]
-    [Start an asynchronous connect. ]
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.async_receive [*async_receive]]]
-    [Start an asynchronous receive. ]
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.async_receive_from [*async_receive_from]]]
-    [Start an asynchronous receive that will get the endpoint of the sender. ]
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.async_send [*async_send]]]
-    [Start an asynchronous send. ]
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.async_send_to [*async_send_to]]]
-    [Start an asynchronous send. ]
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.async_wait [*async_wait]]]
-    [Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.at_mark [*at_mark]]]
-    [Determine whether the socket is at the out-of-band data mark. ]
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.available [*available]]]
-    [Determine the number of bytes available for reading. ]
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.bind [*bind]]]
-    []
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.cancel [*cancel]]]
-    [Cancel all asynchronous operations associated with the socket. ]
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.close [*close]]]
-    [Close a datagram socket implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.connect [*connect]]]
-    [Connect the datagram socket to the specified endpoint. ]
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.construct [*construct]]]
-    [Construct a new datagram socket implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.converting_move_construct [*converting_move_construct]]]
-    [Move-construct a new datagram socket implementation from another protocol type. ]
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.datagram_socket_service [*datagram_socket_service]]]
-    [Construct a new datagram socket service for the specified io_context. ]
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.destroy [*destroy]]]
-    [Destroy a datagram socket implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.get_io_context [*get_io_context]]]
-    [Get the io_context object that owns the service. ]
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.get_io_service [*get_io_service]]]
-    [Get the io_context object that owns the service. ]
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.get_option [*get_option]]]
-    [Get a socket option. ]
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.io_control [*io_control]]]
-    [Perform an IO control command on the socket. ]
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.is_open [*is_open]]]
-    [Determine whether the socket is open. ]
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.local_endpoint [*local_endpoint]]]
-    [Get the local endpoint. ]
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.move_assign [*move_assign]]]
-    [Move-assign from another datagram socket implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.move_construct [*move_construct]]]
-    [Move-construct a new datagram socket implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.native_handle [*native_handle]]]
-    [Get the native socket implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.native_non_blocking [*native_non_blocking]]]
-    [Gets the non-blocking mode of the native socket implementation. 
-
-     Sets the non-blocking mode of the native socket implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.non_blocking [*non_blocking]]]
-    [Gets the non-blocking mode of the socket. 
-
-     Sets the non-blocking mode of the socket. ]
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.open [*open]]]
-    []
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.receive [*receive]]]
-    [Receive some data from the peer. ]
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.receive_from [*receive_from]]]
-    [Receive a datagram with the endpoint of the sender. ]
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.remote_endpoint [*remote_endpoint]]]
-    [Get the remote endpoint. ]
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.send [*send]]]
-    [Send the given data to the peer. ]
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.send_to [*send_to]]]
-    [Send a datagram to the specified endpoint. ]
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.set_option [*set_option]]]
-    [Set a socket option. ]
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.shutdown [*shutdown]]]
-    [Disable sends or receives on the socket. ]
-  ]
-  
-  [
-    [[link asio.reference.datagram_socket_service.wait [*wait]]]
-    [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
-  ]
-  
-]
-
-[heading Data Members]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.datagram_socket_service.id [*id]]]
-    [The unique service identifier. ]
-  ]
-
-]
-
-[heading Requirements]
-
-['Header: ][^asio/datagram_socket_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[section:assign datagram_socket_service::assign]
-
-[indexterm2 assign..datagram_socket_service] 
-Assign an existing native socket to a datagram socket. 
-
-
-  asio::error_code assign(
-      implementation_type & impl,
-      const protocol_type & protocol,
-      const native_handle_type & native_socket,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:async_connect datagram_socket_service::async_connect]
-
-[indexterm2 async_connect..datagram_socket_service] 
-Start an asynchronous connect. 
-
-
-  template<
-      typename ``[link asio.reference.ConnectHandler ConnectHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_connect(
-      implementation_type & impl,
-      const endpoint_type & peer_endpoint,
-      ConnectHandler && handler);
-
-
-
-[endsect]
-
-
-
-[section:async_receive datagram_socket_service::async_receive]
-
-[indexterm2 async_receive..datagram_socket_service] 
-Start an asynchronous receive. 
-
-
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
-      typename ``[link asio.reference.ReadHandler ReadHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_receive(
-      implementation_type & impl,
-      const MutableBufferSequence & buffers,
-      socket_base::message_flags flags,
-      ReadHandler && handler);
-
-
-
-[endsect]
-
-
-
-[section:async_receive_from datagram_socket_service::async_receive_from]
-
-[indexterm2 async_receive_from..datagram_socket_service] 
-Start an asynchronous receive that will get the endpoint of the sender. 
-
-
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
-      typename ``[link asio.reference.ReadHandler ReadHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_receive_from(
-      implementation_type & impl,
-      const MutableBufferSequence & buffers,
-      endpoint_type & sender_endpoint,
-      socket_base::message_flags flags,
-      ReadHandler && handler);
-
-
-
-[endsect]
-
-
-
-[section:async_send datagram_socket_service::async_send]
-
-[indexterm2 async_send..datagram_socket_service] 
-Start an asynchronous send. 
-
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
-      typename ``[link asio.reference.WriteHandler WriteHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_send(
-      implementation_type & impl,
-      const ConstBufferSequence & buffers,
-      socket_base::message_flags flags,
-      WriteHandler && handler);
-
-
-
-[endsect]
-
-
-
-[section:async_send_to datagram_socket_service::async_send_to]
-
-[indexterm2 async_send_to..datagram_socket_service] 
-Start an asynchronous send. 
-
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
-      typename ``[link asio.reference.WriteHandler WriteHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_send_to(
-      implementation_type & impl,
-      const ConstBufferSequence & buffers,
-      const endpoint_type & destination,
-      socket_base::message_flags flags,
-      WriteHandler && handler);
-
-
-
-[endsect]
-
-
-
-[section:async_wait datagram_socket_service::async_wait]
-
-[indexterm2 async_wait..datagram_socket_service] 
-Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. 
-
-
-  template<
-      typename ``[link asio.reference.WaitHandler WaitHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
-      implementation_type & impl,
-      socket_base::wait_type w,
-      WaitHandler && handler);
-
-
-
-[endsect]
-
-
-
-[section:at_mark datagram_socket_service::at_mark]
-
-[indexterm2 at_mark..datagram_socket_service] 
-Determine whether the socket is at the out-of-band data mark. 
-
-
-  bool at_mark(
-      const implementation_type & impl,
-      asio::error_code & ec) const;
-
-
-
-[endsect]
-
-
-
-[section:available datagram_socket_service::available]
-
-[indexterm2 available..datagram_socket_service] 
-Determine the number of bytes available for reading. 
-
-
-  std::size_t available(
-      const implementation_type & impl,
-      asio::error_code & ec) const;
-
-
-
-[endsect]
-
-
-
-[section:bind datagram_socket_service::bind]
-
-[indexterm2 bind..datagram_socket_service] 
-
-  asio::error_code bind(
-      implementation_type & impl,
-      const endpoint_type & endpoint,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:cancel datagram_socket_service::cancel]
-
-[indexterm2 cancel..datagram_socket_service] 
-Cancel all asynchronous operations associated with the socket. 
-
-
-  asio::error_code cancel(
-      implementation_type & impl,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:close datagram_socket_service::close]
-
-[indexterm2 close..datagram_socket_service] 
-Close a datagram socket implementation. 
-
-
-  asio::error_code close(
-      implementation_type & impl,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:connect datagram_socket_service::connect]
-
-[indexterm2 connect..datagram_socket_service] 
-Connect the datagram socket to the specified endpoint. 
-
-
-  asio::error_code connect(
-      implementation_type & impl,
-      const endpoint_type & peer_endpoint,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:construct datagram_socket_service::construct]
-
-[indexterm2 construct..datagram_socket_service] 
-Construct a new datagram socket implementation. 
-
-
-  void construct(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:converting_move_construct datagram_socket_service::converting_move_construct]
-
-[indexterm2 converting_move_construct..datagram_socket_service] 
-Move-construct a new datagram socket implementation from another protocol type. 
-
-
-  template<
-      typename ``[link asio.reference.Protocol Protocol1]``>
-  void converting_move_construct(
-      implementation_type & impl,
-      typename datagram_socket_service< Protocol1 >::implementation_type & other_impl,
-      typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);
-
-
-
-[endsect]
-
-
-
-[section:datagram_socket_service datagram_socket_service::datagram_socket_service]
-
-[indexterm2 datagram_socket_service..datagram_socket_service] 
-Construct a new datagram socket service for the specified [link asio.reference.io_context `io_context`]. 
-
-
-  datagram_socket_service(
-      asio::io_context & io_context);
-
-
-
-[endsect]
-
-
-
-[section:destroy datagram_socket_service::destroy]
-
-[indexterm2 destroy..datagram_socket_service] 
-Destroy a datagram socket implementation. 
-
-
-  void destroy(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:endpoint_type datagram_socket_service::endpoint_type]
-
-[indexterm2 endpoint_type..datagram_socket_service] 
-The endpoint type. 
-
-
-  typedef Protocol::endpoint endpoint_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/datagram_socket_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:get_io_context datagram_socket_service::get_io_context]
-
-
-['Inherited from io_context.]
-
-[indexterm2 get_io_context..datagram_socket_service] 
-Get the [link asio.reference.io_context `io_context`] object that owns the service. 
-
-
-  asio::io_context & get_io_context();
-
-
-
-[endsect]
-
-
-
-[section:get_io_service datagram_socket_service::get_io_service]
-
-
-['Inherited from io_context.]
-
-[indexterm2 get_io_service..datagram_socket_service] 
-Get the [link asio.reference.io_context `io_context`] object that owns the service. 
-
-
-  asio::io_context & get_io_service();
-
-
-
-[endsect]
-
-
-
-[section:get_option datagram_socket_service::get_option]
-
-[indexterm2 get_option..datagram_socket_service] 
-Get a socket option. 
-
-
-  template<
-      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
-  asio::error_code get_option(
-      const implementation_type & impl,
-      GettableSocketOption & option,
-      asio::error_code & ec) const;
-
-
-
-[endsect]
-
-
-
-[section:id datagram_socket_service::id]
-
-[indexterm2 id..datagram_socket_service] 
-The unique service identifier. 
-
-
-  static asio::io_context::id id;
-
-
-
-[endsect]
-
-
-
-[section:implementation_type datagram_socket_service::implementation_type]
-
-[indexterm2 implementation_type..datagram_socket_service] 
-The type of a datagram socket. 
-
-
-  typedef implementation_defined implementation_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/datagram_socket_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:io_control datagram_socket_service::io_control]
-
-[indexterm2 io_control..datagram_socket_service] 
-Perform an IO control command on the socket. 
-
-
-  template<
-      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
-  asio::error_code io_control(
-      implementation_type & impl,
-      IoControlCommand & command,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:is_open datagram_socket_service::is_open]
-
-[indexterm2 is_open..datagram_socket_service] 
-Determine whether the socket is open. 
-
-
-  bool is_open(
-      const implementation_type & impl) const;
-
-
-
-[endsect]
-
-
-
-[section:local_endpoint datagram_socket_service::local_endpoint]
-
-[indexterm2 local_endpoint..datagram_socket_service] 
-Get the local endpoint. 
-
-
-  endpoint_type local_endpoint(
-      const implementation_type & impl,
-      asio::error_code & ec) const;
-
-
-
-[endsect]
-
-
-
-[section:move_assign datagram_socket_service::move_assign]
-
-[indexterm2 move_assign..datagram_socket_service] 
-Move-assign from another datagram socket implementation. 
-
-
-  void move_assign(
-      implementation_type & impl,
-      datagram_socket_service & other_service,
-      implementation_type & other_impl);
-
-
-
-[endsect]
-
-
-
-[section:move_construct datagram_socket_service::move_construct]
-
-[indexterm2 move_construct..datagram_socket_service] 
-Move-construct a new datagram socket implementation. 
-
-
-  void move_construct(
-      implementation_type & impl,
-      implementation_type & other_impl);
-
-
-
-[endsect]
-
-
-
-[section:native_handle datagram_socket_service::native_handle]
-
-[indexterm2 native_handle..datagram_socket_service] 
-Get the native socket implementation. 
-
-
-  native_handle_type native_handle(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:native_handle_type datagram_socket_service::native_handle_type]
-
-[indexterm2 native_handle_type..datagram_socket_service] 
-The native socket type. 
-
-
-  typedef implementation_defined native_handle_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/datagram_socket_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-[section:native_non_blocking datagram_socket_service::native_non_blocking]
-
-[indexterm2 native_non_blocking..datagram_socket_service] 
-Gets the non-blocking mode of the native socket implementation. 
-
-
-  bool ``[link asio.reference.datagram_socket_service.native_non_blocking.overload1 native_non_blocking]``(
-      const implementation_type & impl) const;
-  ``  [''''&raquo;''' [link asio.reference.datagram_socket_service.native_non_blocking.overload1 more...]]``
-
-
-Sets the non-blocking mode of the native socket implementation. 
-
-
-  asio::error_code ``[link asio.reference.datagram_socket_service.native_non_blocking.overload2 native_non_blocking]``(
-      implementation_type & impl,
-      bool mode,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.datagram_socket_service.native_non_blocking.overload2 more...]]``
-
-
-[section:overload1 datagram_socket_service::native_non_blocking (1 of 2 overloads)]
-
-
-Gets the non-blocking mode of the native socket implementation. 
-
-
-  bool native_non_blocking(
-      const implementation_type & impl) const;
-
-
-
-[endsect]
-
-
-
-[section:overload2 datagram_socket_service::native_non_blocking (2 of 2 overloads)]
-
-
-Sets the non-blocking mode of the native socket implementation. 
-
-
-  asio::error_code native_non_blocking(
-      implementation_type & impl,
-      bool mode,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-[endsect]
-
-[section:non_blocking datagram_socket_service::non_blocking]
-
-[indexterm2 non_blocking..datagram_socket_service] 
-Gets the non-blocking mode of the socket. 
-
-
-  bool ``[link asio.reference.datagram_socket_service.non_blocking.overload1 non_blocking]``(
-      const implementation_type & impl) const;
-  ``  [''''&raquo;''' [link asio.reference.datagram_socket_service.non_blocking.overload1 more...]]``
-
-
-Sets the non-blocking mode of the socket. 
-
-
-  asio::error_code ``[link asio.reference.datagram_socket_service.non_blocking.overload2 non_blocking]``(
-      implementation_type & impl,
-      bool mode,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.datagram_socket_service.non_blocking.overload2 more...]]``
-
-
-[section:overload1 datagram_socket_service::non_blocking (1 of 2 overloads)]
-
-
-Gets the non-blocking mode of the socket. 
-
-
-  bool non_blocking(
-      const implementation_type & impl) const;
-
-
-
-[endsect]
-
-
-
-[section:overload2 datagram_socket_service::non_blocking (2 of 2 overloads)]
-
-
-Sets the non-blocking mode of the socket. 
-
-
-  asio::error_code non_blocking(
-      implementation_type & impl,
-      bool mode,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:open datagram_socket_service::open]
-
-[indexterm2 open..datagram_socket_service] 
-
-  asio::error_code open(
-      implementation_type & impl,
-      const protocol_type & protocol,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:protocol_type datagram_socket_service::protocol_type]
-
-[indexterm2 protocol_type..datagram_socket_service] 
-The protocol type. 
-
-
-  typedef Protocol protocol_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/datagram_socket_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:receive datagram_socket_service::receive]
-
-[indexterm2 receive..datagram_socket_service] 
-Receive some data from the peer. 
-
-
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
-  std::size_t receive(
-      implementation_type & impl,
-      const MutableBufferSequence & buffers,
-      socket_base::message_flags flags,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:receive_from datagram_socket_service::receive_from]
-
-[indexterm2 receive_from..datagram_socket_service] 
-Receive a datagram with the endpoint of the sender. 
-
-
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
-  std::size_t receive_from(
-      implementation_type & impl,
-      const MutableBufferSequence & buffers,
-      endpoint_type & sender_endpoint,
-      socket_base::message_flags flags,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:remote_endpoint datagram_socket_service::remote_endpoint]
-
-[indexterm2 remote_endpoint..datagram_socket_service] 
-Get the remote endpoint. 
-
-
-  endpoint_type remote_endpoint(
-      const implementation_type & impl,
-      asio::error_code & ec) const;
-
-
-
-[endsect]
-
-
-
-[section:send datagram_socket_service::send]
-
-[indexterm2 send..datagram_socket_service] 
-Send the given data to the peer. 
-
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
-  std::size_t send(
-      implementation_type & impl,
-      const ConstBufferSequence & buffers,
-      socket_base::message_flags flags,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:send_to datagram_socket_service::send_to]
-
-[indexterm2 send_to..datagram_socket_service] 
-Send a datagram to the specified endpoint. 
-
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
-  std::size_t send_to(
-      implementation_type & impl,
-      const ConstBufferSequence & buffers,
-      const endpoint_type & destination,
-      socket_base::message_flags flags,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:set_option datagram_socket_service::set_option]
-
-[indexterm2 set_option..datagram_socket_service] 
-Set a socket option. 
-
-
-  template<
-      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
-  asio::error_code set_option(
-      implementation_type & impl,
-      const SettableSocketOption & option,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:shutdown datagram_socket_service::shutdown]
-
-[indexterm2 shutdown..datagram_socket_service] 
-Disable sends or receives on the socket. 
-
-
-  asio::error_code shutdown(
-      implementation_type & impl,
-      socket_base::shutdown_type what,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:wait datagram_socket_service::wait]
-
-[indexterm2 wait..datagram_socket_service] 
-Wait for the socket to become ready to read, ready to write, or to have pending error conditions. 
-
-
-  asio::error_code wait(
-      implementation_type & impl,
-      socket_base::wait_type w,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[endsect]
-
 
 [section:deadline_timer deadline_timer]
 
@@ -59894,20 +54337,6 @@
 
   [
 
-    [[link asio.reference.basic_deadline_timer.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.basic_deadline_timer.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_deadline_timer.time_type [*time_type]]]
     [The time type. ]
   
@@ -59984,20 +54413,9 @@
     [Perform a blocking wait on the timer. ]
   ]
   
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
   [
-    [[link asio.reference.basic_deadline_timer.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_deadline_timer.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
+    [[link asio.reference.basic_deadline_timer._basic_deadline_timer [*~basic_deadline_timer]]]
+    [Destroys the timer. ]
   ]
   
 ]
@@ -60107,485 +54525,6 @@
 [endsect]
 
 
-[section:deadline_timer_service deadline_timer_service]
-
-
-Default service implementation for a timer. 
-
-
-  template<
-      typename TimeType,
-      typename ``[link asio.reference.TimeTraits TimeTraits]`` = asio::time_traits<TimeType>>
-  class deadline_timer_service :
-    public io_context::service
-
-
-[heading Types]
-[table
-  [[Name][Description]]
-
-  [
-
-    [[link asio.reference.deadline_timer_service.duration_type [*duration_type]]]
-    [The duration type. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.deadline_timer_service.implementation_type [*implementation_type]]]
-    [The implementation type of the deadline timer. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.deadline_timer_service.time_type [*time_type]]]
-    [The time type. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.deadline_timer_service.traits_type [*traits_type]]]
-    [The time traits type. ]
-  
-  ]
-
-]
-
-[heading Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.deadline_timer_service.async_wait [*async_wait]]]
-    []
-  ]
-  
-  [
-    [[link asio.reference.deadline_timer_service.cancel [*cancel]]]
-    [Cancel any asynchronous wait operations associated with the timer. ]
-  ]
-  
-  [
-    [[link asio.reference.deadline_timer_service.cancel_one [*cancel_one]]]
-    [Cancels one asynchronous wait operation associated with the timer. ]
-  ]
-  
-  [
-    [[link asio.reference.deadline_timer_service.construct [*construct]]]
-    [Construct a new timer implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.deadline_timer_service.deadline_timer_service [*deadline_timer_service]]]
-    [Construct a new timer service for the specified io_context. ]
-  ]
-  
-  [
-    [[link asio.reference.deadline_timer_service.destroy [*destroy]]]
-    [Destroy a timer implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.deadline_timer_service.expires_at [*expires_at]]]
-    [Get the expiry time for the timer as an absolute time. 
-
-     Set the expiry time for the timer as an absolute time. ]
-  ]
-  
-  [
-    [[link asio.reference.deadline_timer_service.expires_from_now [*expires_from_now]]]
-    [Get the expiry time for the timer relative to now. 
-
-     Set the expiry time for the timer relative to now. ]
-  ]
-  
-  [
-    [[link asio.reference.deadline_timer_service.get_io_context [*get_io_context]]]
-    [Get the io_context object that owns the service. ]
-  ]
-  
-  [
-    [[link asio.reference.deadline_timer_service.get_io_service [*get_io_service]]]
-    [Get the io_context object that owns the service. ]
-  ]
-  
-  [
-    [[link asio.reference.deadline_timer_service.wait [*wait]]]
-    []
-  ]
-  
-]
-
-[heading Data Members]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.deadline_timer_service.id [*id]]]
-    [The unique service identifier. ]
-  ]
-
-]
-
-[heading Requirements]
-
-['Header: ][^asio/deadline_timer_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[section:async_wait deadline_timer_service::async_wait]
-
-[indexterm2 async_wait..deadline_timer_service] 
-
-  template<
-      typename ``[link asio.reference.WaitHandler WaitHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
-      implementation_type & impl,
-      WaitHandler && handler);
-
-
-
-[endsect]
-
-
-
-[section:cancel deadline_timer_service::cancel]
-
-[indexterm2 cancel..deadline_timer_service] 
-Cancel any asynchronous wait operations associated with the timer. 
-
-
-  std::size_t cancel(
-      implementation_type & impl,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:cancel_one deadline_timer_service::cancel_one]
-
-[indexterm2 cancel_one..deadline_timer_service] 
-Cancels one asynchronous wait operation associated with the timer. 
-
-
-  std::size_t cancel_one(
-      implementation_type & impl,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:construct deadline_timer_service::construct]
-
-[indexterm2 construct..deadline_timer_service] 
-Construct a new timer implementation. 
-
-
-  void construct(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:deadline_timer_service deadline_timer_service::deadline_timer_service]
-
-[indexterm2 deadline_timer_service..deadline_timer_service] 
-Construct a new timer service for the specified [link asio.reference.io_context `io_context`]. 
-
-
-  deadline_timer_service(
-      asio::io_context & io_context);
-
-
-
-[endsect]
-
-
-
-[section:destroy deadline_timer_service::destroy]
-
-[indexterm2 destroy..deadline_timer_service] 
-Destroy a timer implementation. 
-
-
-  void destroy(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:duration_type deadline_timer_service::duration_type]
-
-[indexterm2 duration_type..deadline_timer_service] 
-The duration type. 
-
-
-  typedef traits_type::duration_type duration_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/deadline_timer_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-[section:expires_at deadline_timer_service::expires_at]
-
-[indexterm2 expires_at..deadline_timer_service] 
-Get the expiry time for the timer as an absolute time. 
-
-
-  time_type ``[link asio.reference.deadline_timer_service.expires_at.overload1 expires_at]``(
-      const implementation_type & impl) const;
-  ``  [''''&raquo;''' [link asio.reference.deadline_timer_service.expires_at.overload1 more...]]``
-
-
-Set the expiry time for the timer as an absolute time. 
-
-
-  std::size_t ``[link asio.reference.deadline_timer_service.expires_at.overload2 expires_at]``(
-      implementation_type & impl,
-      const time_type & expiry_time,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.deadline_timer_service.expires_at.overload2 more...]]``
-
-
-[section:overload1 deadline_timer_service::expires_at (1 of 2 overloads)]
-
-
-Get the expiry time for the timer as an absolute time. 
-
-
-  time_type expires_at(
-      const implementation_type & impl) const;
-
-
-
-[endsect]
-
-
-
-[section:overload2 deadline_timer_service::expires_at (2 of 2 overloads)]
-
-
-Set the expiry time for the timer as an absolute time. 
-
-
-  std::size_t expires_at(
-      implementation_type & impl,
-      const time_type & expiry_time,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-[endsect]
-
-[section:expires_from_now deadline_timer_service::expires_from_now]
-
-[indexterm2 expires_from_now..deadline_timer_service] 
-Get the expiry time for the timer relative to now. 
-
-
-  duration_type ``[link asio.reference.deadline_timer_service.expires_from_now.overload1 expires_from_now]``(
-      const implementation_type & impl) const;
-  ``  [''''&raquo;''' [link asio.reference.deadline_timer_service.expires_from_now.overload1 more...]]``
-
-
-Set the expiry time for the timer relative to now. 
-
-
-  std::size_t ``[link asio.reference.deadline_timer_service.expires_from_now.overload2 expires_from_now]``(
-      implementation_type & impl,
-      const duration_type & expiry_time,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.deadline_timer_service.expires_from_now.overload2 more...]]``
-
-
-[section:overload1 deadline_timer_service::expires_from_now (1 of 2 overloads)]
-
-
-Get the expiry time for the timer relative to now. 
-
-
-  duration_type expires_from_now(
-      const implementation_type & impl) const;
-
-
-
-[endsect]
-
-
-
-[section:overload2 deadline_timer_service::expires_from_now (2 of 2 overloads)]
-
-
-Set the expiry time for the timer relative to now. 
-
-
-  std::size_t expires_from_now(
-      implementation_type & impl,
-      const duration_type & expiry_time,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:get_io_context deadline_timer_service::get_io_context]
-
-
-['Inherited from io_context.]
-
-[indexterm2 get_io_context..deadline_timer_service] 
-Get the [link asio.reference.io_context `io_context`] object that owns the service. 
-
-
-  asio::io_context & get_io_context();
-
-
-
-[endsect]
-
-
-
-[section:get_io_service deadline_timer_service::get_io_service]
-
-
-['Inherited from io_context.]
-
-[indexterm2 get_io_service..deadline_timer_service] 
-Get the [link asio.reference.io_context `io_context`] object that owns the service. 
-
-
-  asio::io_context & get_io_service();
-
-
-
-[endsect]
-
-
-
-[section:id deadline_timer_service::id]
-
-[indexterm2 id..deadline_timer_service] 
-The unique service identifier. 
-
-
-  static asio::io_context::id id;
-
-
-
-[endsect]
-
-
-
-[section:implementation_type deadline_timer_service::implementation_type]
-
-[indexterm2 implementation_type..deadline_timer_service] 
-The implementation type of the deadline timer. 
-
-
-  typedef implementation_defined implementation_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/deadline_timer_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:time_type deadline_timer_service::time_type]
-
-[indexterm2 time_type..deadline_timer_service] 
-The time type. 
-
-
-  typedef traits_type::time_type time_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/deadline_timer_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:traits_type deadline_timer_service::traits_type]
-
-[indexterm2 traits_type..deadline_timer_service] 
-The time traits type. 
-
-
-  typedef TimeTraits traits_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/deadline_timer_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:wait deadline_timer_service::wait]
-
-[indexterm2 wait..deadline_timer_service] 
-
-  void wait(
-      implementation_type & impl,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[endsect]
-
 [section:defer defer]
 
 [indexterm1 defer] 
@@ -61239,10 +55178,20 @@
   ]
   
   [
+    [[link asio.reference.const_buffers_1.data [*data]]]
+    [Get a pointer to the beginning of the memory range. ]
+  ]
+  
+  [
     [[link asio.reference.const_buffers_1.end [*end]]]
     [Get a random-access iterator for one past the last element. ]
   ]
   
+  [
+    [[link asio.reference.const_buffers_1.size [*size]]]
+    [Get the size of the memory range. ]
+  ]
+  
 ]
 
 [heading Related Functions]
@@ -61444,6 +55393,11 @@
   ]
   
   [
+    [[link asio.reference.mutable_buffers_1.data [*data]]]
+    [Get a pointer to the beginning of the memory range. ]
+  ]
+  
+  [
     [[link asio.reference.mutable_buffers_1.end [*end]]]
     [Get a random-access iterator for one past the last element. ]
   ]
@@ -61455,6 +55409,11 @@
      Construct to represent a single modifiable buffer. ]
   ]
   
+  [
+    [[link asio.reference.mutable_buffers_1.size [*size]]]
+    [Get the size of the memory range. ]
+  ]
+  
 ]
 
 [heading Related Functions]
@@ -61725,10 +55684,20 @@
   ]
   
   [
+    [[link asio.reference.const_buffers_1.data [*data]]]
+    [Get a pointer to the beginning of the memory range. ]
+  ]
+  
+  [
     [[link asio.reference.const_buffers_1.end [*end]]]
     [Get a random-access iterator for one past the last element. ]
   ]
   
+  [
+    [[link asio.reference.const_buffers_1.size [*size]]]
+    [Get the size of the memory range. ]
+  ]
+  
 ]
 
 [heading Related Functions]
@@ -61930,6 +55899,11 @@
   ]
   
   [
+    [[link asio.reference.mutable_buffers_1.data [*data]]]
+    [Get a pointer to the beginning of the memory range. ]
+  ]
+  
+  [
     [[link asio.reference.mutable_buffers_1.end [*end]]]
     [Get a random-access iterator for one past the last element. ]
   ]
@@ -61941,6 +55915,11 @@
      Construct to represent a single modifiable buffer. ]
   ]
   
+  [
+    [[link asio.reference.mutable_buffers_1.size [*size]]]
+    [Get the size of the memory range. ]
+  ]
+  
 ]
 
 [heading Related Functions]
@@ -63190,7 +57169,7 @@
   [[Name][Description]]
 
   [
-    [[link asio.reference.execution_context.destroy_context [*destroy_context]]]
+    [[link asio.reference.execution_context.destroy [*destroy]]]
     [Destroys all services in the context. ]
   ]
   
@@ -63200,7 +57179,7 @@
   ]
   
   [
-    [[link asio.reference.execution_context.shutdown_context [*shutdown_context]]]
+    [[link asio.reference.execution_context.shutdown [*shutdown]]]
     [Shuts down all services in the context. ]
   ]
   
@@ -63265,7 +57244,7 @@
 
 Class [link asio.reference.execution_context `execution_context`] may be used only as a base class for concrete execution context types. The `io_context` is an example of such a derived type.
 
-On destruction, a class that is derived from [link asio.reference.execution_context `execution_context`] must perform `execution_context::shutdown_context()` followed by `execution_context::destroy_context()`.
+On destruction, a class that is derived from [link asio.reference.execution_context `execution_context`] must perform `execution_context::shutdown()` followed by `execution_context::destroy()`.
 
 This destruction sequence permits programs to simplify their resource management by using `shared_ptr<>`. Where an object's lifetime is tied to the lifetime of a connection (or some other sequence of asynchronous operations), a `shared_ptr` to the object would be bound into the handlers for all asynchronous operations associated with it. This works as follows:
 
@@ -63273,7 +57252,7 @@
 * When a single connection ends, all associated asynchronous operations complete. The corresponding handler objects are destroyed, and all `shared_ptr` references to the objects are destroyed.
 
 
-* To shut down the whole program, the [link asio.reference.io_context `io_context`] function stop() is called to terminate any run() calls as soon as possible. The [link asio.reference.io_context `io_context`] destructor calls `shutdown_context()` and `destroy_context()` to destroy all pending handlers, causing all `shared_ptr` references to all connection objects to be destroyed. 
+* To shut down the whole program, the [link asio.reference.io_context `io_context`] function stop() is called to terminate any run() calls as soon as possible. The [link asio.reference.io_context `io_context`] destructor calls `shutdown()` and `destroy()` to destroy all pending handlers, causing all `shared_ptr` references to all connection objects to be destroyed. 
 
 
 
@@ -63340,13 +57319,13 @@
 
 
 
-[section:destroy_context execution_context::destroy_context]
+[section:destroy execution_context::destroy]
 
-[indexterm2 destroy_context..execution_context] 
+[indexterm2 destroy..execution_context] 
 Destroys all services in the context. 
 
 
-  void destroy_context();
+  void destroy();
 
 
 This function is implemented as follows:
@@ -63563,7 +57542,7 @@
 
 [heading Remarks]
       
-For each service object `svc` in the [link asio.reference.execution_context `execution_context`] set, performs `svc->fork_service();`. When processing the fork\_prepare event, services are visited in reverse order of the beginning of service object lifetime. Otherwise, services are visited in order of the beginning of service object lifetime. 
+For each service object `svc` in the [link asio.reference.execution_context `execution_context`] set, performs `svc->notify_fork();`. When processing the fork\_prepare event, services are visited in reverse order of the beginning of service object lifetime. Otherwise, services are visited in order of the beginning of service object lifetime. 
 
 
 
@@ -63572,19 +57551,19 @@
 
 
 
-[section:shutdown_context execution_context::shutdown_context]
+[section:shutdown execution_context::shutdown]
 
-[indexterm2 shutdown_context..execution_context] 
+[indexterm2 shutdown..execution_context] 
 Shuts down all services in the context. 
 
 
-  void shutdown_context();
+  void shutdown();
 
 
 This function is implemented as follows:
 
 
-* For each service object `svc` in the [link asio.reference.execution_context `execution_context`] set, in reverse order of the beginning of service object lifetime, performs `svc->shutdown_service()`. 
+* For each service object `svc` in the [link asio.reference.execution_context `execution_context`] set, in reverse order of the beginning of service object lifetime, performs `svc->shutdown()`. 
 
 
 
@@ -63804,12 +57783,12 @@
   [[Name][Description]]
 
   [
-    [[link asio.reference.execution_context__service.fork_service [*fork_service]]]
+    [[link asio.reference.execution_context__service.notify_fork [*notify_fork]]]
     [Handle notification of a fork-related event to perform any necessary housekeeping. ]
   ]
   
   [
-    [[link asio.reference.execution_context__service.shutdown_service [*shutdown_service]]]
+    [[link asio.reference.execution_context__service.shutdown [*shutdown]]]
     [Destroy all user-defined handler objects owned by the service. ]
   ]
   
@@ -63877,13 +57856,13 @@
 
 
 
-[section:fork_service execution_context::service::fork_service]
+[section:notify_fork execution_context::service::notify_fork]
 
-[indexterm2 fork_service..execution_context::service] 
+[indexterm2 notify_fork..execution_context::service] 
 Handle notification of a fork-related event to perform any necessary housekeeping. 
 
 
-  virtual void fork_service(
+  virtual void notify_fork(
       execution_context::fork_event event);
 
 
@@ -63894,13 +57873,13 @@
 
 
 
-[section:shutdown_service execution_context::service::shutdown_service]
+[section:shutdown execution_context::service::shutdown]
 
-[indexterm2 shutdown_service..execution_context::service] 
+[indexterm2 shutdown..execution_context::service] 
 Destroy all user-defined handler objects owned by the service. 
 
 
-  void shutdown_service();
+  void shutdown();
 
 
 
@@ -64055,7 +58034,7 @@
 Obtain the underlying execution context. 
 
 
-  execution_context & context();
+  execution_context & context() const;
 
 
 
@@ -64074,7 +58053,7 @@
       typename Allocator>
   void defer(
       Function && f,
-      const Allocator & a);
+      const Allocator & a) const;
 
 
 This function is used to ask the executor to execute the given function object. The function object is executed according to the rules of the target executor object.
@@ -64113,7 +58092,7 @@
       typename Allocator>
   void dispatch(
       Function && f,
-      const Allocator & a);
+      const Allocator & a) const;
 
 
 This function is used to ask the executor to execute the given function object. The function object is executed according to the rules of the target executor object.
@@ -64301,7 +58280,7 @@
 Inform the executor that some work is no longer outstanding. 
 
 
-  void on_work_finished();
+  void on_work_finished() const;
 
 
 
@@ -64315,7 +58294,7 @@
 Inform the executor that it has some outstanding work to do. 
 
 
-  void on_work_started();
+  void on_work_started() const;
 
 
 
@@ -64488,7 +58467,7 @@
       typename Allocator>
   void post(
       Function && f,
-      const Allocator & a);
+      const Allocator & a) const;
 
 
 This function is used to ask the executor to execute the given function object. The function object is executed according to the rules of the target executor object.
@@ -66613,13 +60592,6 @@
 
   [
 
-    [[link asio.reference.basic_datagram_socket.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_datagram_socket.keep_alive [*keep_alive]]]
     [Socket option to send keep-alives. ]
   
@@ -66697,13 +60669,6 @@
 
   [
 
-    [[link asio.reference.basic_datagram_socket.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_datagram_socket.shutdown_type [*shutdown_type]]]
     [Different ways a socket may be shutdown. ]
   
@@ -66915,20 +60880,9 @@
     [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
   ]
   
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
   [
-    [[link asio.reference.basic_datagram_socket.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_datagram_socket.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
+    [[link asio.reference.basic_datagram_socket._basic_datagram_socket [*~basic_datagram_socket]]]
+    [Destroys the socket. ]
   ]
   
 ]
@@ -67455,13 +61409,6 @@
 
   [
 
-    [[link asio.reference.basic_raw_socket.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_raw_socket.keep_alive [*keep_alive]]]
     [Socket option to send keep-alives. ]
   
@@ -67539,13 +61486,6 @@
 
   [
 
-    [[link asio.reference.basic_raw_socket.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_raw_socket.shutdown_type [*shutdown_type]]]
     [Different ways a socket may be shutdown. ]
   
@@ -67757,20 +61697,9 @@
     [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
   ]
   
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
   [
-    [[link asio.reference.basic_raw_socket.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_raw_socket.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
+    [[link asio.reference.basic_raw_socket._basic_raw_socket [*~basic_raw_socket]]]
+    [Destroys the socket. ]
   ]
   
 ]
@@ -68292,13 +62221,6 @@
 
   [
 
-    [[link asio.reference.basic_seq_packet_socket.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_seq_packet_socket.keep_alive [*keep_alive]]]
     [Socket option to send keep-alives. ]
   
@@ -68376,13 +62298,6 @@
 
   [
 
-    [[link asio.reference.basic_seq_packet_socket.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_seq_packet_socket.shutdown_type [*shutdown_type]]]
     [Different ways a socket may be shutdown. ]
   
@@ -68576,20 +62491,9 @@
     [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
   ]
   
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
   [
-    [[link asio.reference.basic_seq_packet_socket.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_seq_packet_socket.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
+    [[link asio.reference.basic_seq_packet_socket._basic_seq_packet_socket [*~basic_seq_packet_socket]]]
+    [Destroys the socket. ]
   ]
   
 ]
@@ -69174,13 +63078,6 @@
 
   [
 
-    [[link asio.reference.basic_stream_socket.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_stream_socket.keep_alive [*keep_alive]]]
     [Socket option to send keep-alives. ]
   
@@ -69258,13 +63155,6 @@
 
   [
 
-    [[link asio.reference.basic_stream_socket.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_stream_socket.shutdown_type [*shutdown_type]]]
     [Different ways a socket may be shutdown. ]
   
@@ -69478,20 +63368,9 @@
     [Write some data to the socket. ]
   ]
   
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
   [
-    [[link asio.reference.basic_stream_socket.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_stream_socket.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
+    [[link asio.reference.basic_stream_socket._basic_stream_socket [*~basic_stream_socket]]]
+    [Destroys the socket. ]
   ]
   
 ]
@@ -69966,20 +63845,6 @@
 
   [
 
-    [[link asio.reference.basic_waitable_timer.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.basic_waitable_timer.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_waitable_timer.time_point [*time_point]]]
     [The time point type of the clock. ]
   
@@ -70016,12 +63881,16 @@
   
   [
     [[link asio.reference.basic_waitable_timer.cancel [*cancel]]]
-    [Cancel any asynchronous operations that are waiting on the timer. ]
+    [Cancel any asynchronous operations that are waiting on the timer. 
+
+     (Deprecated: Use non-error_code overload.) Cancel any asynchronous operations that are waiting on the timer. ]
   ]
   
   [
     [[link asio.reference.basic_waitable_timer.cancel_one [*cancel_one]]]
-    [Cancels one asynchronous operation that is waiting on the timer. ]
+    [Cancels one asynchronous operation that is waiting on the timer. 
+
+     (Deprecated: Use non-error_code overload.) Cancels one asynchronous operation that is waiting on the timer. ]
   ]
   
   [
@@ -70033,7 +63902,9 @@
     [[link asio.reference.basic_waitable_timer.expires_at [*expires_at]]]
     [(Deprecated: Use expiry().) Get the timer's expiry time as an absolute time. 
 
-     Set the timer's expiry time as an absolute time. ]
+     Set the timer's expiry time as an absolute time. 
+
+     (Deprecated: Use non-error_code overload.) Set the timer's expiry time as an absolute time. ]
   ]
   
   [
@@ -70073,20 +63944,9 @@
     [Perform a blocking wait on the timer. ]
   ]
   
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
   [
-    [[link asio.reference.basic_waitable_timer.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_waitable_timer.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
+    [[link asio.reference.basic_waitable_timer._basic_waitable_timer [*~basic_waitable_timer]]]
+    [Destroys the timer. ]
   ]
   
 ]
@@ -70386,12 +64246,12 @@
   [[Name][Description]]
 
   [
-    [[link asio.reference.io_context.destroy_context [*destroy_context]]]
+    [[link asio.reference.io_context.destroy [*destroy]]]
     [Destroys all services in the context. ]
   ]
   
   [
-    [[link asio.reference.io_context.shutdown_context [*shutdown_context]]]
+    [[link asio.reference.io_context.shutdown [*shutdown]]]
     [Shuts down all services in the context. ]
   ]
   
@@ -70581,16 +64441,16 @@
 
 
 
-[section:destroy_context io_context::destroy_context]
+[section:destroy io_context::destroy]
 
 
 ['Inherited from execution_context.]
 
-[indexterm2 destroy_context..io_context] 
+[indexterm2 destroy..io_context] 
 Destroys all services in the context. 
 
 
-  void destroy_context();
+  void destroy();
 
 
 This function is implemented as follows:
@@ -70762,7 +64622,7 @@
   ``  [''''&raquo;''' [link asio.reference.io_context.io_context.overload1 more...]]``
 
   explicit ``[link asio.reference.io_context.io_context.overload2 io_context]``(
-      std::size_t concurrency_hint);
+      int concurrency_hint);
   ``  [''''&raquo;''' [link asio.reference.io_context.io_context.overload2 more...]]``
 
 
@@ -70787,7 +64647,7 @@
 
 
   io_context(
-      std::size_t concurrency_hint);
+      int concurrency_hint);
 
 
 Construct with a hint about the required level of concurrency.
@@ -70925,7 +64785,7 @@
 
 [heading Remarks]
       
-For each service object `svc` in the [link asio.reference.execution_context `execution_context`] set, performs `svc->fork_service();`. When processing the fork\_prepare event, services are visited in reverse order of the beginning of service object lifetime. Otherwise, services are visited in order of the beginning of service object lifetime. 
+For each service object `svc` in the [link asio.reference.execution_context `execution_context`] set, performs `svc->notify_fork();`. When processing the fork\_prepare event, services are visited in reverse order of the beginning of service object lifetime. Otherwise, services are visited in order of the beginning of service object lifetime. 
 
 
 
@@ -71356,22 +65216,22 @@
 [endsect]
 
 
-[section:shutdown_context io_context::shutdown_context]
+[section:shutdown io_context::shutdown]
 
 
 ['Inherited from execution_context.]
 
-[indexterm2 shutdown_context..io_context] 
+[indexterm2 shutdown..io_context] 
 Shuts down all services in the context. 
 
 
-  void shutdown_context();
+  void shutdown();
 
 
 This function is implemented as follows:
 
 
-* For each service object `svc` in the [link asio.reference.execution_context `execution_context`] set, in reverse order of the beginning of service object lifetime, performs `svc->shutdown_service()`. 
+* For each service object `svc` in the [link asio.reference.execution_context `execution_context`] set, in reverse order of the beginning of service object lifetime, performs `svc->shutdown()`. 
 
 
 
@@ -71603,7 +65463,7 @@
 On destruction, the [link asio.reference.io_context `io_context`] performs the following sequence of operations:
 
 
-* For each service object `svc` in the [link asio.reference.io_context `io_context`] set, in reverse order of the beginning of service object lifetime, performs `svc->shutdown_service()`.
+* For each service object `svc` in the [link asio.reference.io_context `io_context`] set, in reverse order of the beginning of service object lifetime, performs `svc->shutdown()`.
 
 
 * Uninvoked handler objects that were scheduled for deferred invocation on the [link asio.reference.io_context `io_context`], or any associated strand, are destroyed.
@@ -71710,7 +65570,7 @@
 Obtain the underlying execution context. 
 
 
-  io_context & context();
+  io_context & context() const;
 
 
 
@@ -71729,7 +65589,7 @@
       typename Allocator>
   void defer(
       Function && f,
-      const Allocator & a);
+      const Allocator & a) const;
 
 
 This function is used to ask the [link asio.reference.io_context `io_context`] to execute the given function object. The function object will never be executed inside `defer()`. Instead, it will be scheduled to run on the [link asio.reference.io_context `io_context`].
@@ -71770,7 +65630,7 @@
       typename Allocator>
   void dispatch(
       Function && f,
-      const Allocator & a);
+      const Allocator & a) const;
 
 
 This function is used to ask the [link asio.reference.io_context `io_context`] to execute the given function object. If the current thread is running the [link asio.reference.io_context `io_context`], `dispatch()` executes the function before returning. Otherwise, the function will be scheduled to run on the [link asio.reference.io_context `io_context`].
@@ -71804,7 +65664,7 @@
 Inform the [link asio.reference.io_context `io_context`] that some work is no longer outstanding. 
 
 
-  void on_work_finished();
+  void on_work_finished() const;
 
 
 This function is used to inform the [link asio.reference.io_context `io_context`] that some work has finished. Once the count of unfinished work reaches zero, the [link asio.reference.io_context `io_context`] is stopped and the `run()` and `run_one()` functions may exit. 
@@ -71820,7 +65680,7 @@
 Inform the [link asio.reference.io_context `io_context`] that it has some outstanding work to do. 
 
 
-  void on_work_started();
+  void on_work_started() const;
 
 
 This function is used to inform the [link asio.reference.io_context `io_context`] that some work has begun. This ensures that the io\_context's `run()` and `run_one()` functions do not exit while the work is underway. 
@@ -71889,7 +65749,7 @@
       typename Allocator>
   void post(
       Function && f,
-      const Allocator & a);
+      const Allocator & a) const;
 
 
 This function is used to ask the [link asio.reference.io_context `io_context`] to execute the given function object. The function object will never be executed inside `post()`. Instead, it will be scheduled to run on the [link asio.reference.io_context `io_context`].
@@ -72885,6 +66745,283 @@
 
 [endsect]
 
+
+[section:io_service io_service]
+
+[indexterm1 io_service] 
+Typedef for backwards compatibility. 
+
+
+  typedef io_context io_service;
+
+
+[heading Types]
+[table
+  [[Name][Description]]
+
+  [
+
+    [[link asio.reference.io_context__executor_type [*executor_type]]]
+    [Executor used to submit functions to an io_context. ]
+  
+  ]
+
+  [
+
+    [[link asio.reference.io_context__service [*service]]]
+    [Base class for all io_context services. ]
+  
+  ]
+
+  [
+
+    [[link asio.reference.io_context__strand [*strand]]]
+    [Provides serialised handler execution. ]
+  
+  ]
+
+  [
+
+    [[link asio.reference.io_context__work [*work]]]
+    [(Deprecated: Use executor_work_guard.) Class to inform the io_context when it has work to do. ]
+  
+  ]
+
+  [
+
+    [[link asio.reference.io_context.fork_event [*fork_event]]]
+    [Fork-related event notifications. ]
+  
+  ]
+
+]
+
+[heading Member Functions]
+[table
+  [[Name][Description]]
+
+  [
+    [[link asio.reference.io_context.dispatch [*dispatch]]]
+    [(Deprecated: Use asio::dispatch().) Request the io_context to invoke the given handler. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context.get_executor [*get_executor]]]
+    [Obtains the executor associated with the io_context. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context.io_context [*io_context]]]
+    [Constructor. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context.notify_fork [*notify_fork]]]
+    [Notify the execution_context of a fork-related event. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context.poll [*poll]]]
+    [Run the io_context object's event processing loop to execute ready handlers. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context.poll_one [*poll_one]]]
+    [Run the io_context object's event processing loop to execute one ready handler. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context.post [*post]]]
+    [(Deprecated: Use asio::post().) Request the io_context to invoke the given handler and return immediately. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context.reset [*reset]]]
+    [(Deprecated: Use restart().) Reset the io_context in preparation for a subsequent run() invocation. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context.restart [*restart]]]
+    [Restart the io_context in preparation for a subsequent run() invocation. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context.run [*run]]]
+    [Run the io_context object's event processing loop. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context.run_one [*run_one]]]
+    [Run the io_context object's event processing loop to execute at most one handler. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context.stop [*stop]]]
+    [Stop the io_context object's event processing loop. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context.stopped [*stopped]]]
+    [Determine whether the io_context object has been stopped. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context.wrap [*wrap]]]
+    [(Deprecated: Use asio::bind_executor().) Create a new handler that automatically dispatches the wrapped handler on the io_context. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context._io_context [*~io_context]]]
+    [Destructor. ]
+  ]
+  
+]
+
+[heading Protected Member Functions]
+[table
+  [[Name][Description]]
+
+  [
+    [[link asio.reference.io_context.destroy [*destroy]]]
+    [Destroys all services in the context. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context.shutdown [*shutdown]]]
+    [Shuts down all services in the context. ]
+  ]
+  
+]
+
+[heading Friends]
+[table
+  [[Name][Description]]
+
+  [
+    [[link asio.reference.io_context.add_service [*add_service]]]
+    [(Deprecated: Use make_service().) Add a service object to the execution_context. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context.has_service [*has_service]]]
+    [Determine if an execution_context contains a specified service type. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context.make_service [*make_service]]]
+    [Creates a service object and adds it to the execution_context. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context.use_service [*use_service]]]
+    [
+
+     Obtain the service object corresponding to the given type. ]
+  ]
+  
+]
+
+The [link asio.reference.io_context `io_context`] class provides the core I/O functionality for users of the asynchronous I/O objects, including:
+
+
+* `asio::ip::tcp::socket` 
+
+* `asio::ip::tcp::acceptor` 
+
+* `asio::ip::udp::socket` 
+
+* [link asio.reference.deadline_timer `deadline_timer`].
+
+The [link asio.reference.io_context `io_context`] class also includes facilities intended for developers of custom asynchronous services.
+
+
+[heading Thread Safety]
+  
+['Distinct] ['objects:] Safe.
+
+['Shared] ['objects:] Safe, with the specific exceptions of the `restart()` and `notify_fork()` functions. Calling `restart()` while there are unfinished `run()`, `run_one()`, `poll()` or `poll_one()` calls results in undefined behaviour. The `notify_fork()` function should not be called while any [link asio.reference.io_context `io_context`] function, or any function on an I/O object that is associated with the [link asio.reference.io_context `io_context`], is being called in another thread.
+
+
+
+[heading Synchronous and asynchronous operations]
+  
+
+
+Synchronous operations on I/O objects implicitly run the [link asio.reference.io_context `io_context`] object for an individual operation. The [link asio.reference.io_context `io_context`] functions `run()`, `run_one()`, `poll()` or `poll_one()` must be called for the [link asio.reference.io_context `io_context`] to perform asynchronous operations on behalf of a C++ program. Notification that an asynchronous operation has completed is delivered by invocation of the associated handler. Handlers are invoked only by a thread that is currently calling any overload of `run()`, `run_one()`, `poll()` or `poll_one()` for the [link asio.reference.io_context `io_context`].
+
+
+[heading Effect of exceptions thrown from handlers]
+  
+
+
+If an exception is thrown from a handler, the exception is allowed to propagate through the throwing thread's invocation of `run()`, `run_one()`, `poll()` or `poll_one()`. No other threads that are calling any of these functions are affected. It is then the responsibility of the application to catch the exception.
+
+After the exception has been caught, the `run()`, `run_one()`, `poll()` or `poll_one()` call may be restarted ['without] the need for an intervening call to `restart()`. This allows the thread to rejoin the [link asio.reference.io_context `io_context`] object's thread pool without impacting any other threads in the pool.
+
+For example:
+
+
+
+   asio::io_context io_context;
+   ...
+   for (;;)
+   {
+     try
+     {
+       io_context.run();
+       break; // run() exited normally
+     }
+     catch (my_exception& e)
+     {
+       // Deal with exception as appropriate.
+     }
+   }
+
+
+
+
+
+[heading Stopping the io_context from running out of work]
+  
+
+
+Some applications may need to prevent an [link asio.reference.io_context `io_context`] object's `run()` call from returning when there is no more work to do. For example, the [link asio.reference.io_context `io_context`] may be being run in a background thread that is launched prior to the application's asynchronous operations. The `run()` call may be kept running by creating an object of type [link asio.reference.io_context__work `io_context::work`]:
+
+
+
+   asio::io_context io_context;
+   asio::io_context::work work(io_context);
+   ... 
+
+
+
+
+To effect a shutdown, the application will then need to call the [link asio.reference.io_context `io_context`] object's `stop()` member function. This will cause the [link asio.reference.io_context `io_context`] `run()` call to return as soon as possible, abandoning unfinished operations and without permitting ready handlers to be dispatched.
+
+Alternatively, if the application requires that all operations and handlers be allowed to finish normally, the work object may be explicitly destroyed.
+
+
+
+   asio::io_context io_context;
+   auto_ptr<asio::io_context::work> work(
+       new asio::io_context::work(io_context));
+   ...
+   work.reset(); // Allow run() to exit. 
+
+
+
+
+
+[heading Requirements]
+
+['Header: ][^asio/io_service.hpp]
+
+['Convenience header: ][^asio.hpp]
+
+
+[endsect]
+
+
 [section:ip__address ip::address]
 
 
@@ -80521,10 +74658,8 @@
 
 
   template<
-      typename ``[link asio.reference.InternetProtocol InternetProtocol]``,
-      typename ``[link asio.reference.ResolverService ResolverService]`` = resolver_service<InternetProtocol>>
+      typename ``[link asio.reference.InternetProtocol InternetProtocol]``>
   class basic_resolver :
-    public basic_io_object< ResolverService >,
     public ip::resolver_base
 
 
@@ -80555,13 +74690,6 @@
 
   [
 
-    [[link asio.reference.ip__basic_resolver.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.ip__basic_resolver.iterator [*iterator]]]
     [(Deprecated.) The iterator type. ]
   
@@ -80588,13 +74716,6 @@
   
   ]
 
-  [
-
-    [[link asio.reference.ip__basic_resolver.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
 ]
 
 [heading Member Functions]
@@ -80644,20 +74765,9 @@
      Perform reverse resolution of an endpoint to a list of entries. ]
   ]
   
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
   [
-    [[link asio.reference.ip__basic_resolver.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.ip__basic_resolver.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
+    [[link asio.reference.ip__basic_resolver._basic_resolver [*~basic_resolver]]]
+    [Destroys the resolver. ]
   ]
   
 ]
@@ -81204,14 +75314,11 @@
 
 [section:executor_type ip::basic_resolver::executor_type]
 
-
-['Inherited from basic_io_object.]
-
 [indexterm2 executor_type..ip::basic_resolver] 
 The type of the executor associated with the object. 
 
 
-  typedef asio::io_context::executor_type executor_type;
+  typedef io_context::executor_type executor_type;
 
 
 [heading Member Functions]
@@ -81309,9 +75416,6 @@
 
 [section:get_executor ip::basic_resolver::get_executor]
 
-
-['Inherited from basic_io_object.]
-
 [indexterm2 get_executor..ip::basic_resolver] 
 Get the executor associated with the object. 
 
@@ -81323,60 +75427,9 @@
 [endsect]
 
 
-[section:get_implementation ip::basic_resolver::get_implementation]
-
-[indexterm2 get_implementation..ip::basic_resolver] 
-Get the underlying implementation of the I/O object. 
-
-
-  implementation_type & ``[link asio.reference.ip__basic_resolver.get_implementation.overload1 get_implementation]``();
-  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.get_implementation.overload1 more...]]``
-
-  const implementation_type & ``[link asio.reference.ip__basic_resolver.get_implementation.overload2 get_implementation]``() const;
-  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.get_implementation.overload2 more...]]``
-
-
-[section:overload1 ip::basic_resolver::get_implementation (1 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the underlying implementation of the I/O object. 
-
-
-  implementation_type & get_implementation();
-
-
-
-[endsect]
-
-
-
-[section:overload2 ip::basic_resolver::get_implementation (2 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the underlying implementation of the I/O object. 
-
-
-  const implementation_type & get_implementation() const;
-
-
-
-[endsect]
-
-
-[endsect]
-
 
 [section:get_io_context ip::basic_resolver::get_io_context]
 
-
-['Inherited from basic_io_object.]
-
 [indexterm2 get_io_context..ip::basic_resolver] 
 (Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
 
@@ -81400,9 +75453,6 @@
 
 [section:get_io_service ip::basic_resolver::get_io_service]
 
-
-['Inherited from basic_io_object.]
-
 [indexterm2 get_io_service..ip::basic_resolver] 
 (Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
 
@@ -81423,78 +75473,6 @@
 [endsect]
 
 
-[section:get_service ip::basic_resolver::get_service]
-
-[indexterm2 get_service..ip::basic_resolver] 
-Get the service associated with the I/O object. 
-
-
-  service_type & ``[link asio.reference.ip__basic_resolver.get_service.overload1 get_service]``();
-  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.get_service.overload1 more...]]``
-
-  const service_type & ``[link asio.reference.ip__basic_resolver.get_service.overload2 get_service]``() const;
-  ``  [''''&raquo;''' [link asio.reference.ip__basic_resolver.get_service.overload2 more...]]``
-
-
-[section:overload1 ip::basic_resolver::get_service (1 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the service associated with the I/O object. 
-
-
-  service_type & get_service();
-
-
-
-[endsect]
-
-
-
-[section:overload2 ip::basic_resolver::get_service (2 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the service associated with the I/O object. 
-
-
-  const service_type & get_service() const;
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:implementation_type ip::basic_resolver::implementation_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 implementation_type..ip::basic_resolver] 
-The underlying implementation type of I/O object. 
-
-
-  typedef service_type::implementation_type implementation_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/ip/basic_resolver.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
 
 [section:iterator ip::basic_resolver::iterator]
 
@@ -82784,30 +76762,6 @@
 
 
 
-[section:service_type ip::basic_resolver::service_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 service_type..ip::basic_resolver] 
-The type of the service that will be used to provide I/O operations. 
-
-
-  typedef ResolverService service_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/ip/basic_resolver.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
 [section:v4_mapped ip::basic_resolver::v4_mapped]
 
 
@@ -82825,6 +76779,22 @@
 
 
 
+[section:_basic_resolver ip::basic_resolver::~basic_resolver]
+
+[indexterm2 ~basic_resolver..ip::basic_resolver] 
+Destroys the resolver. 
+
+
+  ~basic_resolver();
+
+
+This function destroys the resolver, cancelling any outstanding asynchronous wait operations associated with the resolver as if by calling `cancel`. 
+
+
+[endsect]
+
+
+
 [endsect]
 
 [section:ip__basic_resolver_entry ip::basic_resolver_entry]
@@ -86313,13 +80283,6 @@
 
   [
 
-    [[link asio.reference.ip__basic_resolver.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.ip__basic_resolver.iterator [*iterator]]]
     [(Deprecated.) The iterator type. ]
   
@@ -86346,13 +80309,6 @@
   
   ]
 
-  [
-
-    [[link asio.reference.ip__basic_resolver.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
 ]
 
 [heading Member Functions]
@@ -86402,20 +80358,9 @@
      Perform reverse resolution of an endpoint to a list of entries. ]
   ]
   
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
   [
-    [[link asio.reference.ip__basic_resolver.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.ip__basic_resolver.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
+    [[link asio.reference.ip__basic_resolver._basic_resolver [*~basic_resolver]]]
+    [Destroys the resolver. ]
   ]
   
 ]
@@ -86548,13 +80493,6 @@
 
   [
 
-    [[link asio.reference.basic_raw_socket.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_raw_socket.keep_alive [*keep_alive]]]
     [Socket option to send keep-alives. ]
   
@@ -86632,13 +80570,6 @@
 
   [
 
-    [[link asio.reference.basic_raw_socket.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_raw_socket.shutdown_type [*shutdown_type]]]
     [Different ways a socket may be shutdown. ]
   
@@ -86850,20 +80781,9 @@
     [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
   ]
   
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
   [
-    [[link asio.reference.basic_raw_socket.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_raw_socket.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
+    [[link asio.reference.basic_raw_socket._basic_raw_socket [*~basic_raw_socket]]]
+    [Destroys the socket. ]
   ]
   
 ]
@@ -88683,987 +82603,6 @@
 
 [endsect]
 
-[section:ip__resolver_service ip::resolver_service]
-
-
-Default service implementation for a resolver. 
-
-
-  template<
-      typename ``[link asio.reference.InternetProtocol InternetProtocol]``>
-  class resolver_service :
-    public io_context::service
-
-
-[heading Types]
-[table
-  [[Name][Description]]
-
-  [
-
-    [[link asio.reference.ip__resolver_service.endpoint_type [*endpoint_type]]]
-    [The endpoint type. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.ip__resolver_service.implementation_type [*implementation_type]]]
-    [The type of a resolver implementation. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.ip__resolver_service.iterator_type [*iterator_type]]]
-    [The iterator type. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.ip__resolver_service.protocol_type [*protocol_type]]]
-    [The protocol type. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.ip__resolver_service.query_type [*query_type]]]
-    [The query type. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.ip__resolver_service.results_type [*results_type]]]
-    [The results type. ]
-  
-  ]
-
-]
-
-[heading Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.ip__resolver_service.async_resolve [*async_resolve]]]
-    [Asynchronously resolve a query to a list of entries. 
-
-     Asynchronously resolve an endpoint to a list of entries. ]
-  ]
-  
-  [
-    [[link asio.reference.ip__resolver_service.cancel [*cancel]]]
-    [Cancel pending asynchronous operations. ]
-  ]
-  
-  [
-    [[link asio.reference.ip__resolver_service.construct [*construct]]]
-    [Construct a new resolver implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.ip__resolver_service.destroy [*destroy]]]
-    [Destroy a resolver implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.ip__resolver_service.get_io_context [*get_io_context]]]
-    [Get the io_context object that owns the service. ]
-  ]
-  
-  [
-    [[link asio.reference.ip__resolver_service.get_io_service [*get_io_service]]]
-    [Get the io_context object that owns the service. ]
-  ]
-  
-  [
-    [[link asio.reference.ip__resolver_service.resolve [*resolve]]]
-    [Resolve a query to a list of entries. 
-
-     Resolve an endpoint to a list of entries. ]
-  ]
-  
-  [
-    [[link asio.reference.ip__resolver_service.resolver_service [*resolver_service]]]
-    [Construct a new resolver service for the specified io_context. ]
-  ]
-  
-]
-
-[heading Data Members]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.ip__resolver_service.id [*id]]]
-    [The unique service identifier. ]
-  ]
-
-]
-
-[heading Requirements]
-
-['Header: ][^asio/ip/resolver_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-[section:async_resolve ip::resolver_service::async_resolve]
-
-[indexterm2 async_resolve..ip::resolver_service] 
-Asynchronously resolve a query to a list of entries. 
-
-
-  template<
-      typename ``[link asio.reference.ResolveHandler ResolveHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.ip__resolver_service.async_resolve.overload1 async_resolve]``(
-      implementation_type & impl,
-      const query_type & query,
-      ResolveHandler && handler);
-  ``  [''''&raquo;''' [link asio.reference.ip__resolver_service.async_resolve.overload1 more...]]``
-
-
-Asynchronously resolve an endpoint to a list of entries. 
-
-
-  template<
-      typename ``[link asio.reference.ResolveHandler ResolveHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` ``[link asio.reference.ip__resolver_service.async_resolve.overload2 async_resolve]``(
-      implementation_type & impl,
-      const endpoint_type & endpoint,
-      ResolveHandler && handler);
-  ``  [''''&raquo;''' [link asio.reference.ip__resolver_service.async_resolve.overload2 more...]]``
-
-
-[section:overload1 ip::resolver_service::async_resolve (1 of 2 overloads)]
-
-
-Asynchronously resolve a query to a list of entries. 
-
-
-  template<
-      typename ``[link asio.reference.ResolveHandler ResolveHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_resolve(
-      implementation_type & impl,
-      const query_type & query,
-      ResolveHandler && handler);
-
-
-
-[endsect]
-
-
-
-[section:overload2 ip::resolver_service::async_resolve (2 of 2 overloads)]
-
-
-Asynchronously resolve an endpoint to a list of entries. 
-
-
-  template<
-      typename ``[link asio.reference.ResolveHandler ResolveHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_resolve(
-      implementation_type & impl,
-      const endpoint_type & endpoint,
-      ResolveHandler && handler);
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:cancel ip::resolver_service::cancel]
-
-[indexterm2 cancel..ip::resolver_service] 
-Cancel pending asynchronous operations. 
-
-
-  void cancel(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:construct ip::resolver_service::construct]
-
-[indexterm2 construct..ip::resolver_service] 
-Construct a new resolver implementation. 
-
-
-  void construct(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:destroy ip::resolver_service::destroy]
-
-[indexterm2 destroy..ip::resolver_service] 
-Destroy a resolver implementation. 
-
-
-  void destroy(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:endpoint_type ip::resolver_service::endpoint_type]
-
-[indexterm2 endpoint_type..ip::resolver_service] 
-The endpoint type. 
-
-
-  typedef InternetProtocol::endpoint endpoint_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/ip/resolver_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:get_io_context ip::resolver_service::get_io_context]
-
-
-['Inherited from io_context.]
-
-[indexterm2 get_io_context..ip::resolver_service] 
-Get the [link asio.reference.io_context `io_context`] object that owns the service. 
-
-
-  asio::io_context & get_io_context();
-
-
-
-[endsect]
-
-
-
-[section:get_io_service ip::resolver_service::get_io_service]
-
-
-['Inherited from io_context.]
-
-[indexterm2 get_io_service..ip::resolver_service] 
-Get the [link asio.reference.io_context `io_context`] object that owns the service. 
-
-
-  asio::io_context & get_io_service();
-
-
-
-[endsect]
-
-
-
-[section:id ip::resolver_service::id]
-
-[indexterm2 id..ip::resolver_service] 
-The unique service identifier. 
-
-
-  static asio::io_context::id id;
-
-
-
-[endsect]
-
-
-
-[section:implementation_type ip::resolver_service::implementation_type]
-
-[indexterm2 implementation_type..ip::resolver_service] 
-The type of a resolver implementation. 
-
-
-  typedef implementation_defined implementation_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/ip/resolver_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:iterator_type ip::resolver_service::iterator_type]
-
-[indexterm2 iterator_type..ip::resolver_service] 
-The iterator type. 
-
-
-  typedef basic_resolver_iterator< InternetProtocol > iterator_type;
-
-
-[heading Types]
-[table
-  [[Name][Description]]
-
-  [
-
-    [[link asio.reference.ip__basic_resolver_iterator.difference_type [*difference_type]]]
-    [The type used for the distance between two iterators. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.ip__basic_resolver_iterator.iterator_category [*iterator_category]]]
-    [The iterator category. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.ip__basic_resolver_iterator.pointer [*pointer]]]
-    [The type of the result of applying operator->() to the iterator. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.ip__basic_resolver_iterator.reference [*reference]]]
-    [The type of the result of applying operator*() to the iterator. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.ip__basic_resolver_iterator.value_type [*value_type]]]
-    [The type of the value pointed to by the iterator. ]
-  
-  ]
-
-]
-
-[heading Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.ip__basic_resolver_iterator.basic_resolver_iterator [*basic_resolver_iterator]]]
-    [Default constructor creates an end iterator. 
-
-     Copy constructor. 
-
-     Move constructor. ]
-  ]
-  
-  [
-    [[link asio.reference.ip__basic_resolver_iterator.operator__star_ [*operator *]]]
-    [Dereference an iterator. ]
-  ]
-  
-  [
-    [[link asio.reference.ip__basic_resolver_iterator.operator_plus__plus_ [*operator++]]]
-    [Increment operator (prefix). 
-
-     Increment operator (postfix). ]
-  ]
-  
-  [
-    [[link asio.reference.ip__basic_resolver_iterator.operator_arrow_ [*operator->]]]
-    [Dereference an iterator. ]
-  ]
-  
-  [
-    [[link asio.reference.ip__basic_resolver_iterator.operator_eq_ [*operator=]]]
-    [Assignment operator. 
-
-     Move-assignment operator. ]
-  ]
-  
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.ip__basic_resolver_iterator.dereference [*dereference]]]
-    []
-  ]
-  
-  [
-    [[link asio.reference.ip__basic_resolver_iterator.equal [*equal]]]
-    []
-  ]
-  
-  [
-    [[link asio.reference.ip__basic_resolver_iterator.increment [*increment]]]
-    []
-  ]
-  
-]
-
-[heading Protected Data Members]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.ip__basic_resolver_iterator.index_ [*index_]]]
-    []
-  ]
-
-  [
-    [[link asio.reference.ip__basic_resolver_iterator.values_ [*values_]]]
-    []
-  ]
-
-]
-
-[heading Friends]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.ip__basic_resolver_iterator.operator_not__eq_ [*operator!=]]]
-    [Test two iterators for inequality. ]
-  ]
-  
-  [
-    [[link asio.reference.ip__basic_resolver_iterator.operator_eq__eq_ [*operator==]]]
-    [Test two iterators for equality. ]
-  ]
-  
-]
-
-The [link asio.reference.ip__basic_resolver_iterator `ip::basic_resolver_iterator`] class template is used to define iterators over the results returned by a resolver.
-
-The iterator's value\_type, obtained when the iterator is dereferenced, is: 
-
-   const basic_resolver_entry<InternetProtocol> 
-
-
-
-
-
-[heading Thread Safety]
-  
-['Distinct] ['objects:] Safe.
-
-['Shared] ['objects:] Unsafe. 
-
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/ip/resolver_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:protocol_type ip::resolver_service::protocol_type]
-
-[indexterm2 protocol_type..ip::resolver_service] 
-The protocol type. 
-
-
-  typedef InternetProtocol protocol_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/ip/resolver_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:query_type ip::resolver_service::query_type]
-
-[indexterm2 query_type..ip::resolver_service] 
-The query type. 
-
-
-  typedef basic_resolver_query< InternetProtocol > query_type;
-
-
-[heading Types]
-[table
-  [[Name][Description]]
-
-  [
-
-    [[link asio.reference.ip__basic_resolver_query.flags [*flags]]]
-    [A bitmask type (C++ Std \[lib.bitmask.types\]). ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.ip__basic_resolver_query.protocol_type [*protocol_type]]]
-    [The protocol type associated with the endpoint query. ]
-  
-  ]
-
-]
-
-[heading Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.ip__basic_resolver_query.basic_resolver_query [*basic_resolver_query]]]
-    [Construct with specified service name for any protocol. 
-
-     Construct with specified service name for a given protocol. 
-
-     Construct with specified host name and service name for any protocol. 
-
-     Construct with specified host name and service name for a given protocol. ]
-  ]
-  
-  [
-    [[link asio.reference.ip__basic_resolver_query.hints [*hints]]]
-    [Get the hints associated with the query. ]
-  ]
-  
-  [
-    [[link asio.reference.ip__basic_resolver_query.host_name [*host_name]]]
-    [Get the host name associated with the query. ]
-  ]
-  
-  [
-    [[link asio.reference.ip__basic_resolver_query.service_name [*service_name]]]
-    [Get the service name associated with the query. ]
-  ]
-  
-]
-
-[heading Data Members]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.ip__basic_resolver_query.address_configured [*address_configured]]]
-    [Only return IPv4 addresses if a non-loopback IPv4 address is configured for the system. Only return IPv6 addresses if a non-loopback IPv6 address is configured for the system. ]
-  ]
-
-  [
-    [[link asio.reference.ip__basic_resolver_query.all_matching [*all_matching]]]
-    [If used with v4_mapped, return all matching IPv6 and IPv4 addresses. ]
-  ]
-
-  [
-    [[link asio.reference.ip__basic_resolver_query.canonical_name [*canonical_name]]]
-    [Determine the canonical name of the host specified in the query. ]
-  ]
-
-  [
-    [[link asio.reference.ip__basic_resolver_query.numeric_host [*numeric_host]]]
-    [Host name should be treated as a numeric string defining an IPv4 or IPv6 address and no name resolution should be attempted. ]
-  ]
-
-  [
-    [[link asio.reference.ip__basic_resolver_query.numeric_service [*numeric_service]]]
-    [Service name should be treated as a numeric string defining a port number and no name resolution should be attempted. ]
-  ]
-
-  [
-    [[link asio.reference.ip__basic_resolver_query.passive [*passive]]]
-    [Indicate that returned endpoint is intended for use as a locally bound socket endpoint. ]
-  ]
-
-  [
-    [[link asio.reference.ip__basic_resolver_query.v4_mapped [*v4_mapped]]]
-    [If the query protocol family is specified as IPv6, return IPv4-mapped IPv6 addresses on finding no IPv6 addresses. ]
-  ]
-
-]
-
-The [link asio.reference.ip__basic_resolver_query `ip::basic_resolver_query`] class template describes a query that can be passed to a resolver.
-
-
-[heading Thread Safety]
-  
-['Distinct] ['objects:] Safe.
-
-['Shared] ['objects:] Unsafe. 
-
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/ip/resolver_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-[section:resolve ip::resolver_service::resolve]
-
-[indexterm2 resolve..ip::resolver_service] 
-Resolve a query to a list of entries. 
-
-
-  results_type ``[link asio.reference.ip__resolver_service.resolve.overload1 resolve]``(
-      implementation_type & impl,
-      const query_type & query,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.ip__resolver_service.resolve.overload1 more...]]``
-
-
-Resolve an endpoint to a list of entries. 
-
-
-  results_type ``[link asio.reference.ip__resolver_service.resolve.overload2 resolve]``(
-      implementation_type & impl,
-      const endpoint_type & endpoint,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.ip__resolver_service.resolve.overload2 more...]]``
-
-
-[section:overload1 ip::resolver_service::resolve (1 of 2 overloads)]
-
-
-Resolve a query to a list of entries. 
-
-
-  results_type resolve(
-      implementation_type & impl,
-      const query_type & query,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:overload2 ip::resolver_service::resolve (2 of 2 overloads)]
-
-
-Resolve an endpoint to a list of entries. 
-
-
-  results_type resolve(
-      implementation_type & impl,
-      const endpoint_type & endpoint,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:resolver_service ip::resolver_service::resolver_service]
-
-[indexterm2 resolver_service..ip::resolver_service] 
-Construct a new resolver service for the specified [link asio.reference.io_context `io_context`]. 
-
-
-  resolver_service(
-      asio::io_context & io_context);
-
-
-
-[endsect]
-
-
-
-[section:results_type ip::resolver_service::results_type]
-
-[indexterm2 results_type..ip::resolver_service] 
-The results type. 
-
-
-  typedef basic_resolver_results< InternetProtocol > results_type;
-
-
-[heading Types]
-[table
-  [[Name][Description]]
-
-  [
-
-    [[link asio.reference.ip__basic_resolver_results.const_iterator [*const_iterator]]]
-    [The type of an iterator into the range. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.ip__basic_resolver_results.const_reference [*const_reference]]]
-    [The type of a const reference to a value in the range. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.ip__basic_resolver_results.difference_type [*difference_type]]]
-    [Type used to represent the distance between two iterators in the range. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.ip__basic_resolver_results.endpoint_type [*endpoint_type]]]
-    [The endpoint type associated with the results. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.ip__basic_resolver_results.iterator [*iterator]]]
-    [The type of an iterator into the range. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.ip__basic_resolver_results.iterator_category [*iterator_category]]]
-    [The iterator category. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.ip__basic_resolver_results.pointer [*pointer]]]
-    [The type of the result of applying operator->() to the iterator. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.ip__basic_resolver_results.protocol_type [*protocol_type]]]
-    [The protocol type associated with the results. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.ip__basic_resolver_results.reference [*reference]]]
-    [The type of a non-const reference to a value in the range. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.ip__basic_resolver_results.size_type [*size_type]]]
-    [Type used to represent a count of the elements in the range. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.ip__basic_resolver_results.value_type [*value_type]]]
-    [The type of a value in the results range. ]
-  
-  ]
-
-]
-
-[heading Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.ip__basic_resolver_results.basic_resolver_results [*basic_resolver_results]]]
-    [Default constructor creates an empty range. 
-
-     Copy constructor. 
-
-     Move constructor. ]
-  ]
-  
-  [
-    [[link asio.reference.ip__basic_resolver_results.begin [*begin]]]
-    [Obtain a begin iterator for the results range. ]
-  ]
-  
-  [
-    [[link asio.reference.ip__basic_resolver_results.cbegin [*cbegin]]]
-    [Obtain a begin iterator for the results range. ]
-  ]
-  
-  [
-    [[link asio.reference.ip__basic_resolver_results.cend [*cend]]]
-    [Obtain an end iterator for the results range. ]
-  ]
-  
-  [
-    [[link asio.reference.ip__basic_resolver_results.empty [*empty]]]
-    [Determine whether the results range is empty. ]
-  ]
-  
-  [
-    [[link asio.reference.ip__basic_resolver_results.end [*end]]]
-    [Obtain an end iterator for the results range. ]
-  ]
-  
-  [
-    [[link asio.reference.ip__basic_resolver_results.max_size [*max_size]]]
-    [Get the maximum number of entries permitted in a results range. ]
-  ]
-  
-  [
-    [[link asio.reference.ip__basic_resolver_results.operator__star_ [*operator *]]]
-    [Dereference an iterator. ]
-  ]
-  
-  [
-    [[link asio.reference.ip__basic_resolver_results.operator_plus__plus_ [*operator++]]]
-    [Increment operator (prefix). 
-
-     Increment operator (postfix). ]
-  ]
-  
-  [
-    [[link asio.reference.ip__basic_resolver_results.operator_arrow_ [*operator->]]]
-    [Dereference an iterator. ]
-  ]
-  
-  [
-    [[link asio.reference.ip__basic_resolver_results.operator_eq_ [*operator=]]]
-    [Assignment operator. 
-
-     Move-assignment operator. ]
-  ]
-  
-  [
-    [[link asio.reference.ip__basic_resolver_results.size [*size]]]
-    [Get the number of entries in the results range. ]
-  ]
-  
-  [
-    [[link asio.reference.ip__basic_resolver_results.swap [*swap]]]
-    [Swap the results range with another. ]
-  ]
-  
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.ip__basic_resolver_results.dereference [*dereference]]]
-    []
-  ]
-  
-  [
-    [[link asio.reference.ip__basic_resolver_results.equal [*equal]]]
-    []
-  ]
-  
-  [
-    [[link asio.reference.ip__basic_resolver_results.increment [*increment]]]
-    []
-  ]
-  
-]
-
-[heading Protected Data Members]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.ip__basic_resolver_results.index_ [*index_]]]
-    []
-  ]
-
-  [
-    [[link asio.reference.ip__basic_resolver_results.values_ [*values_]]]
-    []
-  ]
-
-]
-
-[heading Friends]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.ip__basic_resolver_results.operator_not__eq_ [*operator!=]]]
-    [Test two iterators for inequality. ]
-  ]
-  
-  [
-    [[link asio.reference.ip__basic_resolver_results.operator_eq__eq_ [*operator==]]]
-    [Test two iterators for equality. ]
-  ]
-  
-]
-
-The [link asio.reference.ip__basic_resolver_results `ip::basic_resolver_results`] class template is used to define a range over the results returned by a resolver.
-
-The iterator's value\_type, obtained when a results iterator is dereferenced, is:
-
-   const basic_resolver_entry<InternetProtocol> 
-
-
-
-
-
-[heading Remarks]
-      
-For backward compatibility, [link asio.reference.ip__basic_resolver_results `ip::basic_resolver_results`] is derived from [link asio.reference.ip__basic_resolver_iterator `ip::basic_resolver_iterator`]. This derivation is deprecated.
-
-
-[heading Thread Safety]
-  
-['Distinct] ['objects:] Safe.
-
-['Shared] ['objects:] Unsafe. 
-
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/ip/resolver_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[endsect]
-
 [section:ip__tcp ip::tcp]
 
 
@@ -89851,13 +82790,6 @@
 
   [
 
-    [[link asio.reference.basic_socket_acceptor.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_socket_acceptor.keep_alive [*keep_alive]]]
     [Socket option to send keep-alives. ]
   
@@ -89928,13 +82860,6 @@
 
   [
 
-    [[link asio.reference.basic_socket_acceptor.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_socket_acceptor.shutdown_type [*shutdown_type]]]
     [Different ways a socket may be shutdown. ]
   
@@ -90086,20 +83011,9 @@
     [Wait for the acceptor to become ready to read, ready to write, or to have pending error conditions. ]
   ]
   
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
   [
-    [[link asio.reference.basic_socket_acceptor.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_socket_acceptor.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
+    [[link asio.reference.basic_socket_acceptor._basic_socket_acceptor [*~basic_socket_acceptor]]]
+    [Destroys the acceptor. ]
   ]
   
 ]
@@ -90616,13 +83530,6 @@
 
   [
 
-    [[link asio.reference.ip__basic_resolver.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.ip__basic_resolver.iterator [*iterator]]]
     [(Deprecated.) The iterator type. ]
   
@@ -90649,13 +83556,6 @@
   
   ]
 
-  [
-
-    [[link asio.reference.ip__basic_resolver.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
 ]
 
 [heading Member Functions]
@@ -90705,20 +83605,9 @@
      Perform reverse resolution of an endpoint to a list of entries. ]
   ]
   
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
   [
-    [[link asio.reference.ip__basic_resolver.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.ip__basic_resolver.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
+    [[link asio.reference.ip__basic_resolver._basic_resolver [*~basic_resolver]]]
+    [Destroys the resolver. ]
   ]
   
 ]
@@ -90851,13 +83740,6 @@
 
   [
 
-    [[link asio.reference.basic_stream_socket.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_stream_socket.keep_alive [*keep_alive]]]
     [Socket option to send keep-alives. ]
   
@@ -90935,13 +83817,6 @@
 
   [
 
-    [[link asio.reference.basic_stream_socket.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_stream_socket.shutdown_type [*shutdown_type]]]
     [Different ways a socket may be shutdown. ]
   
@@ -91155,20 +84030,9 @@
     [Write some data to the socket. ]
   ]
   
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
   [
-    [[link asio.reference.basic_stream_socket.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_stream_socket.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
+    [[link asio.reference.basic_stream_socket._basic_stream_socket [*~basic_stream_socket]]]
+    [Destroys the socket. ]
   ]
   
 ]
@@ -91647,13 +84511,6 @@
 
   [
 
-    [[link asio.reference.ip__basic_resolver.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.ip__basic_resolver.iterator [*iterator]]]
     [(Deprecated.) The iterator type. ]
   
@@ -91680,13 +84537,6 @@
   
   ]
 
-  [
-
-    [[link asio.reference.ip__basic_resolver.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
 ]
 
 [heading Member Functions]
@@ -91736,20 +84586,9 @@
      Perform reverse resolution of an endpoint to a list of entries. ]
   ]
   
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
   [
-    [[link asio.reference.ip__basic_resolver.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.ip__basic_resolver.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
+    [[link asio.reference.ip__basic_resolver._basic_resolver [*~basic_resolver]]]
+    [Destroys the resolver. ]
   ]
   
 ]
@@ -91882,13 +84721,6 @@
 
   [
 
-    [[link asio.reference.basic_datagram_socket.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_datagram_socket.keep_alive [*keep_alive]]]
     [Socket option to send keep-alives. ]
   
@@ -91966,13 +84798,6 @@
 
   [
 
-    [[link asio.reference.basic_datagram_socket.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_datagram_socket.shutdown_type [*shutdown_type]]]
     [Different ways a socket may be shutdown. ]
   
@@ -92184,20 +85009,9 @@
     [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
   ]
   
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
   [
-    [[link asio.reference.basic_datagram_socket.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_datagram_socket.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
+    [[link asio.reference.basic_datagram_socket._basic_datagram_socket [*~basic_datagram_socket]]]
+    [Destroys the socket. ]
   ]
   
 ]
@@ -93336,21 +86150,17 @@
 
     
   template<
-      typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService1]``,
-      typename ``[link asio.reference.SocketService SocketService2]``>
+      typename ``[link asio.reference.Protocol Protocol]``>
   void ``[link asio.reference.local__connect_pair.overload1 connect_pair]``(
-      basic_socket< Protocol, SocketService1 > & socket1,
-      basic_socket< Protocol, SocketService2 > & socket2);
+      basic_socket< Protocol > & socket1,
+      basic_socket< Protocol > & socket2);
   ``  [''''&raquo;''' [link asio.reference.local__connect_pair.overload1 more...]]``
 
   template<
-      typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService1]``,
-      typename ``[link asio.reference.SocketService SocketService2]``>
+      typename ``[link asio.reference.Protocol Protocol]``>
   asio::error_code ``[link asio.reference.local__connect_pair.overload2 connect_pair]``(
-      basic_socket< Protocol, SocketService1 > & socket1,
-      basic_socket< Protocol, SocketService2 > & socket2,
+      basic_socket< Protocol > & socket1,
+      basic_socket< Protocol > & socket2,
       asio::error_code & ec);
   ``  [''''&raquo;''' [link asio.reference.local__connect_pair.overload2 more...]]``
 
@@ -93368,12 +86178,10 @@
 
 
   template<
-      typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService1]``,
-      typename ``[link asio.reference.SocketService SocketService2]``>
+      typename ``[link asio.reference.Protocol Protocol]``>
   void connect_pair(
-      basic_socket< Protocol, SocketService1 > & socket1,
-      basic_socket< Protocol, SocketService2 > & socket2);
+      basic_socket< Protocol > & socket1,
+      basic_socket< Protocol > & socket2);
 
 
 
@@ -93388,12 +86196,10 @@
 
 
   template<
-      typename ``[link asio.reference.Protocol Protocol]``,
-      typename ``[link asio.reference.SocketService SocketService1]``,
-      typename ``[link asio.reference.SocketService SocketService2]``>
+      typename ``[link asio.reference.Protocol Protocol]``>
   asio::error_code connect_pair(
-      basic_socket< Protocol, SocketService1 > & socket1,
-      basic_socket< Protocol, SocketService2 > & socket2,
+      basic_socket< Protocol > & socket1,
+      basic_socket< Protocol > & socket2,
       asio::error_code & ec);
 
 
@@ -93716,13 +86522,6 @@
 
   [
 
-    [[link asio.reference.basic_datagram_socket.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_datagram_socket.keep_alive [*keep_alive]]]
     [Socket option to send keep-alives. ]
   
@@ -93800,13 +86599,6 @@
 
   [
 
-    [[link asio.reference.basic_datagram_socket.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_datagram_socket.shutdown_type [*shutdown_type]]]
     [Different ways a socket may be shutdown. ]
   
@@ -94018,20 +86810,9 @@
     [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
   ]
   
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
   [
-    [[link asio.reference.basic_datagram_socket.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_datagram_socket.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
+    [[link asio.reference.basic_datagram_socket._basic_datagram_socket [*~basic_datagram_socket]]]
+    [Destroys the socket. ]
   ]
   
 ]
@@ -94253,13 +87034,6 @@
 
   [
 
-    [[link asio.reference.basic_socket_acceptor.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_socket_acceptor.keep_alive [*keep_alive]]]
     [Socket option to send keep-alives. ]
   
@@ -94330,13 +87104,6 @@
 
   [
 
-    [[link asio.reference.basic_socket_acceptor.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_socket_acceptor.shutdown_type [*shutdown_type]]]
     [Different ways a socket may be shutdown. ]
   
@@ -94488,20 +87255,9 @@
     [Wait for the acceptor to become ready to read, ready to write, or to have pending error conditions. ]
   ]
   
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
   [
-    [[link asio.reference.basic_socket_acceptor.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_socket_acceptor.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
+    [[link asio.reference.basic_socket_acceptor._basic_socket_acceptor [*~basic_socket_acceptor]]]
+    [Destroys the acceptor. ]
   ]
   
 ]
@@ -94938,13 +87694,6 @@
 
   [
 
-    [[link asio.reference.basic_stream_socket.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_stream_socket.keep_alive [*keep_alive]]]
     [Socket option to send keep-alives. ]
   
@@ -95022,13 +87771,6 @@
 
   [
 
-    [[link asio.reference.basic_stream_socket.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_stream_socket.shutdown_type [*shutdown_type]]]
     [Different ways a socket may be shutdown. ]
   
@@ -95242,20 +87984,9 @@
     [Write some data to the socket. ]
   ]
   
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
   [
-    [[link asio.reference.basic_stream_socket.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_stream_socket.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
+    [[link asio.reference.basic_stream_socket._basic_stream_socket [*~basic_stream_socket]]]
+    [Destroys the socket. ]
   ]
   
 ]
@@ -95492,12 +88223,22 @@
   [[Name][Description]]
 
   [
+    [[link asio.reference.mutable_buffer.data [*data]]]
+    [Get a pointer to the beginning of the memory range. ]
+  ]
+  
+  [
     [[link asio.reference.mutable_buffer.mutable_buffer [*mutable_buffer]]]
     [Construct an empty buffer. 
 
      Construct a buffer to represent a given memory range. ]
   ]
   
+  [
+    [[link asio.reference.mutable_buffer.size [*size]]]
+    [Get the size of the memory range. ]
+  ]
+  
 ]
 
 [heading Related Functions]
@@ -95518,18 +88259,18 @@
   
 
 
-The contents of a buffer may be accessed using the [link asio.reference.buffer_size `buffer_size`]  and [link asio.reference.buffer_cast `buffer_cast`]  functions:
+The contents of a buffer may be accessed using the `data()` and `size()` member functions:
 
 
 
    asio::mutable_buffer b1 = ...;
-   std::size_t s1 = asio::buffer_size(b1);
-   unsigned char* p1 = asio::buffer_cast<unsigned char*>(b1);
+   std::size_t s1 = b1.size();
+   unsigned char* p1 = static_cast<unsigned char*>(b1.data());
 
 
 
 
-The `asio::buffer_cast` function permits violations of type safety, so uses of it in application code should be carefully considered. 
+The `data()` member function permits violations of type safety, so uses of it in application code should be carefully considered. 
 
 [heading Requirements]
 
@@ -95537,6 +88278,20 @@
 
 ['Convenience header: ][^asio.hpp]
 
+
+[section:data mutable_buffer::data]
+
+[indexterm2 data..mutable_buffer] 
+Get a pointer to the beginning of the memory range. 
+
+
+  void * data() const;
+
+
+
+[endsect]
+
+
 [section:mutable_buffer mutable_buffer::mutable_buffer]
 
 [indexterm2 mutable_buffer..mutable_buffer] 
@@ -95638,6 +88393,20 @@
 [endsect]
 
 
+[section:size mutable_buffer::size]
+
+[indexterm2 size..mutable_buffer] 
+Get the size of the memory range. 
+
+
+  std::size_t size() const;
+
+
+
+[endsect]
+
+
+
 [endsect]
 
 [section:mutable_buffers_1 mutable_buffers_1]
@@ -95680,6 +88449,11 @@
   ]
   
   [
+    [[link asio.reference.mutable_buffers_1.data [*data]]]
+    [Get a pointer to the beginning of the memory range. ]
+  ]
+  
+  [
     [[link asio.reference.mutable_buffers_1.end [*end]]]
     [Get a random-access iterator for one past the last element. ]
   ]
@@ -95691,6 +88465,11 @@
      Construct to represent a single modifiable buffer. ]
   ]
   
+  [
+    [[link asio.reference.mutable_buffers_1.size [*size]]]
+    [Get the size of the memory range. ]
+  ]
+  
 ]
 
 [heading Related Functions]
@@ -95746,6 +88525,23 @@
 
 
 
+[section:data mutable_buffers_1::data]
+
+
+['Inherited from mutable_buffer.]
+
+[indexterm2 data..mutable_buffers_1] 
+Get a pointer to the beginning of the memory range. 
+
+
+  void * data() const;
+
+
+
+[endsect]
+
+
+
 [section:end mutable_buffers_1::end]
 
 [indexterm2 end..mutable_buffers_1] 
@@ -95868,6 +88664,23 @@
 [endsect]
 
 
+[section:size mutable_buffers_1::size]
+
+
+['Inherited from mutable_buffer.]
+
+[indexterm2 size..mutable_buffers_1] 
+Get the size of the memory range. 
+
+
+  std::size_t size() const;
+
+
+
+[endsect]
+
+
+
 [section:value_type mutable_buffers_1::value_type]
 
 [indexterm2 value_type..mutable_buffers_1] 
@@ -95882,12 +88695,22 @@
   [[Name][Description]]
 
   [
+    [[link asio.reference.mutable_buffer.data [*data]]]
+    [Get a pointer to the beginning of the memory range. ]
+  ]
+  
+  [
     [[link asio.reference.mutable_buffer.mutable_buffer [*mutable_buffer]]]
     [Construct an empty buffer. 
 
      Construct a buffer to represent a given memory range. ]
   ]
   
+  [
+    [[link asio.reference.mutable_buffer.size [*size]]]
+    [Get the size of the memory range. ]
+  ]
+  
 ]
 
 [heading Related Functions]
@@ -95908,18 +88731,18 @@
   
 
 
-The contents of a buffer may be accessed using the [link asio.reference.buffer_size `buffer_size`]  and [link asio.reference.buffer_cast `buffer_cast`]  functions:
+The contents of a buffer may be accessed using the `data()` and `size()` member functions:
 
 
 
    asio::mutable_buffer b1 = ...;
-   std::size_t s1 = asio::buffer_size(b1);
-   unsigned char* p1 = asio::buffer_cast<unsigned char*>(b1);
+   std::size_t s1 = b1.size();
+   unsigned char* p1 = static_cast<unsigned char*>(b1.data());
 
 
 
 
-The `asio::buffer_cast` function permits violations of type safety, so uses of it in application code should be carefully considered. 
+The `data()` member function permits violations of type safety, so uses of it in application code should be carefully considered. 
 
 
 [heading Requirements]
@@ -96050,12 +88873,22 @@
   [[Name][Description]]
 
   [
+    [[link asio.reference.mutable_buffer.data [*data]]]
+    [Get a pointer to the beginning of the memory range. ]
+  ]
+  
+  [
     [[link asio.reference.mutable_buffer.mutable_buffer [*mutable_buffer]]]
     [Construct an empty buffer. 
 
      Construct a buffer to represent a given memory range. ]
   ]
   
+  [
+    [[link asio.reference.mutable_buffer.size [*size]]]
+    [Get the size of the memory range. ]
+  ]
+  
 ]
 
 [heading Related Functions]
@@ -96076,18 +88909,18 @@
   
 
 
-The contents of a buffer may be accessed using the [link asio.reference.buffer_size `buffer_size`]  and [link asio.reference.buffer_cast `buffer_cast`]  functions:
+The contents of a buffer may be accessed using the `data()` and `size()` member functions:
 
 
 
    asio::mutable_buffer b1 = ...;
-   std::size_t s1 = asio::buffer_size(b1);
-   unsigned char* p1 = asio::buffer_cast<unsigned char*>(b1);
+   std::size_t s1 = b1.size();
+   unsigned char* p1 = static_cast<unsigned char*>(b1.data());
 
 
 
 
-The `asio::buffer_cast` function permits violations of type safety, so uses of it in application code should be carefully considered. 
+The `data()` member function permits violations of type safety, so uses of it in application code should be carefully considered. 
 
 
 [heading Requirements]
@@ -96632,16 +89465,13 @@
 [endsect]
 
 
-[section:posix__basic_descriptor posix::basic_descriptor]
+[section:posix__descriptor posix::descriptor]
 
 
 Provides POSIX descriptor functionality. 
 
 
-  template<
-      typename ``[link asio.reference.DescriptorService DescriptorService]``>
-  class basic_descriptor :
-    public basic_io_object< DescriptorService >,
+  class descriptor :
     public posix::descriptor_base
 
 
@@ -96651,49 +89481,35 @@
 
   [
 
-    [[link asio.reference.posix__basic_descriptor.bytes_readable [*bytes_readable]]]
+    [[link asio.reference.posix__descriptor.bytes_readable [*bytes_readable]]]
     [IO control command to get the amount of data that can be read without blocking. ]
   
   ]
 
   [
 
-    [[link asio.reference.posix__basic_descriptor.executor_type [*executor_type]]]
+    [[link asio.reference.posix__descriptor.executor_type [*executor_type]]]
     [The type of the executor associated with the object. ]
   
   ]
 
   [
 
-    [[link asio.reference.posix__basic_descriptor.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
+    [[link asio.reference.posix__descriptor.lowest_layer_type [*lowest_layer_type]]]
+    [A descriptor is always the lowest layer. ]
   
   ]
 
   [
 
-    [[link asio.reference.posix__basic_descriptor.lowest_layer_type [*lowest_layer_type]]]
-    [A basic_descriptor is always the lowest layer. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.posix__basic_descriptor.native_handle_type [*native_handle_type]]]
+    [[link asio.reference.posix__descriptor.native_handle_type [*native_handle_type]]]
     [The native representation of a descriptor. ]
   
   ]
 
   [
 
-    [[link asio.reference.posix__basic_descriptor.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.posix__basic_descriptor.wait_type [*wait_type]]]
+    [[link asio.reference.posix__descriptor.wait_type [*wait_type]]]
     [Wait types. ]
   
   ]
@@ -96705,97 +89521,97 @@
   [[Name][Description]]
 
   [
-    [[link asio.reference.posix__basic_descriptor.assign [*assign]]]
+    [[link asio.reference.posix__descriptor.assign [*assign]]]
     [Assign an existing native descriptor to the descriptor. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_descriptor.async_wait [*async_wait]]]
+    [[link asio.reference.posix__descriptor.async_wait [*async_wait]]]
     [Asynchronously wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_descriptor.basic_descriptor [*basic_descriptor]]]
-    [Construct a basic_descriptor without opening it. 
-
-     Construct a basic_descriptor on an existing native descriptor. 
-
-     Move-construct a basic_descriptor from another. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_descriptor.cancel [*cancel]]]
+    [[link asio.reference.posix__descriptor.cancel [*cancel]]]
     [Cancel all asynchronous operations associated with the descriptor. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_descriptor.close [*close]]]
+    [[link asio.reference.posix__descriptor.close [*close]]]
     [Close the descriptor. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_descriptor.get_executor [*get_executor]]]
+    [[link asio.reference.posix__descriptor.descriptor [*descriptor]]]
+    [Construct a descriptor without opening it. 
+
+     Construct a descriptor on an existing native descriptor. 
+
+     Move-construct a descriptor from another. ]
+  ]
+  
+  [
+    [[link asio.reference.posix__descriptor.get_executor [*get_executor]]]
     [Get the executor associated with the object. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_descriptor.get_io_context [*get_io_context]]]
+    [[link asio.reference.posix__descriptor.get_io_context [*get_io_context]]]
     [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_descriptor.get_io_service [*get_io_service]]]
+    [[link asio.reference.posix__descriptor.get_io_service [*get_io_service]]]
     [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_descriptor.io_control [*io_control]]]
+    [[link asio.reference.posix__descriptor.io_control [*io_control]]]
     [Perform an IO control command on the descriptor. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_descriptor.is_open [*is_open]]]
+    [[link asio.reference.posix__descriptor.is_open [*is_open]]]
     [Determine whether the descriptor is open. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_descriptor.lowest_layer [*lowest_layer]]]
+    [[link asio.reference.posix__descriptor.lowest_layer [*lowest_layer]]]
     [Get a reference to the lowest layer. 
 
      Get a const reference to the lowest layer. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_descriptor.native_handle [*native_handle]]]
+    [[link asio.reference.posix__descriptor.native_handle [*native_handle]]]
     [Get the native descriptor representation. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_descriptor.native_non_blocking [*native_non_blocking]]]
+    [[link asio.reference.posix__descriptor.native_non_blocking [*native_non_blocking]]]
     [Gets the non-blocking mode of the native descriptor implementation. 
 
      Sets the non-blocking mode of the native descriptor implementation. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_descriptor.non_blocking [*non_blocking]]]
+    [[link asio.reference.posix__descriptor.non_blocking [*non_blocking]]]
     [Gets the non-blocking mode of the descriptor. 
 
      Sets the non-blocking mode of the descriptor. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_descriptor.operator_eq_ [*operator=]]]
-    [Move-assign a basic_descriptor from another. ]
+    [[link asio.reference.posix__descriptor.operator_eq_ [*operator=]]]
+    [Move-assign a descriptor from another. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_descriptor.release [*release]]]
+    [[link asio.reference.posix__descriptor.release [*release]]]
     [Release ownership of the native descriptor implementation. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_descriptor.wait [*wait]]]
+    [[link asio.reference.posix__descriptor.wait [*wait]]]
     [Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. ]
   ]
   
@@ -96806,23 +89622,23 @@
   [[Name][Description]]
 
   [
-    [[link asio.reference.posix__basic_descriptor.get_implementation [*get_implementation]]]
+    [[link asio.reference.posix__descriptor.get_implementation [*get_implementation]]]
     [Get the underlying implementation of the I/O object. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_descriptor.get_service [*get_service]]]
+    [[link asio.reference.posix__descriptor.get_service [*get_service]]]
     [Get the service associated with the I/O object. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_descriptor._basic_descriptor [*~basic_descriptor]]]
+    [[link asio.reference.posix__descriptor._descriptor [*~descriptor]]]
     [Protected destructor to prevent deletion through this type. ]
   ]
   
 ]
 
-The [link asio.reference.posix__basic_descriptor `posix::basic_descriptor`] class template provides the ability to wrap a POSIX descriptor.
+The [link asio.reference.posix__descriptor `posix::descriptor`] class template provides the ability to wrap a POSIX descriptor.
 
 
 [heading Thread Safety]
@@ -96835,27 +89651,27 @@
 
 [heading Requirements]
 
-['Header: ][^asio/posix/basic_descriptor.hpp]
+['Header: ][^asio/posix/descriptor.hpp]
 
 ['Convenience header: ][^asio.hpp]
 
-[section:assign posix::basic_descriptor::assign]
+[section:assign posix::descriptor::assign]
 
-[indexterm2 assign..posix::basic_descriptor] 
+[indexterm2 assign..posix::descriptor] 
 Assign an existing native descriptor to the descriptor. 
 
 
-  void ``[link asio.reference.posix__basic_descriptor.assign.overload1 assign]``(
+  void ``[link asio.reference.posix__descriptor.assign.overload1 assign]``(
       const native_handle_type & native_descriptor);
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.assign.overload1 more...]]``
+  ``  [''''&raquo;''' [link asio.reference.posix__descriptor.assign.overload1 more...]]``
 
-  asio::error_code ``[link asio.reference.posix__basic_descriptor.assign.overload2 assign]``(
+  asio::error_code ``[link asio.reference.posix__descriptor.assign.overload2 assign]``(
       const native_handle_type & native_descriptor,
       asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.assign.overload2 more...]]``
+  ``  [''''&raquo;''' [link asio.reference.posix__descriptor.assign.overload2 more...]]``
 
 
-[section:overload1 posix::basic_descriptor::assign (1 of 2 overloads)]
+[section:overload1 posix::descriptor::assign (1 of 2 overloads)]
 
 
 Assign an existing native descriptor to the descriptor. 
@@ -96870,7 +89686,7 @@
 
 
 
-[section:overload2 posix::basic_descriptor::assign (2 of 2 overloads)]
+[section:overload2 posix::descriptor::assign (2 of 2 overloads)]
 
 
 Assign an existing native descriptor to the descriptor. 
@@ -96888,9 +89704,9 @@
 [endsect]
 
 
-[section:async_wait posix::basic_descriptor::async_wait]
+[section:async_wait posix::descriptor::async_wait]
 
-[indexterm2 async_wait..posix::basic_descriptor] 
+[indexterm2 async_wait..posix::descriptor] 
 Asynchronously wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. 
 
 
@@ -96951,41 +89767,225 @@
 [endsect]
 
 
-[section:basic_descriptor posix::basic_descriptor::basic_descriptor]
 
-[indexterm2 basic_descriptor..posix::basic_descriptor] 
-Construct a [link asio.reference.posix__basic_descriptor `posix::basic_descriptor`] without opening it. 
+[section:bytes_readable posix::descriptor::bytes_readable]
+
+[indexterm2 bytes_readable..posix::descriptor] 
+IO control command to get the amount of data that can be read without blocking. 
 
 
-  explicit ``[link asio.reference.posix__basic_descriptor.basic_descriptor.overload1 basic_descriptor]``(
+  typedef implementation_defined bytes_readable;
+
+
+
+Implements the FIONREAD IO control command.
+
+
+[heading Example]
+  
+
+
+   asio::posix::stream_descriptor descriptor(io_context); 
+   ...
+   asio::descriptor_base::bytes_readable command(true);
+   descriptor.io_control(command);
+   std::size_t bytes_readable = command.get();
+
+
+
+
+
+
+
+[heading Requirements]
+
+['Header: ][^asio/posix/descriptor.hpp]
+
+['Convenience header: ][^asio.hpp]
+
+
+[endsect]
+
+
+[section:cancel posix::descriptor::cancel]
+
+[indexterm2 cancel..posix::descriptor] 
+Cancel all asynchronous operations associated with the descriptor. 
+
+
+  void ``[link asio.reference.posix__descriptor.cancel.overload1 cancel]``();
+  ``  [''''&raquo;''' [link asio.reference.posix__descriptor.cancel.overload1 more...]]``
+
+  asio::error_code ``[link asio.reference.posix__descriptor.cancel.overload2 cancel]``(
+      asio::error_code & ec);
+  ``  [''''&raquo;''' [link asio.reference.posix__descriptor.cancel.overload2 more...]]``
+
+
+[section:overload1 posix::descriptor::cancel (1 of 2 overloads)]
+
+
+Cancel all asynchronous operations associated with the descriptor. 
+
+
+  void cancel();
+
+
+This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[asio::system_error][Thrown on failure. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+
+[section:overload2 posix::descriptor::cancel (2 of 2 overloads)]
+
+
+Cancel all asynchronous operations associated with the descriptor. 
+
+
+  asio::error_code cancel(
+      asio::error_code & ec);
+
+
+This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[ec][Set to indicate what error occurred, if any. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+[endsect]
+
+[section:close posix::descriptor::close]
+
+[indexterm2 close..posix::descriptor] 
+Close the descriptor. 
+
+
+  void ``[link asio.reference.posix__descriptor.close.overload1 close]``();
+  ``  [''''&raquo;''' [link asio.reference.posix__descriptor.close.overload1 more...]]``
+
+  asio::error_code ``[link asio.reference.posix__descriptor.close.overload2 close]``(
+      asio::error_code & ec);
+  ``  [''''&raquo;''' [link asio.reference.posix__descriptor.close.overload2 more...]]``
+
+
+[section:overload1 posix::descriptor::close (1 of 2 overloads)]
+
+
+Close the descriptor. 
+
+
+  void close();
+
+
+This function is used to close the descriptor. Any asynchronous read or write operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[asio::system_error][Thrown on failure. Note that, even if the function indicates an error, the underlying descriptor is closed. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+
+[section:overload2 posix::descriptor::close (2 of 2 overloads)]
+
+
+Close the descriptor. 
+
+
+  asio::error_code close(
+      asio::error_code & ec);
+
+
+This function is used to close the descriptor. Any asynchronous read or write operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[ec][Set to indicate what error occurred, if any. Note that, even if the function indicates an error, the underlying descriptor is closed. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+[endsect]
+
+[section:descriptor posix::descriptor::descriptor]
+
+[indexterm2 descriptor..posix::descriptor] 
+Construct a descriptor without opening it. 
+
+
+  explicit ``[link asio.reference.posix__descriptor.descriptor.overload1 descriptor]``(
       asio::io_context & io_context);
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.basic_descriptor.overload1 more...]]``
+  ``  [''''&raquo;''' [link asio.reference.posix__descriptor.descriptor.overload1 more...]]``
 
 
-Construct a [link asio.reference.posix__basic_descriptor `posix::basic_descriptor`] on an existing native descriptor. 
+Construct a descriptor on an existing native descriptor. 
 
 
-  ``[link asio.reference.posix__basic_descriptor.basic_descriptor.overload2 basic_descriptor]``(
+  ``[link asio.reference.posix__descriptor.descriptor.overload2 descriptor]``(
       asio::io_context & io_context,
       const native_handle_type & native_descriptor);
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.basic_descriptor.overload2 more...]]``
+  ``  [''''&raquo;''' [link asio.reference.posix__descriptor.descriptor.overload2 more...]]``
 
 
-Move-construct a [link asio.reference.posix__basic_descriptor `posix::basic_descriptor`] from another. 
+Move-construct a descriptor from another. 
 
 
-  ``[link asio.reference.posix__basic_descriptor.basic_descriptor.overload3 basic_descriptor]``(
-      basic_descriptor && other);
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.basic_descriptor.overload3 more...]]``
+  ``[link asio.reference.posix__descriptor.descriptor.overload3 descriptor]``(
+      descriptor && other);
+  ``  [''''&raquo;''' [link asio.reference.posix__descriptor.descriptor.overload3 more...]]``
 
 
-[section:overload1 posix::basic_descriptor::basic_descriptor (1 of 3 overloads)]
+[section:overload1 posix::descriptor::descriptor (1 of 3 overloads)]
 
 
-Construct a [link asio.reference.posix__basic_descriptor `posix::basic_descriptor`] without opening it. 
+Construct a descriptor without opening it. 
 
 
-  basic_descriptor(
+  descriptor(
       asio::io_context & io_context);
 
 
@@ -97008,13 +90008,13 @@
 
 
 
-[section:overload2 posix::basic_descriptor::basic_descriptor (2 of 3 overloads)]
+[section:overload2 posix::descriptor::descriptor (2 of 3 overloads)]
 
 
-Construct a [link asio.reference.posix__basic_descriptor `posix::basic_descriptor`] on an existing native descriptor. 
+Construct a descriptor on an existing native descriptor. 
 
 
-  basic_descriptor(
+  descriptor(
       asio::io_context & io_context,
       const native_handle_type & native_descriptor);
 
@@ -97050,14 +90050,14 @@
 
 
 
-[section:overload3 posix::basic_descriptor::basic_descriptor (3 of 3 overloads)]
+[section:overload3 posix::descriptor::descriptor (3 of 3 overloads)]
 
 
-Move-construct a [link asio.reference.posix__basic_descriptor `posix::basic_descriptor`] from another. 
+Move-construct a descriptor from another. 
 
 
-  basic_descriptor(
-      basic_descriptor && other);
+  descriptor(
+      descriptor && other);
 
 
 This constructor moves a descriptor from one object to another.
@@ -97068,14 +90068,14 @@
 
 [variablelist
   
-[[other][The other [link asio.reference.posix__basic_descriptor `posix::basic_descriptor`] object from which the move will occur.]]
+[[other][The other descriptor object from which the move will occur.]]
 
 ]
 
 
 [heading Remarks]
       
-Following the move, the moved-from object is in the same state as if constructed using the `basic_descriptor(io_context&) constructor`. 
+Following the move, the moved-from object is in the same state as if constructed using the `descriptor(io_context&) constructor`. 
 
 
 
@@ -97086,203 +90086,13 @@
 [endsect]
 
 
-[section:bytes_readable posix::basic_descriptor::bytes_readable]
+[section:executor_type posix::descriptor::executor_type]
 
-
-['Inherited from posix::descriptor_base.]
-
-[indexterm2 bytes_readable..posix::basic_descriptor] 
-IO control command to get the amount of data that can be read without blocking. 
-
-
-  typedef implementation_defined bytes_readable;
-
-
-
-Implements the FIONREAD IO control command.
-
-
-[heading Example]
-  
-
-
-   asio::posix::stream_descriptor descriptor(io_context); 
-   ...
-   asio::descriptor_base::bytes_readable command(true);
-   descriptor.io_control(command);
-   std::size_t bytes_readable = command.get();
-
-
-
-
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/posix/basic_descriptor.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-[section:cancel posix::basic_descriptor::cancel]
-
-[indexterm2 cancel..posix::basic_descriptor] 
-Cancel all asynchronous operations associated with the descriptor. 
-
-
-  void ``[link asio.reference.posix__basic_descriptor.cancel.overload1 cancel]``();
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.cancel.overload1 more...]]``
-
-  asio::error_code ``[link asio.reference.posix__basic_descriptor.cancel.overload2 cancel]``(
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.cancel.overload2 more...]]``
-
-
-[section:overload1 posix::basic_descriptor::cancel (1 of 2 overloads)]
-
-
-Cancel all asynchronous operations associated with the descriptor. 
-
-
-  void cancel();
-
-
-This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.
-
-
-[heading Exceptions]
-    
-
-[variablelist
-  
-[[asio::system_error][Thrown on failure. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 posix::basic_descriptor::cancel (2 of 2 overloads)]
-
-
-Cancel all asynchronous operations associated with the descriptor. 
-
-
-  asio::error_code cancel(
-      asio::error_code & ec);
-
-
-This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[ec][Set to indicate what error occurred, if any. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-[section:close posix::basic_descriptor::close]
-
-[indexterm2 close..posix::basic_descriptor] 
-Close the descriptor. 
-
-
-  void ``[link asio.reference.posix__basic_descriptor.close.overload1 close]``();
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.close.overload1 more...]]``
-
-  asio::error_code ``[link asio.reference.posix__basic_descriptor.close.overload2 close]``(
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.close.overload2 more...]]``
-
-
-[section:overload1 posix::basic_descriptor::close (1 of 2 overloads)]
-
-
-Close the descriptor. 
-
-
-  void close();
-
-
-This function is used to close the descriptor. Any asynchronous read or write operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.
-
-
-[heading Exceptions]
-    
-
-[variablelist
-  
-[[asio::system_error][Thrown on failure. Note that, even if the function indicates an error, the underlying descriptor is closed. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 posix::basic_descriptor::close (2 of 2 overloads)]
-
-
-Close the descriptor. 
-
-
-  asio::error_code close(
-      asio::error_code & ec);
-
-
-This function is used to close the descriptor. Any asynchronous read or write operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[ec][Set to indicate what error occurred, if any. Note that, even if the function indicates an error, the underlying descriptor is closed. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:executor_type posix::basic_descriptor::executor_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 executor_type..posix::basic_descriptor] 
+[indexterm2 executor_type..posix::descriptor] 
 The type of the executor associated with the object. 
 
 
-  typedef asio::io_context::executor_type executor_type;
+  typedef io_context::executor_type executor_type;
 
 
 [heading Member Functions]
@@ -97345,7 +90155,7 @@
 
 [heading Requirements]
 
-['Header: ][^asio/posix/basic_descriptor.hpp]
+['Header: ][^asio/posix/descriptor.hpp]
 
 ['Convenience header: ][^asio.hpp]
 
@@ -97354,12 +90164,9 @@
 
 
 
-[section:get_executor posix::basic_descriptor::get_executor]
+[section:get_executor posix::descriptor::get_executor]
 
-
-['Inherited from basic_io_object.]
-
-[indexterm2 get_executor..posix::basic_descriptor] 
+[indexterm2 get_executor..posix::descriptor] 
 Get the executor associated with the object. 
 
 
@@ -97370,20 +90177,20 @@
 [endsect]
 
 
-[section:get_implementation posix::basic_descriptor::get_implementation]
+[section:get_implementation posix::descriptor::get_implementation]
 
-[indexterm2 get_implementation..posix::basic_descriptor] 
+[indexterm2 get_implementation..posix::descriptor] 
 Get the underlying implementation of the I/O object. 
 
 
-  implementation_type & ``[link asio.reference.posix__basic_descriptor.get_implementation.overload1 get_implementation]``();
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.get_implementation.overload1 more...]]``
+  implementation_type & ``[link asio.reference.posix__descriptor.get_implementation.overload1 get_implementation]``();
+  ``  [''''&raquo;''' [link asio.reference.posix__descriptor.get_implementation.overload1 more...]]``
 
-  const implementation_type & ``[link asio.reference.posix__basic_descriptor.get_implementation.overload2 get_implementation]``() const;
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.get_implementation.overload2 more...]]``
+  const implementation_type & ``[link asio.reference.posix__descriptor.get_implementation.overload2 get_implementation]``() const;
+  ``  [''''&raquo;''' [link asio.reference.posix__descriptor.get_implementation.overload2 more...]]``
 
 
-[section:overload1 posix::basic_descriptor::get_implementation (1 of 2 overloads)]
+[section:overload1 posix::descriptor::get_implementation (1 of 2 overloads)]
 
 
 ['Inherited from basic_io_object.]
@@ -97400,7 +90207,7 @@
 
 
 
-[section:overload2 posix::basic_descriptor::get_implementation (2 of 2 overloads)]
+[section:overload2 posix::descriptor::get_implementation (2 of 2 overloads)]
 
 
 ['Inherited from basic_io_object.]
@@ -97419,12 +90226,9 @@
 [endsect]
 
 
-[section:get_io_context posix::basic_descriptor::get_io_context]
+[section:get_io_context posix::descriptor::get_io_context]
 
-
-['Inherited from basic_io_object.]
-
-[indexterm2 get_io_context..posix::basic_descriptor] 
+[indexterm2 get_io_context..posix::descriptor] 
 (Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
 
 
@@ -97445,12 +90249,9 @@
 
 
 
-[section:get_io_service posix::basic_descriptor::get_io_service]
+[section:get_io_service posix::descriptor::get_io_service]
 
-
-['Inherited from basic_io_object.]
-
-[indexterm2 get_io_service..posix::basic_descriptor] 
+[indexterm2 get_io_service..posix::descriptor] 
 (Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
 
 
@@ -97470,20 +90271,20 @@
 [endsect]
 
 
-[section:get_service posix::basic_descriptor::get_service]
+[section:get_service posix::descriptor::get_service]
 
-[indexterm2 get_service..posix::basic_descriptor] 
+[indexterm2 get_service..posix::descriptor] 
 Get the service associated with the I/O object. 
 
 
-  service_type & ``[link asio.reference.posix__basic_descriptor.get_service.overload1 get_service]``();
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.get_service.overload1 more...]]``
+  service_type & ``[link asio.reference.posix__descriptor.get_service.overload1 get_service]``();
+  ``  [''''&raquo;''' [link asio.reference.posix__descriptor.get_service.overload1 more...]]``
 
-  const service_type & ``[link asio.reference.posix__basic_descriptor.get_service.overload2 get_service]``() const;
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.get_service.overload2 more...]]``
+  const service_type & ``[link asio.reference.posix__descriptor.get_service.overload2 get_service]``() const;
+  ``  [''''&raquo;''' [link asio.reference.posix__descriptor.get_service.overload2 more...]]``
 
 
-[section:overload1 posix::basic_descriptor::get_service (1 of 2 overloads)]
+[section:overload1 posix::descriptor::get_service (1 of 2 overloads)]
 
 
 ['Inherited from basic_io_object.]
@@ -97500,7 +90301,7 @@
 
 
 
-[section:overload2 posix::basic_descriptor::get_service (2 of 2 overloads)]
+[section:overload2 posix::descriptor::get_service (2 of 2 overloads)]
 
 
 ['Inherited from basic_io_object.]
@@ -97518,51 +90319,27 @@
 
 [endsect]
 
+[section:io_control posix::descriptor::io_control]
 
-[section:implementation_type posix::basic_descriptor::implementation_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 implementation_type..posix::basic_descriptor] 
-The underlying implementation type of I/O object. 
-
-
-  typedef service_type::implementation_type implementation_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/posix/basic_descriptor.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-[section:io_control posix::basic_descriptor::io_control]
-
-[indexterm2 io_control..posix::basic_descriptor] 
+[indexterm2 io_control..posix::descriptor] 
 Perform an IO control command on the descriptor. 
 
 
   template<
       typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
-  void ``[link asio.reference.posix__basic_descriptor.io_control.overload1 io_control]``(
+  void ``[link asio.reference.posix__descriptor.io_control.overload1 io_control]``(
       IoControlCommand & command);
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.io_control.overload1 more...]]``
+  ``  [''''&raquo;''' [link asio.reference.posix__descriptor.io_control.overload1 more...]]``
 
   template<
       typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
-  asio::error_code ``[link asio.reference.posix__basic_descriptor.io_control.overload2 io_control]``(
+  asio::error_code ``[link asio.reference.posix__descriptor.io_control.overload2 io_control]``(
       IoControlCommand & command,
       asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.io_control.overload2 more...]]``
+  ``  [''''&raquo;''' [link asio.reference.posix__descriptor.io_control.overload2 more...]]``
 
 
-[section:overload1 posix::basic_descriptor::io_control (1 of 2 overloads)]
+[section:overload1 posix::descriptor::io_control (1 of 2 overloads)]
 
 
 Perform an IO control command on the descriptor. 
@@ -97618,7 +90395,7 @@
 
 
 
-[section:overload2 posix::basic_descriptor::io_control (2 of 2 overloads)]
+[section:overload2 posix::descriptor::io_control (2 of 2 overloads)]
 
 
 Perform an IO control command on the descriptor. 
@@ -97674,9 +90451,9 @@
 [endsect]
 
 
-[section:is_open posix::basic_descriptor::is_open]
+[section:is_open posix::descriptor::is_open]
 
-[indexterm2 is_open..posix::basic_descriptor] 
+[indexterm2 is_open..posix::descriptor] 
 Determine whether the descriptor is open. 
 
 
@@ -97687,24 +90464,24 @@
 [endsect]
 
 
-[section:lowest_layer posix::basic_descriptor::lowest_layer]
+[section:lowest_layer posix::descriptor::lowest_layer]
 
-[indexterm2 lowest_layer..posix::basic_descriptor] 
+[indexterm2 lowest_layer..posix::descriptor] 
 Get a reference to the lowest layer. 
 
 
-  lowest_layer_type & ``[link asio.reference.posix__basic_descriptor.lowest_layer.overload1 lowest_layer]``();
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.lowest_layer.overload1 more...]]``
+  lowest_layer_type & ``[link asio.reference.posix__descriptor.lowest_layer.overload1 lowest_layer]``();
+  ``  [''''&raquo;''' [link asio.reference.posix__descriptor.lowest_layer.overload1 more...]]``
 
 
 Get a const reference to the lowest layer. 
 
 
-  const lowest_layer_type & ``[link asio.reference.posix__basic_descriptor.lowest_layer.overload2 lowest_layer]``() const;
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.lowest_layer.overload2 more...]]``
+  const lowest_layer_type & ``[link asio.reference.posix__descriptor.lowest_layer.overload2 lowest_layer]``() const;
+  ``  [''''&raquo;''' [link asio.reference.posix__descriptor.lowest_layer.overload2 more...]]``
 
 
-[section:overload1 posix::basic_descriptor::lowest_layer (1 of 2 overloads)]
+[section:overload1 posix::descriptor::lowest_layer (1 of 2 overloads)]
 
 
 Get a reference to the lowest layer. 
@@ -97713,7 +90490,7 @@
   lowest_layer_type & lowest_layer();
 
 
-This function returns a reference to the lowest layer in a stack of layers. Since a [link asio.reference.posix__basic_descriptor `posix::basic_descriptor`] cannot contain any further layers, it simply returns a reference to itself.
+This function returns a reference to the lowest layer in a stack of layers. Since a descriptor cannot contain any further layers, it simply returns a reference to itself.
 
 
 [heading Return Value]
@@ -97727,7 +90504,7 @@
 
 
 
-[section:overload2 posix::basic_descriptor::lowest_layer (2 of 2 overloads)]
+[section:overload2 posix::descriptor::lowest_layer (2 of 2 overloads)]
 
 
 Get a const reference to the lowest layer. 
@@ -97736,7 +90513,7 @@
   const lowest_layer_type & lowest_layer() const;
 
 
-This function returns a const reference to the lowest layer in a stack of layers. Since a [link asio.reference.posix__basic_descriptor `posix::basic_descriptor`] cannot contain any further layers, it simply returns a reference to itself.
+This function returns a const reference to the lowest layer in a stack of layers. Since a descriptor cannot contain any further layers, it simply returns a reference to itself.
 
 
 [heading Return Value]
@@ -97752,13 +90529,13 @@
 [endsect]
 
 
-[section:lowest_layer_type posix::basic_descriptor::lowest_layer_type]
+[section:lowest_layer_type posix::descriptor::lowest_layer_type]
 
-[indexterm2 lowest_layer_type..posix::basic_descriptor] 
-A [link asio.reference.posix__basic_descriptor `posix::basic_descriptor`] is always the lowest layer. 
+[indexterm2 lowest_layer_type..posix::descriptor] 
+A descriptor is always the lowest layer. 
 
 
-  typedef basic_descriptor< DescriptorService > lowest_layer_type;
+  typedef descriptor lowest_layer_type;
 
 
 [heading Types]
@@ -97767,49 +90544,35 @@
 
   [
 
-    [[link asio.reference.posix__basic_descriptor.bytes_readable [*bytes_readable]]]
+    [[link asio.reference.posix__descriptor.bytes_readable [*bytes_readable]]]
     [IO control command to get the amount of data that can be read without blocking. ]
   
   ]
 
   [
 
-    [[link asio.reference.posix__basic_descriptor.executor_type [*executor_type]]]
+    [[link asio.reference.posix__descriptor.executor_type [*executor_type]]]
     [The type of the executor associated with the object. ]
   
   ]
 
   [
 
-    [[link asio.reference.posix__basic_descriptor.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
+    [[link asio.reference.posix__descriptor.lowest_layer_type [*lowest_layer_type]]]
+    [A descriptor is always the lowest layer. ]
   
   ]
 
   [
 
-    [[link asio.reference.posix__basic_descriptor.lowest_layer_type [*lowest_layer_type]]]
-    [A basic_descriptor is always the lowest layer. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.posix__basic_descriptor.native_handle_type [*native_handle_type]]]
+    [[link asio.reference.posix__descriptor.native_handle_type [*native_handle_type]]]
     [The native representation of a descriptor. ]
   
   ]
 
   [
 
-    [[link asio.reference.posix__basic_descriptor.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.posix__basic_descriptor.wait_type [*wait_type]]]
+    [[link asio.reference.posix__descriptor.wait_type [*wait_type]]]
     [Wait types. ]
   
   ]
@@ -97821,97 +90584,97 @@
   [[Name][Description]]
 
   [
-    [[link asio.reference.posix__basic_descriptor.assign [*assign]]]
+    [[link asio.reference.posix__descriptor.assign [*assign]]]
     [Assign an existing native descriptor to the descriptor. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_descriptor.async_wait [*async_wait]]]
+    [[link asio.reference.posix__descriptor.async_wait [*async_wait]]]
     [Asynchronously wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_descriptor.basic_descriptor [*basic_descriptor]]]
-    [Construct a basic_descriptor without opening it. 
-
-     Construct a basic_descriptor on an existing native descriptor. 
-
-     Move-construct a basic_descriptor from another. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_descriptor.cancel [*cancel]]]
+    [[link asio.reference.posix__descriptor.cancel [*cancel]]]
     [Cancel all asynchronous operations associated with the descriptor. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_descriptor.close [*close]]]
+    [[link asio.reference.posix__descriptor.close [*close]]]
     [Close the descriptor. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_descriptor.get_executor [*get_executor]]]
+    [[link asio.reference.posix__descriptor.descriptor [*descriptor]]]
+    [Construct a descriptor without opening it. 
+
+     Construct a descriptor on an existing native descriptor. 
+
+     Move-construct a descriptor from another. ]
+  ]
+  
+  [
+    [[link asio.reference.posix__descriptor.get_executor [*get_executor]]]
     [Get the executor associated with the object. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_descriptor.get_io_context [*get_io_context]]]
+    [[link asio.reference.posix__descriptor.get_io_context [*get_io_context]]]
     [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_descriptor.get_io_service [*get_io_service]]]
+    [[link asio.reference.posix__descriptor.get_io_service [*get_io_service]]]
     [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_descriptor.io_control [*io_control]]]
+    [[link asio.reference.posix__descriptor.io_control [*io_control]]]
     [Perform an IO control command on the descriptor. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_descriptor.is_open [*is_open]]]
+    [[link asio.reference.posix__descriptor.is_open [*is_open]]]
     [Determine whether the descriptor is open. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_descriptor.lowest_layer [*lowest_layer]]]
+    [[link asio.reference.posix__descriptor.lowest_layer [*lowest_layer]]]
     [Get a reference to the lowest layer. 
 
      Get a const reference to the lowest layer. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_descriptor.native_handle [*native_handle]]]
+    [[link asio.reference.posix__descriptor.native_handle [*native_handle]]]
     [Get the native descriptor representation. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_descriptor.native_non_blocking [*native_non_blocking]]]
+    [[link asio.reference.posix__descriptor.native_non_blocking [*native_non_blocking]]]
     [Gets the non-blocking mode of the native descriptor implementation. 
 
      Sets the non-blocking mode of the native descriptor implementation. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_descriptor.non_blocking [*non_blocking]]]
+    [[link asio.reference.posix__descriptor.non_blocking [*non_blocking]]]
     [Gets the non-blocking mode of the descriptor. 
 
      Sets the non-blocking mode of the descriptor. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_descriptor.operator_eq_ [*operator=]]]
-    [Move-assign a basic_descriptor from another. ]
+    [[link asio.reference.posix__descriptor.operator_eq_ [*operator=]]]
+    [Move-assign a descriptor from another. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_descriptor.release [*release]]]
+    [[link asio.reference.posix__descriptor.release [*release]]]
     [Release ownership of the native descriptor implementation. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_descriptor.wait [*wait]]]
+    [[link asio.reference.posix__descriptor.wait [*wait]]]
     [Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. ]
   ]
   
@@ -97922,23 +90685,23 @@
   [[Name][Description]]
 
   [
-    [[link asio.reference.posix__basic_descriptor.get_implementation [*get_implementation]]]
+    [[link asio.reference.posix__descriptor.get_implementation [*get_implementation]]]
     [Get the underlying implementation of the I/O object. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_descriptor.get_service [*get_service]]]
+    [[link asio.reference.posix__descriptor.get_service [*get_service]]]
     [Get the service associated with the I/O object. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_descriptor._basic_descriptor [*~basic_descriptor]]]
+    [[link asio.reference.posix__descriptor._descriptor [*~descriptor]]]
     [Protected destructor to prevent deletion through this type. ]
   ]
   
 ]
 
-The [link asio.reference.posix__basic_descriptor `posix::basic_descriptor`] class template provides the ability to wrap a POSIX descriptor.
+The [link asio.reference.posix__descriptor `posix::descriptor`] class template provides the ability to wrap a POSIX descriptor.
 
 
 [heading Thread Safety]
@@ -97952,7 +90715,7 @@
 
 [heading Requirements]
 
-['Header: ][^asio/posix/basic_descriptor.hpp]
+['Header: ][^asio/posix/descriptor.hpp]
 
 ['Convenience header: ][^asio.hpp]
 
@@ -97961,9 +90724,9 @@
 
 
 
-[section:native_handle posix::basic_descriptor::native_handle]
+[section:native_handle posix::descriptor::native_handle]
 
-[indexterm2 native_handle..posix::basic_descriptor] 
+[indexterm2 native_handle..posix::descriptor] 
 Get the native descriptor representation. 
 
 
@@ -97977,19 +90740,19 @@
 
 
 
-[section:native_handle_type posix::basic_descriptor::native_handle_type]
+[section:native_handle_type posix::descriptor::native_handle_type]
 
-[indexterm2 native_handle_type..posix::basic_descriptor] 
+[indexterm2 native_handle_type..posix::descriptor] 
 The native representation of a descriptor. 
 
 
-  typedef DescriptorService::native_handle_type native_handle_type;
+  typedef implementation_defined native_handle_type;
 
 
 
 [heading Requirements]
 
-['Header: ][^asio/posix/basic_descriptor.hpp]
+['Header: ][^asio/posix/descriptor.hpp]
 
 ['Convenience header: ][^asio.hpp]
 
@@ -97997,30 +90760,30 @@
 [endsect]
 
 
-[section:native_non_blocking posix::basic_descriptor::native_non_blocking]
+[section:native_non_blocking posix::descriptor::native_non_blocking]
 
-[indexterm2 native_non_blocking..posix::basic_descriptor] 
+[indexterm2 native_non_blocking..posix::descriptor] 
 Gets the non-blocking mode of the native descriptor implementation. 
 
 
-  bool ``[link asio.reference.posix__basic_descriptor.native_non_blocking.overload1 native_non_blocking]``() const;
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.native_non_blocking.overload1 more...]]``
+  bool ``[link asio.reference.posix__descriptor.native_non_blocking.overload1 native_non_blocking]``() const;
+  ``  [''''&raquo;''' [link asio.reference.posix__descriptor.native_non_blocking.overload1 more...]]``
 
 
 Sets the non-blocking mode of the native descriptor implementation. 
 
 
-  void ``[link asio.reference.posix__basic_descriptor.native_non_blocking.overload2 native_non_blocking]``(
+  void ``[link asio.reference.posix__descriptor.native_non_blocking.overload2 native_non_blocking]``(
       bool mode);
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.native_non_blocking.overload2 more...]]``
+  ``  [''''&raquo;''' [link asio.reference.posix__descriptor.native_non_blocking.overload2 more...]]``
 
-  asio::error_code ``[link asio.reference.posix__basic_descriptor.native_non_blocking.overload3 native_non_blocking]``(
+  asio::error_code ``[link asio.reference.posix__descriptor.native_non_blocking.overload3 native_non_blocking]``(
       bool mode,
       asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.native_non_blocking.overload3 more...]]``
+  ``  [''''&raquo;''' [link asio.reference.posix__descriptor.native_non_blocking.overload3 more...]]``
 
 
-[section:overload1 posix::basic_descriptor::native_non_blocking (1 of 3 overloads)]
+[section:overload1 posix::descriptor::native_non_blocking (1 of 3 overloads)]
 
 
 Gets the non-blocking mode of the native descriptor implementation. 
@@ -98048,7 +90811,7 @@
 
 
 
-[section:overload2 posix::basic_descriptor::native_non_blocking (2 of 3 overloads)]
+[section:overload2 posix::descriptor::native_non_blocking (2 of 3 overloads)]
 
 
 Sets the non-blocking mode of the native descriptor implementation. 
@@ -98087,7 +90850,7 @@
 
 
 
-[section:overload3 posix::basic_descriptor::native_non_blocking (3 of 3 overloads)]
+[section:overload3 posix::descriptor::native_non_blocking (3 of 3 overloads)]
 
 
 Sets the non-blocking mode of the native descriptor implementation. 
@@ -98120,30 +90883,30 @@
 
 [endsect]
 
-[section:non_blocking posix::basic_descriptor::non_blocking]
+[section:non_blocking posix::descriptor::non_blocking]
 
-[indexterm2 non_blocking..posix::basic_descriptor] 
+[indexterm2 non_blocking..posix::descriptor] 
 Gets the non-blocking mode of the descriptor. 
 
 
-  bool ``[link asio.reference.posix__basic_descriptor.non_blocking.overload1 non_blocking]``() const;
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.non_blocking.overload1 more...]]``
+  bool ``[link asio.reference.posix__descriptor.non_blocking.overload1 non_blocking]``() const;
+  ``  [''''&raquo;''' [link asio.reference.posix__descriptor.non_blocking.overload1 more...]]``
 
 
 Sets the non-blocking mode of the descriptor. 
 
 
-  void ``[link asio.reference.posix__basic_descriptor.non_blocking.overload2 non_blocking]``(
+  void ``[link asio.reference.posix__descriptor.non_blocking.overload2 non_blocking]``(
       bool mode);
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.non_blocking.overload2 more...]]``
+  ``  [''''&raquo;''' [link asio.reference.posix__descriptor.non_blocking.overload2 more...]]``
 
-  asio::error_code ``[link asio.reference.posix__basic_descriptor.non_blocking.overload3 non_blocking]``(
+  asio::error_code ``[link asio.reference.posix__descriptor.non_blocking.overload3 non_blocking]``(
       bool mode,
       asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.non_blocking.overload3 more...]]``
+  ``  [''''&raquo;''' [link asio.reference.posix__descriptor.non_blocking.overload3 more...]]``
 
 
-[section:overload1 posix::basic_descriptor::non_blocking (1 of 3 overloads)]
+[section:overload1 posix::descriptor::non_blocking (1 of 3 overloads)]
 
 
 Gets the non-blocking mode of the descriptor. 
@@ -98169,7 +90932,7 @@
 
 
 
-[section:overload2 posix::basic_descriptor::non_blocking (2 of 3 overloads)]
+[section:overload2 posix::descriptor::non_blocking (2 of 3 overloads)]
 
 
 Sets the non-blocking mode of the descriptor. 
@@ -98211,7 +90974,7 @@
 
 
 
-[section:overload3 posix::basic_descriptor::non_blocking (3 of 3 overloads)]
+[section:overload3 posix::descriptor::non_blocking (3 of 3 overloads)]
 
 
 Sets the non-blocking mode of the descriptor. 
@@ -98248,14 +91011,14 @@
 [endsect]
 
 
-[section:operator_eq_ posix::basic_descriptor::operator=]
+[section:operator_eq_ posix::descriptor::operator=]
 
-[indexterm2 operator=..posix::basic_descriptor] 
-Move-assign a [link asio.reference.posix__basic_descriptor `posix::basic_descriptor`] from another. 
+[indexterm2 operator=..posix::descriptor] 
+Move-assign a descriptor from another. 
 
 
-  basic_descriptor & operator=(
-      basic_descriptor && other);
+  descriptor & operator=(
+      descriptor && other);
 
 
 This assignment operator moves a descriptor from one object to another.
@@ -98266,14 +91029,14 @@
 
 [variablelist
   
-[[other][The other [link asio.reference.posix__basic_descriptor `posix::basic_descriptor`] object from which the move will occur.]]
+[[other][The other descriptor object from which the move will occur.]]
 
 ]
 
 
 [heading Remarks]
       
-Following the move, the moved-from object is in the same state as if constructed using the `basic_descriptor(io_context&) constructor`. 
+Following the move, the moved-from object is in the same state as if constructed using the `descriptor(io_context&) constructor`. 
 
 
 
@@ -98282,9 +91045,9 @@
 
 
 
-[section:release posix::basic_descriptor::release]
+[section:release posix::descriptor::release]
 
-[indexterm2 release..posix::basic_descriptor] 
+[indexterm2 release..posix::descriptor] 
 Release ownership of the native descriptor implementation. 
 
 
@@ -98299,47 +91062,23 @@
 [endsect]
 
 
+[section:wait posix::descriptor::wait]
 
-[section:service_type posix::basic_descriptor::service_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 service_type..posix::basic_descriptor] 
-The type of the service that will be used to provide I/O operations. 
-
-
-  typedef DescriptorService service_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/posix/basic_descriptor.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-[section:wait posix::basic_descriptor::wait]
-
-[indexterm2 wait..posix::basic_descriptor] 
+[indexterm2 wait..posix::descriptor] 
 Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. 
 
 
-  void ``[link asio.reference.posix__basic_descriptor.wait.overload1 wait]``(
+  void ``[link asio.reference.posix__descriptor.wait.overload1 wait]``(
       wait_type w);
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.wait.overload1 more...]]``
+  ``  [''''&raquo;''' [link asio.reference.posix__descriptor.wait.overload1 more...]]``
 
-  asio::error_code ``[link asio.reference.posix__basic_descriptor.wait.overload2 wait]``(
+  asio::error_code ``[link asio.reference.posix__descriptor.wait.overload2 wait]``(
       wait_type w,
       asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_descriptor.wait.overload2 more...]]``
+  ``  [''''&raquo;''' [link asio.reference.posix__descriptor.wait.overload2 more...]]``
 
 
-[section:overload1 posix::basic_descriptor::wait (1 of 2 overloads)]
+[section:overload1 posix::descriptor::wait (1 of 2 overloads)]
 
 
 Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. 
@@ -98380,7 +91119,7 @@
 
 
 
-[section:overload2 posix::basic_descriptor::wait (2 of 2 overloads)]
+[section:overload2 posix::descriptor::wait (2 of 2 overloads)]
 
 
 Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. 
@@ -98427,20 +91166,17 @@
 [endsect]
 
 
-[section:wait_type posix::basic_descriptor::wait_type]
+[section:wait_type posix::descriptor::wait_type]
 
-
-['Inherited from posix::descriptor_base.]
-
-[indexterm2 wait_type..posix::basic_descriptor] 
+[indexterm2 wait_type..posix::descriptor] 
 Wait types. 
 
 
   enum wait_type
 
-[indexterm2 wait_read..posix::basic_descriptor]
-[indexterm2 wait_write..posix::basic_descriptor]
-[indexterm2 wait_error..posix::basic_descriptor]
+[indexterm2 wait_read..posix::descriptor]
+[indexterm2 wait_write..posix::descriptor]
+[indexterm2 wait_error..posix::descriptor]
 
 [heading Values]
 [variablelist
@@ -98463,22 +91199,24 @@
 ]
 
 
-For use with `basic_descriptor::wait()` and `basic_descriptor::async_wait()`. 
+For use with `descriptor::wait()` and `descriptor::async_wait()`. 
 
 
 [endsect]
 
 
 
-[section:_basic_descriptor posix::basic_descriptor::~basic_descriptor]
+[section:_descriptor posix::descriptor::~descriptor]
 
-[indexterm2 ~basic_descriptor..posix::basic_descriptor] 
+[indexterm2 ~descriptor..posix::descriptor] 
 Protected destructor to prevent deletion through this type. 
 
 
-  ~basic_descriptor();
+  ~descriptor();
 
 
+This function destroys the descriptor, cancelling any outstanding asynchronous wait operations associated with the descriptor as if by calling `cancel`. 
+
 
 [endsect]
 
@@ -98486,2296 +91224,10 @@
 
 [endsect]
 
-[section:posix__basic_stream_descriptor posix::basic_stream_descriptor]
-
-
-Provides stream-oriented descriptor functionality. 
-
-
-  template<
-      typename ``[link asio.reference.StreamDescriptorService StreamDescriptorService]`` = stream_descriptor_service>
-  class basic_stream_descriptor :
-    public posix::basic_descriptor< StreamDescriptorService >
-
-
-[heading Types]
-[table
-  [[Name][Description]]
-
-  [
-
-    [[link asio.reference.posix__basic_stream_descriptor.bytes_readable [*bytes_readable]]]
-    [IO control command to get the amount of data that can be read without blocking. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.posix__basic_stream_descriptor.executor_type [*executor_type]]]
-    [The type of the executor associated with the object. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.posix__basic_stream_descriptor.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.posix__basic_stream_descriptor.lowest_layer_type [*lowest_layer_type]]]
-    [A basic_descriptor is always the lowest layer. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.posix__basic_stream_descriptor.native_handle_type [*native_handle_type]]]
-    [The native representation of a descriptor. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.posix__basic_stream_descriptor.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.posix__basic_stream_descriptor.wait_type [*wait_type]]]
-    [Wait types. ]
-  
-  ]
-
-]
-
-[heading Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.posix__basic_stream_descriptor.assign [*assign]]]
-    [Assign an existing native descriptor to the descriptor. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_stream_descriptor.async_read_some [*async_read_some]]]
-    [Start an asynchronous read. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_stream_descriptor.async_wait [*async_wait]]]
-    [Asynchronously wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_stream_descriptor.async_write_some [*async_write_some]]]
-    [Start an asynchronous write. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_stream_descriptor.basic_stream_descriptor [*basic_stream_descriptor]]]
-    [Construct a basic_stream_descriptor without opening it. 
-
-     Construct a basic_stream_descriptor on an existing native descriptor. 
-
-     Move-construct a basic_stream_descriptor from another. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_stream_descriptor.cancel [*cancel]]]
-    [Cancel all asynchronous operations associated with the descriptor. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_stream_descriptor.close [*close]]]
-    [Close the descriptor. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_stream_descriptor.get_executor [*get_executor]]]
-    [Get the executor associated with the object. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_stream_descriptor.get_io_context [*get_io_context]]]
-    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_stream_descriptor.get_io_service [*get_io_service]]]
-    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_stream_descriptor.io_control [*io_control]]]
-    [Perform an IO control command on the descriptor. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_stream_descriptor.is_open [*is_open]]]
-    [Determine whether the descriptor is open. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_stream_descriptor.lowest_layer [*lowest_layer]]]
-    [Get a reference to the lowest layer. 
-
-     Get a const reference to the lowest layer. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_stream_descriptor.native_handle [*native_handle]]]
-    [Get the native descriptor representation. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_stream_descriptor.native_non_blocking [*native_non_blocking]]]
-    [Gets the non-blocking mode of the native descriptor implementation. 
-
-     Sets the non-blocking mode of the native descriptor implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_stream_descriptor.non_blocking [*non_blocking]]]
-    [Gets the non-blocking mode of the descriptor. 
-
-     Sets the non-blocking mode of the descriptor. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_stream_descriptor.operator_eq_ [*operator=]]]
-    [Move-assign a basic_stream_descriptor from another. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_stream_descriptor.read_some [*read_some]]]
-    [Read some data from the descriptor. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_stream_descriptor.release [*release]]]
-    [Release ownership of the native descriptor implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_stream_descriptor.wait [*wait]]]
-    [Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_stream_descriptor.write_some [*write_some]]]
-    [Write some data to the descriptor. ]
-  ]
-  
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.posix__basic_stream_descriptor.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_stream_descriptor.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
-  ]
-  
-]
-
-The [link asio.reference.posix__basic_stream_descriptor `posix::basic_stream_descriptor`] class template provides asynchronous and blocking stream-oriented descriptor functionality.
-
-
-[heading Thread Safety]
-  
-['Distinct] ['objects:] Safe.
-
-['Shared] ['objects:] Unsafe.
-
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/posix/basic_stream_descriptor.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-[section:assign posix::basic_stream_descriptor::assign]
-
-[indexterm2 assign..posix::basic_stream_descriptor] 
-Assign an existing native descriptor to the descriptor. 
-
-
-  void ``[link asio.reference.posix__basic_stream_descriptor.assign.overload1 assign]``(
-      const native_handle_type & native_descriptor);
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.assign.overload1 more...]]``
-
-  asio::error_code ``[link asio.reference.posix__basic_stream_descriptor.assign.overload2 assign]``(
-      const native_handle_type & native_descriptor,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.assign.overload2 more...]]``
-
-
-[section:overload1 posix::basic_stream_descriptor::assign (1 of 2 overloads)]
-
-
-['Inherited from posix::basic_descriptor.]
-
-
-Assign an existing native descriptor to the descriptor. 
-
-
-  void assign(
-      const native_handle_type & native_descriptor);
-
-
-
-[endsect]
-
-
-
-[section:overload2 posix::basic_stream_descriptor::assign (2 of 2 overloads)]
-
-
-['Inherited from posix::basic_descriptor.]
-
-
-Assign an existing native descriptor to the descriptor. 
-
-
-  asio::error_code assign(
-      const native_handle_type & native_descriptor,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:async_read_some posix::basic_stream_descriptor::async_read_some]
-
-[indexterm2 async_read_some..posix::basic_stream_descriptor] 
-Start an asynchronous read. 
-
-
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
-      typename ``[link asio.reference.ReadHandler ReadHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_some(
-      const MutableBufferSequence & buffers,
-      ReadHandler && handler);
-
-
-This function is used to asynchronously read data from the stream descriptor. The function call always returns immediately.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[buffers][One or more buffers into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]
-
-[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
-``
-   void handler(
-     const asio::error_code& error, // Result of operation.
-     std::size_t bytes_transferred           // Number of bytes read.
-   ); 
-``
-Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using `asio::io_context::post()`.]]
-
-]
-
-
-[heading Remarks]
-      
-The read operation may not read all of the requested number of bytes. Consider using the [link asio.reference.async_read `async_read`]  function if you need to ensure that the requested amount of data is read before the asynchronous operation completes.
-
-
-[heading Example]
-  
-To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 
-
-   descriptor.async_read_some(asio::buffer(data, size), handler);
-
-
-See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 
-
-
-
-
-[endsect]
-
-
-
-[section:async_wait posix::basic_stream_descriptor::async_wait]
-
-
-['Inherited from posix::basic_descriptor.]
-
-[indexterm2 async_wait..posix::basic_stream_descriptor] 
-Asynchronously wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. 
-
-
-  template<
-      typename ``[link asio.reference.WaitHandler WaitHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
-      wait_type w,
-      WaitHandler && handler);
-
-
-This function is used to perform an asynchronous wait for a descriptor to enter a ready to read, write or error condition state.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[w][Specifies the desired descriptor state.]]
-
-[[handler][The handler to be called when the wait operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
-``
-   void handler(
-     const asio::error_code& error // Result of operation
-   ); 
-``
-Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using `asio::io_context::post()`.]]
-
-]
-
-
-[heading Example]
-  
-
-
-   void wait_handler(const asio::error_code& error)
-   {
-     if (!error)
-     {
-       // Wait succeeded.
-     }
-   }
-
-   ...
-
-   asio::posix::stream_descriptor descriptor(io_context);
-   ...
-   descriptor.async_wait(
-       asio::posix::stream_descriptor::wait_read,
-       wait_handler);
-
-
-
-
-
-
-
-[endsect]
-
-
-
-[section:async_write_some posix::basic_stream_descriptor::async_write_some]
-
-[indexterm2 async_write_some..posix::basic_stream_descriptor] 
-Start an asynchronous write. 
-
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
-      typename ``[link asio.reference.WriteHandler WriteHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_write_some(
-      const ConstBufferSequence & buffers,
-      WriteHandler && handler);
-
-
-This function is used to asynchronously write data to the stream descriptor. The function call always returns immediately.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[buffers][One or more data buffers to be written to the descriptor. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]
-
-[[handler][The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
-``
-   void handler(
-     const asio::error_code& error, // Result of operation.
-     std::size_t bytes_transferred           // Number of bytes written.
-   ); 
-``
-Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using `asio::io_context::post()`.]]
-
-]
-
-
-[heading Remarks]
-      
-The write operation may not transmit all of the data to the peer. Consider using the [link asio.reference.async_write `async_write`]  function if you need to ensure that all data is written before the asynchronous operation completes.
-
-
-[heading Example]
-  
-To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 
-
-   descriptor.async_write_some(asio::buffer(data, size), handler);
-
-
-See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 
-
-
-
-
-[endsect]
-
-
-[section:basic_stream_descriptor posix::basic_stream_descriptor::basic_stream_descriptor]
-
-[indexterm2 basic_stream_descriptor..posix::basic_stream_descriptor] 
-Construct a [link asio.reference.posix__basic_stream_descriptor `posix::basic_stream_descriptor`] without opening it. 
-
-
-  explicit ``[link asio.reference.posix__basic_stream_descriptor.basic_stream_descriptor.overload1 basic_stream_descriptor]``(
-      asio::io_context & io_context);
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.basic_stream_descriptor.overload1 more...]]``
-
-
-Construct a [link asio.reference.posix__basic_stream_descriptor `posix::basic_stream_descriptor`] on an existing native descriptor. 
-
-
-  ``[link asio.reference.posix__basic_stream_descriptor.basic_stream_descriptor.overload2 basic_stream_descriptor]``(
-      asio::io_context & io_context,
-      const native_handle_type & native_descriptor);
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.basic_stream_descriptor.overload2 more...]]``
-
-
-Move-construct a [link asio.reference.posix__basic_stream_descriptor `posix::basic_stream_descriptor`] from another. 
-
-
-  ``[link asio.reference.posix__basic_stream_descriptor.basic_stream_descriptor.overload3 basic_stream_descriptor]``(
-      basic_stream_descriptor && other);
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.basic_stream_descriptor.overload3 more...]]``
-
-
-[section:overload1 posix::basic_stream_descriptor::basic_stream_descriptor (1 of 3 overloads)]
-
-
-Construct a [link asio.reference.posix__basic_stream_descriptor `posix::basic_stream_descriptor`] without opening it. 
-
-
-  basic_stream_descriptor(
-      asio::io_context & io_context);
-
-
-This constructor creates a stream descriptor without opening it. The descriptor needs to be opened and then connected or accepted before data can be sent or received on it.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[io_context][The [link asio.reference.io_context `io_context`] object that the stream descriptor will use to dispatch handlers for any asynchronous operations performed on the descriptor. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 posix::basic_stream_descriptor::basic_stream_descriptor (2 of 3 overloads)]
-
-
-Construct a [link asio.reference.posix__basic_stream_descriptor `posix::basic_stream_descriptor`] on an existing native descriptor. 
-
-
-  basic_stream_descriptor(
-      asio::io_context & io_context,
-      const native_handle_type & native_descriptor);
-
-
-This constructor creates a stream descriptor object to hold an existing native descriptor.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[io_context][The [link asio.reference.io_context `io_context`] object that the stream descriptor will use to dispatch handlers for any asynchronous operations performed on the descriptor.]]
-
-[[native_descriptor][The new underlying descriptor implementation.]]
-
-]
-
-
-[heading Exceptions]
-    
-
-[variablelist
-  
-[[asio::system_error][Thrown on failure. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-
-[section:overload3 posix::basic_stream_descriptor::basic_stream_descriptor (3 of 3 overloads)]
-
-
-Move-construct a [link asio.reference.posix__basic_stream_descriptor `posix::basic_stream_descriptor`] from another. 
-
-
-  basic_stream_descriptor(
-      basic_stream_descriptor && other);
-
-
-This constructor moves a stream descriptor from one object to another.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[other][The other [link asio.reference.posix__basic_stream_descriptor `posix::basic_stream_descriptor`] object from which the move will occur.]]
-
-]
-
-
-[heading Remarks]
-      
-Following the move, the moved-from object is in the same state as if constructed using the `basic_stream_descriptor(io_context&) constructor`. 
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:bytes_readable posix::basic_stream_descriptor::bytes_readable]
-
-
-['Inherited from posix::descriptor_base.]
-
-[indexterm2 bytes_readable..posix::basic_stream_descriptor] 
-IO control command to get the amount of data that can be read without blocking. 
-
-
-  typedef implementation_defined bytes_readable;
-
-
-
-Implements the FIONREAD IO control command.
-
-
-[heading Example]
-  
-
-
-   asio::posix::stream_descriptor descriptor(io_context); 
-   ...
-   asio::descriptor_base::bytes_readable command(true);
-   descriptor.io_control(command);
-   std::size_t bytes_readable = command.get();
-
-
-
-
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/posix/basic_stream_descriptor.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-[section:cancel posix::basic_stream_descriptor::cancel]
-
-[indexterm2 cancel..posix::basic_stream_descriptor] 
-Cancel all asynchronous operations associated with the descriptor. 
-
-
-  void ``[link asio.reference.posix__basic_stream_descriptor.cancel.overload1 cancel]``();
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.cancel.overload1 more...]]``
-
-  asio::error_code ``[link asio.reference.posix__basic_stream_descriptor.cancel.overload2 cancel]``(
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.cancel.overload2 more...]]``
-
-
-[section:overload1 posix::basic_stream_descriptor::cancel (1 of 2 overloads)]
-
-
-['Inherited from posix::basic_descriptor.]
-
-
-Cancel all asynchronous operations associated with the descriptor. 
-
-
-  void cancel();
-
-
-This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.
-
-
-[heading Exceptions]
-    
-
-[variablelist
-  
-[[asio::system_error][Thrown on failure. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 posix::basic_stream_descriptor::cancel (2 of 2 overloads)]
-
-
-['Inherited from posix::basic_descriptor.]
-
-
-Cancel all asynchronous operations associated with the descriptor. 
-
-
-  asio::error_code cancel(
-      asio::error_code & ec);
-
-
-This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[ec][Set to indicate what error occurred, if any. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-[section:close posix::basic_stream_descriptor::close]
-
-[indexterm2 close..posix::basic_stream_descriptor] 
-Close the descriptor. 
-
-
-  void ``[link asio.reference.posix__basic_stream_descriptor.close.overload1 close]``();
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.close.overload1 more...]]``
-
-  asio::error_code ``[link asio.reference.posix__basic_stream_descriptor.close.overload2 close]``(
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.close.overload2 more...]]``
-
-
-[section:overload1 posix::basic_stream_descriptor::close (1 of 2 overloads)]
-
-
-['Inherited from posix::basic_descriptor.]
-
-
-Close the descriptor. 
-
-
-  void close();
-
-
-This function is used to close the descriptor. Any asynchronous read or write operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.
-
-
-[heading Exceptions]
-    
-
-[variablelist
-  
-[[asio::system_error][Thrown on failure. Note that, even if the function indicates an error, the underlying descriptor is closed. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 posix::basic_stream_descriptor::close (2 of 2 overloads)]
-
-
-['Inherited from posix::basic_descriptor.]
-
-
-Close the descriptor. 
-
-
-  asio::error_code close(
-      asio::error_code & ec);
-
-
-This function is used to close the descriptor. Any asynchronous read or write operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[ec][Set to indicate what error occurred, if any. Note that, even if the function indicates an error, the underlying descriptor is closed. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:executor_type posix::basic_stream_descriptor::executor_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 executor_type..posix::basic_stream_descriptor] 
-The type of the executor associated with the object. 
-
-
-  typedef asio::io_context::executor_type executor_type;
-
-
-[heading Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.io_context__executor_type.context [*context]]]
-    [Obtain the underlying execution context. ]
-  ]
-  
-  [
-    [[link asio.reference.io_context__executor_type.defer [*defer]]]
-    [Request the io_context to invoke the given function object. ]
-  ]
-  
-  [
-    [[link asio.reference.io_context__executor_type.dispatch [*dispatch]]]
-    [Request the io_context to invoke the given function object. ]
-  ]
-  
-  [
-    [[link asio.reference.io_context__executor_type.on_work_finished [*on_work_finished]]]
-    [Inform the io_context that some work is no longer outstanding. ]
-  ]
-  
-  [
-    [[link asio.reference.io_context__executor_type.on_work_started [*on_work_started]]]
-    [Inform the io_context that it has some outstanding work to do. ]
-  ]
-  
-  [
-    [[link asio.reference.io_context__executor_type.post [*post]]]
-    [Request the io_context to invoke the given function object. ]
-  ]
-  
-  [
-    [[link asio.reference.io_context__executor_type.running_in_this_thread [*running_in_this_thread]]]
-    [Determine whether the io_context is running in the current thread. ]
-  ]
-  
-]
-
-[heading Friends]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.io_context__executor_type.operator_not__eq_ [*operator!=]]]
-    [Compare two executors for inequality. ]
-  ]
-  
-  [
-    [[link asio.reference.io_context__executor_type.operator_eq__eq_ [*operator==]]]
-    [Compare two executors for equality. ]
-  ]
-  
-]
-
-
-[heading Requirements]
-
-['Header: ][^asio/posix/basic_stream_descriptor.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:get_executor posix::basic_stream_descriptor::get_executor]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 get_executor..posix::basic_stream_descriptor] 
-Get the executor associated with the object. 
-
-
-  executor_type get_executor();
-
-
-
-[endsect]
-
-
-[section:get_implementation posix::basic_stream_descriptor::get_implementation]
-
-[indexterm2 get_implementation..posix::basic_stream_descriptor] 
-Get the underlying implementation of the I/O object. 
-
-
-  implementation_type & ``[link asio.reference.posix__basic_stream_descriptor.get_implementation.overload1 get_implementation]``();
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.get_implementation.overload1 more...]]``
-
-  const implementation_type & ``[link asio.reference.posix__basic_stream_descriptor.get_implementation.overload2 get_implementation]``() const;
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.get_implementation.overload2 more...]]``
-
-
-[section:overload1 posix::basic_stream_descriptor::get_implementation (1 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the underlying implementation of the I/O object. 
-
-
-  implementation_type & get_implementation();
-
-
-
-[endsect]
-
-
-
-[section:overload2 posix::basic_stream_descriptor::get_implementation (2 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the underlying implementation of the I/O object. 
-
-
-  const implementation_type & get_implementation() const;
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:get_io_context posix::basic_stream_descriptor::get_io_context]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 get_io_context..posix::basic_stream_descriptor] 
-(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
-
-
-  asio::io_context & get_io_context();
-
-
-This function may be used to obtain the [link asio.reference.io_context `io_context`] object that the I/O object uses to dispatch handlers for asynchronous operations.
-
-
-[heading Return Value]
-      
-A reference to the [link asio.reference.io_context `io_context`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 
-
-
-
-
-[endsect]
-
-
-
-[section:get_io_service posix::basic_stream_descriptor::get_io_service]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 get_io_service..posix::basic_stream_descriptor] 
-(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
-
-
-  asio::io_context & get_io_service();
-
-
-This function may be used to obtain the [link asio.reference.io_context `io_context`] object that the I/O object uses to dispatch handlers for asynchronous operations.
-
-
-[heading Return Value]
-      
-A reference to the [link asio.reference.io_context `io_context`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 
-
-
-
-
-[endsect]
-
-
-[section:get_service posix::basic_stream_descriptor::get_service]
-
-[indexterm2 get_service..posix::basic_stream_descriptor] 
-Get the service associated with the I/O object. 
-
-
-  service_type & ``[link asio.reference.posix__basic_stream_descriptor.get_service.overload1 get_service]``();
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.get_service.overload1 more...]]``
-
-  const service_type & ``[link asio.reference.posix__basic_stream_descriptor.get_service.overload2 get_service]``() const;
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.get_service.overload2 more...]]``
-
-
-[section:overload1 posix::basic_stream_descriptor::get_service (1 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the service associated with the I/O object. 
-
-
-  service_type & get_service();
-
-
-
-[endsect]
-
-
-
-[section:overload2 posix::basic_stream_descriptor::get_service (2 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the service associated with the I/O object. 
-
-
-  const service_type & get_service() const;
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:implementation_type posix::basic_stream_descriptor::implementation_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 implementation_type..posix::basic_stream_descriptor] 
-The underlying implementation type of I/O object. 
-
-
-  typedef service_type::implementation_type implementation_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/posix/basic_stream_descriptor.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-[section:io_control posix::basic_stream_descriptor::io_control]
-
-[indexterm2 io_control..posix::basic_stream_descriptor] 
-Perform an IO control command on the descriptor. 
-
-
-  void ``[link asio.reference.posix__basic_stream_descriptor.io_control.overload1 io_control]``(
-      IoControlCommand & command);
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.io_control.overload1 more...]]``
-
-  asio::error_code ``[link asio.reference.posix__basic_stream_descriptor.io_control.overload2 io_control]``(
-      IoControlCommand & command,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.io_control.overload2 more...]]``
-
-
-[section:overload1 posix::basic_stream_descriptor::io_control (1 of 2 overloads)]
-
-
-['Inherited from posix::basic_descriptor.]
-
-
-Perform an IO control command on the descriptor. 
-
-
-  template<
-      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
-  void io_control(
-      IoControlCommand & command);
-
-
-This function is used to execute an IO control command on the descriptor.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[command][The IO control command to be performed on the descriptor.]]
-
-]
-
-
-[heading Exceptions]
-    
-
-[variablelist
-  
-[[asio::system_error][Thrown on failure.]]
-
-]
-
-
-
-[heading Example]
-  
-Getting the number of bytes ready to read: 
-
-   asio::posix::stream_descriptor descriptor(io_context);
-   ...
-   asio::posix::stream_descriptor::bytes_readable command;
-   descriptor.io_control(command);
-   std::size_t bytes_readable = command.get();
-
-
-
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 posix::basic_stream_descriptor::io_control (2 of 2 overloads)]
-
-
-['Inherited from posix::basic_descriptor.]
-
-
-Perform an IO control command on the descriptor. 
-
-
-  template<
-      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
-  asio::error_code io_control(
-      IoControlCommand & command,
-      asio::error_code & ec);
-
-
-This function is used to execute an IO control command on the descriptor.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[command][The IO control command to be performed on the descriptor.]]
-
-[[ec][Set to indicate what error occurred, if any.]]
-
-]
-
-
-
-[heading Example]
-  
-Getting the number of bytes ready to read: 
-
-   asio::posix::stream_descriptor descriptor(io_context);
-   ...
-   asio::posix::stream_descriptor::bytes_readable command;
-   asio::error_code ec;
-   descriptor.io_control(command, ec);
-   if (ec)
-   {
-     // An error occurred.
-   }
-   std::size_t bytes_readable = command.get();
-
-
-
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:is_open posix::basic_stream_descriptor::is_open]
-
-
-['Inherited from posix::basic_descriptor.]
-
-[indexterm2 is_open..posix::basic_stream_descriptor] 
-Determine whether the descriptor is open. 
-
-
-  bool is_open() const;
-
-
-
-[endsect]
-
-
-[section:lowest_layer posix::basic_stream_descriptor::lowest_layer]
-
-[indexterm2 lowest_layer..posix::basic_stream_descriptor] 
-Get a reference to the lowest layer. 
-
-
-  lowest_layer_type & ``[link asio.reference.posix__basic_stream_descriptor.lowest_layer.overload1 lowest_layer]``();
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.lowest_layer.overload1 more...]]``
-
-
-Get a const reference to the lowest layer. 
-
-
-  const lowest_layer_type & ``[link asio.reference.posix__basic_stream_descriptor.lowest_layer.overload2 lowest_layer]``() const;
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.lowest_layer.overload2 more...]]``
-
-
-[section:overload1 posix::basic_stream_descriptor::lowest_layer (1 of 2 overloads)]
-
-
-['Inherited from posix::basic_descriptor.]
-
-
-Get a reference to the lowest layer. 
-
-
-  lowest_layer_type & lowest_layer();
-
-
-This function returns a reference to the lowest layer in a stack of layers. Since a [link asio.reference.posix__basic_descriptor `posix::basic_descriptor`] cannot contain any further layers, it simply returns a reference to itself.
-
-
-[heading Return Value]
-      
-A reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 posix::basic_stream_descriptor::lowest_layer (2 of 2 overloads)]
-
-
-['Inherited from posix::basic_descriptor.]
-
-
-Get a const reference to the lowest layer. 
-
-
-  const lowest_layer_type & lowest_layer() const;
-
-
-This function returns a const reference to the lowest layer in a stack of layers. Since a [link asio.reference.posix__basic_descriptor `posix::basic_descriptor`] cannot contain any further layers, it simply returns a reference to itself.
-
-
-[heading Return Value]
-      
-A const reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:lowest_layer_type posix::basic_stream_descriptor::lowest_layer_type]
-
-
-['Inherited from posix::basic_descriptor.]
-
-[indexterm2 lowest_layer_type..posix::basic_stream_descriptor] 
-A [link asio.reference.posix__basic_descriptor `posix::basic_descriptor`] is always the lowest layer. 
-
-
-  typedef basic_descriptor< StreamDescriptorService > lowest_layer_type;
-
-
-[heading Types]
-[table
-  [[Name][Description]]
-
-  [
-
-    [[link asio.reference.posix__basic_descriptor.bytes_readable [*bytes_readable]]]
-    [IO control command to get the amount of data that can be read without blocking. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.posix__basic_descriptor.executor_type [*executor_type]]]
-    [The type of the executor associated with the object. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.posix__basic_descriptor.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.posix__basic_descriptor.lowest_layer_type [*lowest_layer_type]]]
-    [A basic_descriptor is always the lowest layer. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.posix__basic_descriptor.native_handle_type [*native_handle_type]]]
-    [The native representation of a descriptor. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.posix__basic_descriptor.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.posix__basic_descriptor.wait_type [*wait_type]]]
-    [Wait types. ]
-  
-  ]
-
-]
-
-[heading Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.posix__basic_descriptor.assign [*assign]]]
-    [Assign an existing native descriptor to the descriptor. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_descriptor.async_wait [*async_wait]]]
-    [Asynchronously wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_descriptor.basic_descriptor [*basic_descriptor]]]
-    [Construct a basic_descriptor without opening it. 
-
-     Construct a basic_descriptor on an existing native descriptor. 
-
-     Move-construct a basic_descriptor from another. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_descriptor.cancel [*cancel]]]
-    [Cancel all asynchronous operations associated with the descriptor. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_descriptor.close [*close]]]
-    [Close the descriptor. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_descriptor.get_executor [*get_executor]]]
-    [Get the executor associated with the object. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_descriptor.get_io_context [*get_io_context]]]
-    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_descriptor.get_io_service [*get_io_service]]]
-    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_descriptor.io_control [*io_control]]]
-    [Perform an IO control command on the descriptor. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_descriptor.is_open [*is_open]]]
-    [Determine whether the descriptor is open. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_descriptor.lowest_layer [*lowest_layer]]]
-    [Get a reference to the lowest layer. 
-
-     Get a const reference to the lowest layer. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_descriptor.native_handle [*native_handle]]]
-    [Get the native descriptor representation. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_descriptor.native_non_blocking [*native_non_blocking]]]
-    [Gets the non-blocking mode of the native descriptor implementation. 
-
-     Sets the non-blocking mode of the native descriptor implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_descriptor.non_blocking [*non_blocking]]]
-    [Gets the non-blocking mode of the descriptor. 
-
-     Sets the non-blocking mode of the descriptor. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_descriptor.operator_eq_ [*operator=]]]
-    [Move-assign a basic_descriptor from another. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_descriptor.release [*release]]]
-    [Release ownership of the native descriptor implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_descriptor.wait [*wait]]]
-    [Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. ]
-  ]
-  
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.posix__basic_descriptor.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_descriptor.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_descriptor._basic_descriptor [*~basic_descriptor]]]
-    [Protected destructor to prevent deletion through this type. ]
-  ]
-  
-]
-
-The [link asio.reference.posix__basic_descriptor `posix::basic_descriptor`] class template provides the ability to wrap a POSIX descriptor.
-
-
-[heading Thread Safety]
-  
-['Distinct] ['objects:] Safe.
-
-['Shared] ['objects:] Unsafe. 
-
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/posix/basic_stream_descriptor.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:native_handle posix::basic_stream_descriptor::native_handle]
-
-
-['Inherited from posix::basic_descriptor.]
-
-[indexterm2 native_handle..posix::basic_stream_descriptor] 
-Get the native descriptor representation. 
-
-
-  native_handle_type native_handle();
-
-
-This function may be used to obtain the underlying representation of the descriptor. This is intended to allow access to native descriptor functionality that is not otherwise provided. 
-
-
-[endsect]
-
-
-
-[section:native_handle_type posix::basic_stream_descriptor::native_handle_type]
-
-[indexterm2 native_handle_type..posix::basic_stream_descriptor] 
-The native representation of a descriptor. 
-
-
-  typedef StreamDescriptorService::native_handle_type native_handle_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/posix/basic_stream_descriptor.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-[section:native_non_blocking posix::basic_stream_descriptor::native_non_blocking]
-
-[indexterm2 native_non_blocking..posix::basic_stream_descriptor] 
-Gets the non-blocking mode of the native descriptor implementation. 
-
-
-  bool ``[link asio.reference.posix__basic_stream_descriptor.native_non_blocking.overload1 native_non_blocking]``() const;
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.native_non_blocking.overload1 more...]]``
-
-
-Sets the non-blocking mode of the native descriptor implementation. 
-
-
-  void ``[link asio.reference.posix__basic_stream_descriptor.native_non_blocking.overload2 native_non_blocking]``(
-      bool mode);
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.native_non_blocking.overload2 more...]]``
-
-  asio::error_code ``[link asio.reference.posix__basic_stream_descriptor.native_non_blocking.overload3 native_non_blocking]``(
-      bool mode,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.native_non_blocking.overload3 more...]]``
-
-
-[section:overload1 posix::basic_stream_descriptor::native_non_blocking (1 of 3 overloads)]
-
-
-['Inherited from posix::basic_descriptor.]
-
-
-Gets the non-blocking mode of the native descriptor implementation. 
-
-
-  bool native_non_blocking() const;
-
-
-This function is used to retrieve the non-blocking mode of the underlying native descriptor. This mode has no effect on the behaviour of the descriptor object's synchronous operations.
-
-
-[heading Return Value]
-      
-`true` if the underlying descriptor is in non-blocking mode and direct system calls may fail with `asio::error::would_block` (or the equivalent system error).
-
-
-[heading Remarks]
-      
-The current non-blocking mode is cached by the descriptor object. Consequently, the return value may be incorrect if the non-blocking mode was set directly on the native descriptor. 
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 posix::basic_stream_descriptor::native_non_blocking (2 of 3 overloads)]
-
-
-['Inherited from posix::basic_descriptor.]
-
-
-Sets the non-blocking mode of the native descriptor implementation. 
-
-
-  void native_non_blocking(
-      bool mode);
-
-
-This function is used to modify the non-blocking mode of the underlying native descriptor. It has no effect on the behaviour of the descriptor object's synchronous operations.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[mode][If `true`, the underlying descriptor is put into non-blocking mode and direct system calls may fail with `asio::error::would_block` (or the equivalent system error).]]
-
-]
-
-
-[heading Exceptions]
-    
-
-[variablelist
-  
-[[asio::system_error][Thrown on failure. If the `mode` is `false`, but the current value of `non_blocking()` is `true`, this function fails with `asio::error::invalid_argument`, as the combination does not make sense. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-
-[section:overload3 posix::basic_stream_descriptor::native_non_blocking (3 of 3 overloads)]
-
-
-['Inherited from posix::basic_descriptor.]
-
-
-Sets the non-blocking mode of the native descriptor implementation. 
-
-
-  asio::error_code native_non_blocking(
-      bool mode,
-      asio::error_code & ec);
-
-
-This function is used to modify the non-blocking mode of the underlying native descriptor. It has no effect on the behaviour of the descriptor object's synchronous operations.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[mode][If `true`, the underlying descriptor is put into non-blocking mode and direct system calls may fail with `asio::error::would_block` (or the equivalent system error).]]
-
-[[ec][Set to indicate what error occurred, if any. If the `mode` is `false`, but the current value of `non_blocking()` is `true`, this function fails with `asio::error::invalid_argument`, as the combination does not make sense. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-[section:non_blocking posix::basic_stream_descriptor::non_blocking]
-
-[indexterm2 non_blocking..posix::basic_stream_descriptor] 
-Gets the non-blocking mode of the descriptor. 
-
-
-  bool ``[link asio.reference.posix__basic_stream_descriptor.non_blocking.overload1 non_blocking]``() const;
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.non_blocking.overload1 more...]]``
-
-
-Sets the non-blocking mode of the descriptor. 
-
-
-  void ``[link asio.reference.posix__basic_stream_descriptor.non_blocking.overload2 non_blocking]``(
-      bool mode);
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.non_blocking.overload2 more...]]``
-
-  asio::error_code ``[link asio.reference.posix__basic_stream_descriptor.non_blocking.overload3 non_blocking]``(
-      bool mode,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.non_blocking.overload3 more...]]``
-
-
-[section:overload1 posix::basic_stream_descriptor::non_blocking (1 of 3 overloads)]
-
-
-['Inherited from posix::basic_descriptor.]
-
-
-Gets the non-blocking mode of the descriptor. 
-
-
-  bool non_blocking() const;
-
-
-
-[heading Return Value]
-      
-`true` if the descriptor's synchronous operations will fail with `asio::error::would_block` if they are unable to perform the requested operation immediately. If `false`, synchronous operations will block until complete.
-
-
-[heading Remarks]
-      
-The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error `asio::error::would_block`. 
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 posix::basic_stream_descriptor::non_blocking (2 of 3 overloads)]
-
-
-['Inherited from posix::basic_descriptor.]
-
-
-Sets the non-blocking mode of the descriptor. 
-
-
-  void non_blocking(
-      bool mode);
-
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[mode][If `true`, the descriptor's synchronous operations will fail with `asio::error::would_block` if they are unable to perform the requested operation immediately. If `false`, synchronous operations will block until complete.]]
-
-]
-
-
-[heading Exceptions]
-    
-
-[variablelist
-  
-[[asio::system_error][Thrown on failure.]]
-
-]
-
-
-[heading Remarks]
-      
-The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error `asio::error::would_block`. 
-
-
-
-
-[endsect]
-
-
-
-[section:overload3 posix::basic_stream_descriptor::non_blocking (3 of 3 overloads)]
-
-
-['Inherited from posix::basic_descriptor.]
-
-
-Sets the non-blocking mode of the descriptor. 
-
-
-  asio::error_code non_blocking(
-      bool mode,
-      asio::error_code & ec);
-
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[mode][If `true`, the descriptor's synchronous operations will fail with `asio::error::would_block` if they are unable to perform the requested operation immediately. If `false`, synchronous operations will block until complete.]]
-
-[[ec][Set to indicate what error occurred, if any.]]
-
-]
-
-
-[heading Remarks]
-      
-The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error `asio::error::would_block`. 
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:operator_eq_ posix::basic_stream_descriptor::operator=]
-
-[indexterm2 operator=..posix::basic_stream_descriptor] 
-Move-assign a [link asio.reference.posix__basic_stream_descriptor `posix::basic_stream_descriptor`] from another. 
-
-
-  basic_stream_descriptor & operator=(
-      basic_stream_descriptor && other);
-
-
-This assignment operator moves a stream descriptor from one object to another.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[other][The other [link asio.reference.posix__basic_stream_descriptor `posix::basic_stream_descriptor`] object from which the move will occur.]]
-
-]
-
-
-[heading Remarks]
-      
-Following the move, the moved-from object is in the same state as if constructed using the `basic_stream_descriptor(io_context&) constructor`. 
-
-
-
-
-[endsect]
-
-
-[section:read_some posix::basic_stream_descriptor::read_some]
-
-[indexterm2 read_some..posix::basic_stream_descriptor] 
-Read some data from the descriptor. 
-
-
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
-  std::size_t ``[link asio.reference.posix__basic_stream_descriptor.read_some.overload1 read_some]``(
-      const MutableBufferSequence & buffers);
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.read_some.overload1 more...]]``
-
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
-  std::size_t ``[link asio.reference.posix__basic_stream_descriptor.read_some.overload2 read_some]``(
-      const MutableBufferSequence & buffers,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.read_some.overload2 more...]]``
-
-
-[section:overload1 posix::basic_stream_descriptor::read_some (1 of 2 overloads)]
-
-
-Read some data from the descriptor. 
-
-
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
-  std::size_t read_some(
-      const MutableBufferSequence & buffers);
-
-
-This function is used to read data from the stream descriptor. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[buffers][One or more buffers into which the data will be read.]]
-
-]
-
-
-[heading Return Value]
-      
-The number of bytes read.
-
-
-[heading Exceptions]
-    
-
-[variablelist
-  
-[[asio::system_error][Thrown on failure. An error code of `asio::error::eof` indicates that the connection was closed by the peer.]]
-
-]
-
-
-[heading Remarks]
-      
-The read\_some operation may not read all of the requested number of bytes. Consider using the [link asio.reference.read `read`]  function if you need to ensure that the requested amount of data is read before the blocking operation completes.
-
-
-[heading Example]
-  
-To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 
-
-   descriptor.read_some(asio::buffer(data, size));
-
-
-See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 posix::basic_stream_descriptor::read_some (2 of 2 overloads)]
-
-
-Read some data from the descriptor. 
-
-
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
-  std::size_t read_some(
-      const MutableBufferSequence & buffers,
-      asio::error_code & ec);
-
-
-This function is used to read data from the stream descriptor. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[buffers][One or more buffers into which the data will be read.]]
-
-[[ec][Set to indicate what error occurred, if any.]]
-
-]
-
-
-[heading Return Value]
-      
-The number of bytes read. Returns 0 if an error occurred.
-
-
-[heading Remarks]
-      
-The read\_some operation may not read all of the requested number of bytes. Consider using the [link asio.reference.read `read`]  function if you need to ensure that the requested amount of data is read before the blocking operation completes. 
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:release posix::basic_stream_descriptor::release]
-
-
-['Inherited from posix::basic_descriptor.]
-
-[indexterm2 release..posix::basic_stream_descriptor] 
-Release ownership of the native descriptor implementation. 
-
-
-  native_handle_type release();
-
-
-This function may be used to obtain the underlying representation of the descriptor. After calling this function, `is_open()` returns false. The caller is responsible for closing the descriptor.
-
-All outstanding asynchronous read or write operations will finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error. 
-
-
-[endsect]
-
-
-
-[section:service_type posix::basic_stream_descriptor::service_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 service_type..posix::basic_stream_descriptor] 
-The type of the service that will be used to provide I/O operations. 
-
-
-  typedef StreamDescriptorService service_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/posix/basic_stream_descriptor.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-[section:wait posix::basic_stream_descriptor::wait]
-
-[indexterm2 wait..posix::basic_stream_descriptor] 
-Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. 
-
-
-  void ``[link asio.reference.posix__basic_stream_descriptor.wait.overload1 wait]``(
-      wait_type w);
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.wait.overload1 more...]]``
-
-  asio::error_code ``[link asio.reference.posix__basic_stream_descriptor.wait.overload2 wait]``(
-      wait_type w,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.wait.overload2 more...]]``
-
-
-[section:overload1 posix::basic_stream_descriptor::wait (1 of 2 overloads)]
-
-
-['Inherited from posix::basic_descriptor.]
-
-
-Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. 
-
-
-  void wait(
-      wait_type w);
-
-
-This function is used to perform a blocking wait for a descriptor to enter a ready to read, write or error condition state.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[w][Specifies the desired descriptor state.]]
-
-]
-
-
-[heading Example]
-  
-Waiting for a descriptor to become readable. 
-
-   asio::posix::stream_descriptor descriptor(io_context);
-   ...
-   descriptor.wait(asio::posix::stream_descriptor::wait_read);
-
-
-
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 posix::basic_stream_descriptor::wait (2 of 2 overloads)]
-
-
-['Inherited from posix::basic_descriptor.]
-
-
-Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. 
-
-
-  asio::error_code wait(
-      wait_type w,
-      asio::error_code & ec);
-
-
-This function is used to perform a blocking wait for a descriptor to enter a ready to read, write or error condition state.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[w][Specifies the desired descriptor state.]]
-
-[[ec][Set to indicate what error occurred, if any.]]
-
-]
-
-
-[heading Example]
-  
-Waiting for a descriptor to become readable. 
-
-   asio::posix::stream_descriptor descriptor(io_context);
-   ...
-   asio::error_code ec;
-   descriptor.wait(asio::posix::stream_descriptor::wait_read, ec);
-
-
-
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:wait_type posix::basic_stream_descriptor::wait_type]
-
-
-['Inherited from posix::descriptor_base.]
-
-[indexterm2 wait_type..posix::basic_stream_descriptor] 
-Wait types. 
-
-
-  enum wait_type
-
-[indexterm2 wait_read..posix::basic_stream_descriptor]
-[indexterm2 wait_write..posix::basic_stream_descriptor]
-[indexterm2 wait_error..posix::basic_stream_descriptor]
-
-[heading Values]
-[variablelist
-
-  [
-    [wait_read]
-    [Wait for a descriptor to become ready to read. ]
-  ]
-
-  [
-    [wait_write]
-    [Wait for a descriptor to become ready to write. ]
-  ]
-
-  [
-    [wait_error]
-    [Wait for a descriptor to have error conditions pending. ]
-  ]
-
-]
-
-
-For use with `basic_descriptor::wait()` and `basic_descriptor::async_wait()`. 
-
-
-[endsect]
-
-
-[section:write_some posix::basic_stream_descriptor::write_some]
-
-[indexterm2 write_some..posix::basic_stream_descriptor] 
-Write some data to the descriptor. 
-
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
-  std::size_t ``[link asio.reference.posix__basic_stream_descriptor.write_some.overload1 write_some]``(
-      const ConstBufferSequence & buffers);
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.write_some.overload1 more...]]``
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
-  std::size_t ``[link asio.reference.posix__basic_stream_descriptor.write_some.overload2 write_some]``(
-      const ConstBufferSequence & buffers,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.posix__basic_stream_descriptor.write_some.overload2 more...]]``
-
-
-[section:overload1 posix::basic_stream_descriptor::write_some (1 of 2 overloads)]
-
-
-Write some data to the descriptor. 
-
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
-  std::size_t write_some(
-      const ConstBufferSequence & buffers);
-
-
-This function is used to write data to the stream descriptor. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[buffers][One or more data buffers to be written to the descriptor.]]
-
-]
-
-
-[heading Return Value]
-      
-The number of bytes written.
-
-
-[heading Exceptions]
-    
-
-[variablelist
-  
-[[asio::system_error][Thrown on failure. An error code of `asio::error::eof` indicates that the connection was closed by the peer.]]
-
-]
-
-
-[heading Remarks]
-      
-The write\_some operation may not transmit all of the data to the peer. Consider using the [link asio.reference.write `write`]  function if you need to ensure that all data is written before the blocking operation completes.
-
-
-[heading Example]
-  
-To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 
-
-   descriptor.write_some(asio::buffer(data, size));
-
-
-See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 posix::basic_stream_descriptor::write_some (2 of 2 overloads)]
-
-
-Write some data to the descriptor. 
-
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
-  std::size_t write_some(
-      const ConstBufferSequence & buffers,
-      asio::error_code & ec);
-
-
-This function is used to write data to the stream descriptor. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[buffers][One or more data buffers to be written to the descriptor.]]
-
-[[ec][Set to indicate what error occurred, if any.]]
-
-]
-
-
-[heading Return Value]
-      
-The number of bytes written. Returns 0 if an error occurred.
-
-
-[heading Remarks]
-      
-The write\_some operation may not transmit all of the data to the peer. Consider using the [link asio.reference.write `write`]  function if you need to ensure that all data is written before the blocking operation completes. 
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[endsect]
-
 [section:posix__descriptor_base posix::descriptor_base]
 
 
-The [link asio.reference.posix__descriptor_base `posix::descriptor_base`] class is used as a base for the [link asio.reference.posix__basic_stream_descriptor `posix::basic_stream_descriptor`] class template so that we have a common place to define the associated IO control commands. 
+The [link asio.reference.posix__descriptor_base `posix::descriptor_base`] class is used as a base for the descriptor class as a place to define the associated IO control commands. 
 
 
   class descriptor_base
@@ -100892,7 +91344,7 @@
 ]
 
 
-For use with `basic_descriptor::wait()` and `basic_descriptor::async_wait()`. 
+For use with `descriptor::wait()` and `descriptor::async_wait()`. 
 
 
 [endsect]
@@ -100915,14 +91367,14 @@
 
 [endsect]
 
-
 [section:posix__stream_descriptor posix::stream_descriptor]
 
-[indexterm1 posix::stream_descriptor] 
-Typedef for the typical usage of a stream-oriented descriptor. 
+
+Provides stream-oriented descriptor functionality. 
 
 
-  typedef basic_stream_descriptor stream_descriptor;
+  class stream_descriptor :
+    public posix::descriptor
 
 
 [heading Types]
@@ -100931,49 +91383,35 @@
 
   [
 
-    [[link asio.reference.posix__basic_stream_descriptor.bytes_readable [*bytes_readable]]]
+    [[link asio.reference.posix__stream_descriptor.bytes_readable [*bytes_readable]]]
     [IO control command to get the amount of data that can be read without blocking. ]
   
   ]
 
   [
 
-    [[link asio.reference.posix__basic_stream_descriptor.executor_type [*executor_type]]]
+    [[link asio.reference.posix__stream_descriptor.executor_type [*executor_type]]]
     [The type of the executor associated with the object. ]
   
   ]
 
   [
 
-    [[link asio.reference.posix__basic_stream_descriptor.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
+    [[link asio.reference.posix__stream_descriptor.lowest_layer_type [*lowest_layer_type]]]
+    [A descriptor is always the lowest layer. ]
   
   ]
 
   [
 
-    [[link asio.reference.posix__basic_stream_descriptor.lowest_layer_type [*lowest_layer_type]]]
-    [A basic_descriptor is always the lowest layer. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.posix__basic_stream_descriptor.native_handle_type [*native_handle_type]]]
+    [[link asio.reference.posix__stream_descriptor.native_handle_type [*native_handle_type]]]
     [The native representation of a descriptor. ]
   
   ]
 
   [
 
-    [[link asio.reference.posix__basic_stream_descriptor.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.posix__basic_stream_descriptor.wait_type [*wait_type]]]
+    [[link asio.reference.posix__stream_descriptor.wait_type [*wait_type]]]
     [Wait types. ]
   
   ]
@@ -100985,117 +91423,117 @@
   [[Name][Description]]
 
   [
-    [[link asio.reference.posix__basic_stream_descriptor.assign [*assign]]]
+    [[link asio.reference.posix__stream_descriptor.assign [*assign]]]
     [Assign an existing native descriptor to the descriptor. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_stream_descriptor.async_read_some [*async_read_some]]]
+    [[link asio.reference.posix__stream_descriptor.async_read_some [*async_read_some]]]
     [Start an asynchronous read. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_stream_descriptor.async_wait [*async_wait]]]
+    [[link asio.reference.posix__stream_descriptor.async_wait [*async_wait]]]
     [Asynchronously wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_stream_descriptor.async_write_some [*async_write_some]]]
+    [[link asio.reference.posix__stream_descriptor.async_write_some [*async_write_some]]]
     [Start an asynchronous write. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_stream_descriptor.basic_stream_descriptor [*basic_stream_descriptor]]]
-    [Construct a basic_stream_descriptor without opening it. 
-
-     Construct a basic_stream_descriptor on an existing native descriptor. 
-
-     Move-construct a basic_stream_descriptor from another. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__basic_stream_descriptor.cancel [*cancel]]]
+    [[link asio.reference.posix__stream_descriptor.cancel [*cancel]]]
     [Cancel all asynchronous operations associated with the descriptor. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_stream_descriptor.close [*close]]]
+    [[link asio.reference.posix__stream_descriptor.close [*close]]]
     [Close the descriptor. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_stream_descriptor.get_executor [*get_executor]]]
+    [[link asio.reference.posix__stream_descriptor.get_executor [*get_executor]]]
     [Get the executor associated with the object. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_stream_descriptor.get_io_context [*get_io_context]]]
+    [[link asio.reference.posix__stream_descriptor.get_io_context [*get_io_context]]]
     [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_stream_descriptor.get_io_service [*get_io_service]]]
+    [[link asio.reference.posix__stream_descriptor.get_io_service [*get_io_service]]]
     [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_stream_descriptor.io_control [*io_control]]]
+    [[link asio.reference.posix__stream_descriptor.io_control [*io_control]]]
     [Perform an IO control command on the descriptor. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_stream_descriptor.is_open [*is_open]]]
+    [[link asio.reference.posix__stream_descriptor.is_open [*is_open]]]
     [Determine whether the descriptor is open. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_stream_descriptor.lowest_layer [*lowest_layer]]]
+    [[link asio.reference.posix__stream_descriptor.lowest_layer [*lowest_layer]]]
     [Get a reference to the lowest layer. 
 
      Get a const reference to the lowest layer. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_stream_descriptor.native_handle [*native_handle]]]
+    [[link asio.reference.posix__stream_descriptor.native_handle [*native_handle]]]
     [Get the native descriptor representation. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_stream_descriptor.native_non_blocking [*native_non_blocking]]]
+    [[link asio.reference.posix__stream_descriptor.native_non_blocking [*native_non_blocking]]]
     [Gets the non-blocking mode of the native descriptor implementation. 
 
      Sets the non-blocking mode of the native descriptor implementation. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_stream_descriptor.non_blocking [*non_blocking]]]
+    [[link asio.reference.posix__stream_descriptor.non_blocking [*non_blocking]]]
     [Gets the non-blocking mode of the descriptor. 
 
      Sets the non-blocking mode of the descriptor. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_stream_descriptor.operator_eq_ [*operator=]]]
-    [Move-assign a basic_stream_descriptor from another. ]
+    [[link asio.reference.posix__stream_descriptor.operator_eq_ [*operator=]]]
+    [Move-assign a stream_descriptor from another. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_stream_descriptor.read_some [*read_some]]]
+    [[link asio.reference.posix__stream_descriptor.read_some [*read_some]]]
     [Read some data from the descriptor. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_stream_descriptor.release [*release]]]
+    [[link asio.reference.posix__stream_descriptor.release [*release]]]
     [Release ownership of the native descriptor implementation. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_stream_descriptor.wait [*wait]]]
+    [[link asio.reference.posix__stream_descriptor.stream_descriptor [*stream_descriptor]]]
+    [Construct a stream_descriptor without opening it. 
+
+     Construct a stream_descriptor on an existing native descriptor. 
+
+     Move-construct a stream_descriptor from another. ]
+  ]
+  
+  [
+    [[link asio.reference.posix__stream_descriptor.wait [*wait]]]
     [Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_stream_descriptor.write_some [*write_some]]]
+    [[link asio.reference.posix__stream_descriptor.write_some [*write_some]]]
     [Write some data to the descriptor. ]
   ]
   
@@ -101106,18 +91544,18 @@
   [[Name][Description]]
 
   [
-    [[link asio.reference.posix__basic_stream_descriptor.get_implementation [*get_implementation]]]
+    [[link asio.reference.posix__stream_descriptor.get_implementation [*get_implementation]]]
     [Get the underlying implementation of the I/O object. ]
   ]
   
   [
-    [[link asio.reference.posix__basic_stream_descriptor.get_service [*get_service]]]
+    [[link asio.reference.posix__stream_descriptor.get_service [*get_service]]]
     [Get the service associated with the I/O object. ]
   ]
   
 ]
 
-The [link asio.reference.posix__basic_stream_descriptor `posix::basic_stream_descriptor`] class template provides asynchronous and blocking stream-oriented descriptor functionality.
+The [link asio.reference.posix__stream_descriptor `posix::stream_descriptor`] class template provides asynchronous and blocking stream-oriented descriptor functionality.
 
 
 [heading Thread Safety]
@@ -101129,6 +91567,279 @@
 
 
 
+[heading Requirements]
+
+['Header: ][^asio/posix/stream_descriptor.hpp]
+
+['Convenience header: ][^asio.hpp]
+
+[section:assign posix::stream_descriptor::assign]
+
+[indexterm2 assign..posix::stream_descriptor] 
+Assign an existing native descriptor to the descriptor. 
+
+
+  void ``[link asio.reference.posix__stream_descriptor.assign.overload1 assign]``(
+      const native_handle_type & native_descriptor);
+  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor.assign.overload1 more...]]``
+
+  asio::error_code ``[link asio.reference.posix__stream_descriptor.assign.overload2 assign]``(
+      const native_handle_type & native_descriptor,
+      asio::error_code & ec);
+  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor.assign.overload2 more...]]``
+
+
+[section:overload1 posix::stream_descriptor::assign (1 of 2 overloads)]
+
+
+['Inherited from posix::descriptor.]
+
+
+Assign an existing native descriptor to the descriptor. 
+
+
+  void assign(
+      const native_handle_type & native_descriptor);
+
+
+
+[endsect]
+
+
+
+[section:overload2 posix::stream_descriptor::assign (2 of 2 overloads)]
+
+
+['Inherited from posix::descriptor.]
+
+
+Assign an existing native descriptor to the descriptor. 
+
+
+  asio::error_code assign(
+      const native_handle_type & native_descriptor,
+      asio::error_code & ec);
+
+
+
+[endsect]
+
+
+[endsect]
+
+
+[section:async_read_some posix::stream_descriptor::async_read_some]
+
+[indexterm2 async_read_some..posix::stream_descriptor] 
+Start an asynchronous read. 
+
+
+  template<
+      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
+      typename ``[link asio.reference.ReadHandler ReadHandler]``>
+  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_some(
+      const MutableBufferSequence & buffers,
+      ReadHandler && handler);
+
+
+This function is used to asynchronously read data from the stream descriptor. The function call always returns immediately.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[buffers][One or more buffers into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]
+
+[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
+``
+   void handler(
+     const asio::error_code& error, // Result of operation.
+     std::size_t bytes_transferred           // Number of bytes read.
+   ); 
+``
+Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using `asio::io_context::post()`.]]
+
+]
+
+
+[heading Remarks]
+      
+The read operation may not read all of the requested number of bytes. Consider using the [link asio.reference.async_read `async_read`]  function if you need to ensure that the requested amount of data is read before the asynchronous operation completes.
+
+
+[heading Example]
+  
+To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 
+
+   descriptor.async_read_some(asio::buffer(data, size), handler);
+
+
+See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 
+
+
+
+
+[endsect]
+
+
+
+[section:async_wait posix::stream_descriptor::async_wait]
+
+
+['Inherited from posix::descriptor.]
+
+[indexterm2 async_wait..posix::stream_descriptor] 
+Asynchronously wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. 
+
+
+  template<
+      typename ``[link asio.reference.WaitHandler WaitHandler]``>
+  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
+      wait_type w,
+      WaitHandler && handler);
+
+
+This function is used to perform an asynchronous wait for a descriptor to enter a ready to read, write or error condition state.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[w][Specifies the desired descriptor state.]]
+
+[[handler][The handler to be called when the wait operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
+``
+   void handler(
+     const asio::error_code& error // Result of operation
+   ); 
+``
+Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using `asio::io_context::post()`.]]
+
+]
+
+
+[heading Example]
+  
+
+
+   void wait_handler(const asio::error_code& error)
+   {
+     if (!error)
+     {
+       // Wait succeeded.
+     }
+   }
+
+   ...
+
+   asio::posix::stream_descriptor descriptor(io_context);
+   ...
+   descriptor.async_wait(
+       asio::posix::stream_descriptor::wait_read,
+       wait_handler);
+
+
+
+
+
+
+
+[endsect]
+
+
+
+[section:async_write_some posix::stream_descriptor::async_write_some]
+
+[indexterm2 async_write_some..posix::stream_descriptor] 
+Start an asynchronous write. 
+
+
+  template<
+      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
+      typename ``[link asio.reference.WriteHandler WriteHandler]``>
+  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_write_some(
+      const ConstBufferSequence & buffers,
+      WriteHandler && handler);
+
+
+This function is used to asynchronously write data to the stream descriptor. The function call always returns immediately.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[buffers][One or more data buffers to be written to the descriptor. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]
+
+[[handler][The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
+``
+   void handler(
+     const asio::error_code& error, // Result of operation.
+     std::size_t bytes_transferred           // Number of bytes written.
+   ); 
+``
+Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using `asio::io_context::post()`.]]
+
+]
+
+
+[heading Remarks]
+      
+The write operation may not transmit all of the data to the peer. Consider using the [link asio.reference.async_write `async_write`]  function if you need to ensure that all data is written before the asynchronous operation completes.
+
+
+[heading Example]
+  
+To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 
+
+   descriptor.async_write_some(asio::buffer(data, size), handler);
+
+
+See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 
+
+
+
+
+[endsect]
+
+
+
+[section:bytes_readable posix::stream_descriptor::bytes_readable]
+
+
+['Inherited from posix::descriptor.]
+
+[indexterm2 bytes_readable..posix::stream_descriptor] 
+IO control command to get the amount of data that can be read without blocking. 
+
+
+  typedef implementation_defined bytes_readable;
+
+
+
+Implements the FIONREAD IO control command.
+
+
+[heading Example]
+  
+
+
+   asio::posix::stream_descriptor descriptor(io_context); 
+   ...
+   asio::descriptor_base::bytes_readable command(true);
+   descriptor.io_control(command);
+   std::size_t bytes_readable = command.get();
+
+
+
+
+
+
 
 [heading Requirements]
 
@@ -101140,14 +91851,643 @@
 [endsect]
 
 
-[section:posix__stream_descriptor_service posix::stream_descriptor_service]
+[section:cancel posix::stream_descriptor::cancel]
+
+[indexterm2 cancel..posix::stream_descriptor] 
+Cancel all asynchronous operations associated with the descriptor. 
 
 
-Default service implementation for a stream descriptor. 
+  void ``[link asio.reference.posix__stream_descriptor.cancel.overload1 cancel]``();
+  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor.cancel.overload1 more...]]``
+
+  asio::error_code ``[link asio.reference.posix__stream_descriptor.cancel.overload2 cancel]``(
+      asio::error_code & ec);
+  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor.cancel.overload2 more...]]``
 
 
-  class stream_descriptor_service :
-    public io_context::service
+[section:overload1 posix::stream_descriptor::cancel (1 of 2 overloads)]
+
+
+['Inherited from posix::descriptor.]
+
+
+Cancel all asynchronous operations associated with the descriptor. 
+
+
+  void cancel();
+
+
+This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[asio::system_error][Thrown on failure. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+
+[section:overload2 posix::stream_descriptor::cancel (2 of 2 overloads)]
+
+
+['Inherited from posix::descriptor.]
+
+
+Cancel all asynchronous operations associated with the descriptor. 
+
+
+  asio::error_code cancel(
+      asio::error_code & ec);
+
+
+This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[ec][Set to indicate what error occurred, if any. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+[endsect]
+
+[section:close posix::stream_descriptor::close]
+
+[indexterm2 close..posix::stream_descriptor] 
+Close the descriptor. 
+
+
+  void ``[link asio.reference.posix__stream_descriptor.close.overload1 close]``();
+  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor.close.overload1 more...]]``
+
+  asio::error_code ``[link asio.reference.posix__stream_descriptor.close.overload2 close]``(
+      asio::error_code & ec);
+  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor.close.overload2 more...]]``
+
+
+[section:overload1 posix::stream_descriptor::close (1 of 2 overloads)]
+
+
+['Inherited from posix::descriptor.]
+
+
+Close the descriptor. 
+
+
+  void close();
+
+
+This function is used to close the descriptor. Any asynchronous read or write operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[asio::system_error][Thrown on failure. Note that, even if the function indicates an error, the underlying descriptor is closed. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+
+[section:overload2 posix::stream_descriptor::close (2 of 2 overloads)]
+
+
+['Inherited from posix::descriptor.]
+
+
+Close the descriptor. 
+
+
+  asio::error_code close(
+      asio::error_code & ec);
+
+
+This function is used to close the descriptor. Any asynchronous read or write operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[ec][Set to indicate what error occurred, if any. Note that, even if the function indicates an error, the underlying descriptor is closed. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+[endsect]
+
+
+[section:executor_type posix::stream_descriptor::executor_type]
+
+
+['Inherited from posix::descriptor.]
+
+[indexterm2 executor_type..posix::stream_descriptor] 
+The type of the executor associated with the object. 
+
+
+  typedef io_context::executor_type executor_type;
+
+
+[heading Member Functions]
+[table
+  [[Name][Description]]
+
+  [
+    [[link asio.reference.io_context__executor_type.context [*context]]]
+    [Obtain the underlying execution context. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context__executor_type.defer [*defer]]]
+    [Request the io_context to invoke the given function object. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context__executor_type.dispatch [*dispatch]]]
+    [Request the io_context to invoke the given function object. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context__executor_type.on_work_finished [*on_work_finished]]]
+    [Inform the io_context that some work is no longer outstanding. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context__executor_type.on_work_started [*on_work_started]]]
+    [Inform the io_context that it has some outstanding work to do. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context__executor_type.post [*post]]]
+    [Request the io_context to invoke the given function object. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context__executor_type.running_in_this_thread [*running_in_this_thread]]]
+    [Determine whether the io_context is running in the current thread. ]
+  ]
+  
+]
+
+[heading Friends]
+[table
+  [[Name][Description]]
+
+  [
+    [[link asio.reference.io_context__executor_type.operator_not__eq_ [*operator!=]]]
+    [Compare two executors for inequality. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context__executor_type.operator_eq__eq_ [*operator==]]]
+    [Compare two executors for equality. ]
+  ]
+  
+]
+
+
+[heading Requirements]
+
+['Header: ][^asio/posix/stream_descriptor.hpp]
+
+['Convenience header: ][^asio.hpp]
+
+
+[endsect]
+
+
+
+[section:get_executor posix::stream_descriptor::get_executor]
+
+
+['Inherited from posix::descriptor.]
+
+[indexterm2 get_executor..posix::stream_descriptor] 
+Get the executor associated with the object. 
+
+
+  executor_type get_executor();
+
+
+
+[endsect]
+
+
+[section:get_implementation posix::stream_descriptor::get_implementation]
+
+[indexterm2 get_implementation..posix::stream_descriptor] 
+Get the underlying implementation of the I/O object. 
+
+
+  implementation_type & ``[link asio.reference.posix__stream_descriptor.get_implementation.overload1 get_implementation]``();
+  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor.get_implementation.overload1 more...]]``
+
+  const implementation_type & ``[link asio.reference.posix__stream_descriptor.get_implementation.overload2 get_implementation]``() const;
+  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor.get_implementation.overload2 more...]]``
+
+
+[section:overload1 posix::stream_descriptor::get_implementation (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the underlying implementation of the I/O object. 
+
+
+  implementation_type & get_implementation();
+
+
+
+[endsect]
+
+
+
+[section:overload2 posix::stream_descriptor::get_implementation (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the underlying implementation of the I/O object. 
+
+
+  const implementation_type & get_implementation() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
+
+[section:get_io_context posix::stream_descriptor::get_io_context]
+
+
+['Inherited from posix::descriptor.]
+
+[indexterm2 get_io_context..posix::stream_descriptor] 
+(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
+
+
+  asio::io_context & get_io_context();
+
+
+This function may be used to obtain the [link asio.reference.io_context `io_context`] object that the I/O object uses to dispatch handlers for asynchronous operations.
+
+
+[heading Return Value]
+      
+A reference to the [link asio.reference.io_context `io_context`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 
+
+
+
+
+[endsect]
+
+
+
+[section:get_io_service posix::stream_descriptor::get_io_service]
+
+
+['Inherited from posix::descriptor.]
+
+[indexterm2 get_io_service..posix::stream_descriptor] 
+(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
+
+
+  asio::io_context & get_io_service();
+
+
+This function may be used to obtain the [link asio.reference.io_context `io_context`] object that the I/O object uses to dispatch handlers for asynchronous operations.
+
+
+[heading Return Value]
+      
+A reference to the [link asio.reference.io_context `io_context`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 
+
+
+
+
+[endsect]
+
+
+[section:get_service posix::stream_descriptor::get_service]
+
+[indexterm2 get_service..posix::stream_descriptor] 
+Get the service associated with the I/O object. 
+
+
+  service_type & ``[link asio.reference.posix__stream_descriptor.get_service.overload1 get_service]``();
+  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor.get_service.overload1 more...]]``
+
+  const service_type & ``[link asio.reference.posix__stream_descriptor.get_service.overload2 get_service]``() const;
+  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor.get_service.overload2 more...]]``
+
+
+[section:overload1 posix::stream_descriptor::get_service (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object. 
+
+
+  service_type & get_service();
+
+
+
+[endsect]
+
+
+
+[section:overload2 posix::stream_descriptor::get_service (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object. 
+
+
+  const service_type & get_service() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
+[section:io_control posix::stream_descriptor::io_control]
+
+[indexterm2 io_control..posix::stream_descriptor] 
+Perform an IO control command on the descriptor. 
+
+
+  template<
+      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
+  void ``[link asio.reference.posix__stream_descriptor.io_control.overload1 io_control]``(
+      IoControlCommand & command);
+  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor.io_control.overload1 more...]]``
+
+  template<
+      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
+  asio::error_code ``[link asio.reference.posix__stream_descriptor.io_control.overload2 io_control]``(
+      IoControlCommand & command,
+      asio::error_code & ec);
+  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor.io_control.overload2 more...]]``
+
+
+[section:overload1 posix::stream_descriptor::io_control (1 of 2 overloads)]
+
+
+['Inherited from posix::descriptor.]
+
+
+Perform an IO control command on the descriptor. 
+
+
+  template<
+      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
+  void io_control(
+      IoControlCommand & command);
+
+
+This function is used to execute an IO control command on the descriptor.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[command][The IO control command to be performed on the descriptor.]]
+
+]
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[asio::system_error][Thrown on failure.]]
+
+]
+
+
+
+[heading Example]
+  
+Getting the number of bytes ready to read: 
+
+   asio::posix::stream_descriptor descriptor(io_context);
+   ...
+   asio::posix::stream_descriptor::bytes_readable command;
+   descriptor.io_control(command);
+   std::size_t bytes_readable = command.get();
+
+
+
+
+
+
+
+[endsect]
+
+
+
+[section:overload2 posix::stream_descriptor::io_control (2 of 2 overloads)]
+
+
+['Inherited from posix::descriptor.]
+
+
+Perform an IO control command on the descriptor. 
+
+
+  template<
+      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
+  asio::error_code io_control(
+      IoControlCommand & command,
+      asio::error_code & ec);
+
+
+This function is used to execute an IO control command on the descriptor.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[command][The IO control command to be performed on the descriptor.]]
+
+[[ec][Set to indicate what error occurred, if any.]]
+
+]
+
+
+
+[heading Example]
+  
+Getting the number of bytes ready to read: 
+
+   asio::posix::stream_descriptor descriptor(io_context);
+   ...
+   asio::posix::stream_descriptor::bytes_readable command;
+   asio::error_code ec;
+   descriptor.io_control(command, ec);
+   if (ec)
+   {
+     // An error occurred.
+   }
+   std::size_t bytes_readable = command.get();
+
+
+
+
+
+
+
+[endsect]
+
+
+[endsect]
+
+
+[section:is_open posix::stream_descriptor::is_open]
+
+
+['Inherited from posix::descriptor.]
+
+[indexterm2 is_open..posix::stream_descriptor] 
+Determine whether the descriptor is open. 
+
+
+  bool is_open() const;
+
+
+
+[endsect]
+
+
+[section:lowest_layer posix::stream_descriptor::lowest_layer]
+
+[indexterm2 lowest_layer..posix::stream_descriptor] 
+Get a reference to the lowest layer. 
+
+
+  lowest_layer_type & ``[link asio.reference.posix__stream_descriptor.lowest_layer.overload1 lowest_layer]``();
+  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor.lowest_layer.overload1 more...]]``
+
+
+Get a const reference to the lowest layer. 
+
+
+  const lowest_layer_type & ``[link asio.reference.posix__stream_descriptor.lowest_layer.overload2 lowest_layer]``() const;
+  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor.lowest_layer.overload2 more...]]``
+
+
+[section:overload1 posix::stream_descriptor::lowest_layer (1 of 2 overloads)]
+
+
+['Inherited from posix::descriptor.]
+
+
+Get a reference to the lowest layer. 
+
+
+  lowest_layer_type & lowest_layer();
+
+
+This function returns a reference to the lowest layer in a stack of layers. Since a descriptor cannot contain any further layers, it simply returns a reference to itself.
+
+
+[heading Return Value]
+      
+A reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 
+
+
+
+
+[endsect]
+
+
+
+[section:overload2 posix::stream_descriptor::lowest_layer (2 of 2 overloads)]
+
+
+['Inherited from posix::descriptor.]
+
+
+Get a const reference to the lowest layer. 
+
+
+  const lowest_layer_type & lowest_layer() const;
+
+
+This function returns a const reference to the lowest layer in a stack of layers. Since a descriptor cannot contain any further layers, it simply returns a reference to itself.
+
+
+[heading Return Value]
+      
+A const reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 
+
+
+
+
+[endsect]
+
+
+[endsect]
+
+
+[section:lowest_layer_type posix::stream_descriptor::lowest_layer_type]
+
+
+['Inherited from posix::descriptor.]
+
+[indexterm2 lowest_layer_type..posix::stream_descriptor] 
+A descriptor is always the lowest layer. 
+
+
+  typedef descriptor lowest_layer_type;
 
 
 [heading Types]
@@ -101156,15 +92496,36 @@
 
   [
 
-    [[link asio.reference.posix__stream_descriptor_service.implementation_type [*implementation_type]]]
-    [The type of a stream descriptor implementation. ]
+    [[link asio.reference.posix__descriptor.bytes_readable [*bytes_readable]]]
+    [IO control command to get the amount of data that can be read without blocking. ]
   
   ]
 
   [
 
-    [[link asio.reference.posix__stream_descriptor_service.native_handle_type [*native_handle_type]]]
-    [The native descriptor type. ]
+    [[link asio.reference.posix__descriptor.executor_type [*executor_type]]]
+    [The type of the executor associated with the object. ]
+  
+  ]
+
+  [
+
+    [[link asio.reference.posix__descriptor.lowest_layer_type [*lowest_layer_type]]]
+    [A descriptor is always the lowest layer. ]
+  
+  ]
+
+  [
+
+    [[link asio.reference.posix__descriptor.native_handle_type [*native_handle_type]]]
+    [The native representation of a descriptor. ]
+  
+  ]
+
+  [
+
+    [[link asio.reference.posix__descriptor.wait_type [*wait_type]]]
+    [Wait types. ]
   
   ]
 
@@ -101175,338 +92536,138 @@
   [[Name][Description]]
 
   [
-    [[link asio.reference.posix__stream_descriptor_service.assign [*assign]]]
-    [Assign an existing native descriptor to a stream descriptor. ]
+    [[link asio.reference.posix__descriptor.assign [*assign]]]
+    [Assign an existing native descriptor to the descriptor. ]
   ]
   
   [
-    [[link asio.reference.posix__stream_descriptor_service.async_read_some [*async_read_some]]]
-    [Start an asynchronous read. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__stream_descriptor_service.async_wait [*async_wait]]]
+    [[link asio.reference.posix__descriptor.async_wait [*async_wait]]]
     [Asynchronously wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. ]
   ]
   
   [
-    [[link asio.reference.posix__stream_descriptor_service.async_write_some [*async_write_some]]]
-    [Start an asynchronous write. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__stream_descriptor_service.cancel [*cancel]]]
+    [[link asio.reference.posix__descriptor.cancel [*cancel]]]
     [Cancel all asynchronous operations associated with the descriptor. ]
   ]
   
   [
-    [[link asio.reference.posix__stream_descriptor_service.close [*close]]]
-    [Close a stream descriptor implementation. ]
+    [[link asio.reference.posix__descriptor.close [*close]]]
+    [Close the descriptor. ]
   ]
   
   [
-    [[link asio.reference.posix__stream_descriptor_service.construct [*construct]]]
-    [Construct a new stream descriptor implementation. ]
+    [[link asio.reference.posix__descriptor.descriptor [*descriptor]]]
+    [Construct a descriptor without opening it. 
+
+     Construct a descriptor on an existing native descriptor. 
+
+     Move-construct a descriptor from another. ]
   ]
   
   [
-    [[link asio.reference.posix__stream_descriptor_service.destroy [*destroy]]]
-    [Destroy a stream descriptor implementation. ]
+    [[link asio.reference.posix__descriptor.get_executor [*get_executor]]]
+    [Get the executor associated with the object. ]
   ]
   
   [
-    [[link asio.reference.posix__stream_descriptor_service.get_io_context [*get_io_context]]]
-    [Get the io_context object that owns the service. ]
+    [[link asio.reference.posix__descriptor.get_io_context [*get_io_context]]]
+    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
   ]
   
   [
-    [[link asio.reference.posix__stream_descriptor_service.get_io_service [*get_io_service]]]
-    [Get the io_context object that owns the service. ]
+    [[link asio.reference.posix__descriptor.get_io_service [*get_io_service]]]
+    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
   ]
   
   [
-    [[link asio.reference.posix__stream_descriptor_service.io_control [*io_control]]]
+    [[link asio.reference.posix__descriptor.io_control [*io_control]]]
     [Perform an IO control command on the descriptor. ]
   ]
   
   [
-    [[link asio.reference.posix__stream_descriptor_service.is_open [*is_open]]]
+    [[link asio.reference.posix__descriptor.is_open [*is_open]]]
     [Determine whether the descriptor is open. ]
   ]
   
   [
-    [[link asio.reference.posix__stream_descriptor_service.move_assign [*move_assign]]]
-    [Move-assign from another stream descriptor implementation. ]
+    [[link asio.reference.posix__descriptor.lowest_layer [*lowest_layer]]]
+    [Get a reference to the lowest layer. 
+
+     Get a const reference to the lowest layer. ]
   ]
   
   [
-    [[link asio.reference.posix__stream_descriptor_service.move_construct [*move_construct]]]
-    [Move-construct a new stream descriptor implementation. ]
+    [[link asio.reference.posix__descriptor.native_handle [*native_handle]]]
+    [Get the native descriptor representation. ]
   ]
   
   [
-    [[link asio.reference.posix__stream_descriptor_service.native_handle [*native_handle]]]
-    [Get the native descriptor implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__stream_descriptor_service.native_non_blocking [*native_non_blocking]]]
+    [[link asio.reference.posix__descriptor.native_non_blocking [*native_non_blocking]]]
     [Gets the non-blocking mode of the native descriptor implementation. 
 
      Sets the non-blocking mode of the native descriptor implementation. ]
   ]
   
   [
-    [[link asio.reference.posix__stream_descriptor_service.non_blocking [*non_blocking]]]
+    [[link asio.reference.posix__descriptor.non_blocking [*non_blocking]]]
     [Gets the non-blocking mode of the descriptor. 
 
      Sets the non-blocking mode of the descriptor. ]
   ]
   
   [
-    [[link asio.reference.posix__stream_descriptor_service.read_some [*read_some]]]
-    [Read some data from the stream. ]
+    [[link asio.reference.posix__descriptor.operator_eq_ [*operator=]]]
+    [Move-assign a descriptor from another. ]
   ]
   
   [
-    [[link asio.reference.posix__stream_descriptor_service.release [*release]]]
+    [[link asio.reference.posix__descriptor.release [*release]]]
     [Release ownership of the native descriptor implementation. ]
   ]
   
   [
-    [[link asio.reference.posix__stream_descriptor_service.stream_descriptor_service [*stream_descriptor_service]]]
-    [Construct a new stream descriptor service for the specified io_context. ]
-  ]
-  
-  [
-    [[link asio.reference.posix__stream_descriptor_service.wait [*wait]]]
+    [[link asio.reference.posix__descriptor.wait [*wait]]]
     [Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. ]
   ]
   
-  [
-    [[link asio.reference.posix__stream_descriptor_service.write_some [*write_some]]]
-    [Write the given data to the stream. ]
-  ]
-  
 ]
 
-[heading Data Members]
+[heading Protected Member Functions]
 [table
   [[Name][Description]]
 
   [
-    [[link asio.reference.posix__stream_descriptor_service.id [*id]]]
-    [The unique service identifier. ]
+    [[link asio.reference.posix__descriptor.get_implementation [*get_implementation]]]
+    [Get the underlying implementation of the I/O object. ]
   ]
-
+  
+  [
+    [[link asio.reference.posix__descriptor.get_service [*get_service]]]
+    [Get the service associated with the I/O object. ]
+  ]
+  
+  [
+    [[link asio.reference.posix__descriptor._descriptor [*~descriptor]]]
+    [Protected destructor to prevent deletion through this type. ]
+  ]
+  
 ]
 
-[heading Requirements]
+The [link asio.reference.posix__descriptor `posix::descriptor`] class template provides the ability to wrap a POSIX descriptor.
 
-['Header: ][^asio/posix/stream_descriptor_service.hpp]
 
-['Convenience header: ][^asio.hpp]
+[heading Thread Safety]
+  
+['Distinct] ['objects:] Safe.
 
-
-[section:assign posix::stream_descriptor_service::assign]
-
-[indexterm2 assign..posix::stream_descriptor_service] 
-Assign an existing native descriptor to a stream descriptor. 
-
-
-  asio::error_code assign(
-      implementation_type & impl,
-      const native_handle_type & native_descriptor,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:async_read_some posix::stream_descriptor_service::async_read_some]
-
-[indexterm2 async_read_some..posix::stream_descriptor_service] 
-Start an asynchronous read. 
-
-
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
-      typename ``[link asio.reference.ReadHandler ReadHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_some(
-      implementation_type & impl,
-      const MutableBufferSequence & buffers,
-      ReadHandler && handler);
-
-
-
-[endsect]
-
-
-
-[section:async_wait posix::stream_descriptor_service::async_wait]
-
-[indexterm2 async_wait..posix::stream_descriptor_service] 
-Asynchronously wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. 
-
-
-  template<
-      typename ``[link asio.reference.WaitHandler WaitHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
-      implementation_type & impl,
-      descriptor_base::wait_type w,
-      WaitHandler && handler);
-
-
-
-[endsect]
-
-
-
-[section:async_write_some posix::stream_descriptor_service::async_write_some]
-
-[indexterm2 async_write_some..posix::stream_descriptor_service] 
-Start an asynchronous write. 
-
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
-      typename ``[link asio.reference.WriteHandler WriteHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_write_some(
-      implementation_type & impl,
-      const ConstBufferSequence & buffers,
-      WriteHandler && handler);
-
-
-
-[endsect]
-
-
-
-[section:cancel posix::stream_descriptor_service::cancel]
-
-[indexterm2 cancel..posix::stream_descriptor_service] 
-Cancel all asynchronous operations associated with the descriptor. 
-
-
-  asio::error_code cancel(
-      implementation_type & impl,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:close posix::stream_descriptor_service::close]
-
-[indexterm2 close..posix::stream_descriptor_service] 
-Close a stream descriptor implementation. 
-
-
-  asio::error_code close(
-      implementation_type & impl,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:construct posix::stream_descriptor_service::construct]
-
-[indexterm2 construct..posix::stream_descriptor_service] 
-Construct a new stream descriptor implementation. 
-
-
-  void construct(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:destroy posix::stream_descriptor_service::destroy]
-
-[indexterm2 destroy..posix::stream_descriptor_service] 
-Destroy a stream descriptor implementation. 
-
-
-  void destroy(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:get_io_context posix::stream_descriptor_service::get_io_context]
-
-
-['Inherited from io_context.]
-
-[indexterm2 get_io_context..posix::stream_descriptor_service] 
-Get the [link asio.reference.io_context `io_context`] object that owns the service. 
-
-
-  asio::io_context & get_io_context();
-
-
-
-[endsect]
-
-
-
-[section:get_io_service posix::stream_descriptor_service::get_io_service]
-
-
-['Inherited from io_context.]
-
-[indexterm2 get_io_service..posix::stream_descriptor_service] 
-Get the [link asio.reference.io_context `io_context`] object that owns the service. 
-
-
-  asio::io_context & get_io_service();
-
-
-
-[endsect]
-
-
-
-[section:id posix::stream_descriptor_service::id]
-
-[indexterm2 id..posix::stream_descriptor_service] 
-The unique service identifier. 
-
-
-  static asio::io_context::id id;
-
-
-
-[endsect]
-
-
-
-[section:implementation_type posix::stream_descriptor_service::implementation_type]
-
-[indexterm2 implementation_type..posix::stream_descriptor_service] 
-The type of a stream descriptor implementation. 
-
+['Shared] ['objects:] Unsafe. 
 
-  typedef implementation_defined implementation_type;
 
 
 
 [heading Requirements]
 
-['Header: ][^asio/posix/stream_descriptor_service.hpp]
+['Header: ][^asio/posix/stream_descriptor.hpp]
 
 ['Convenience header: ][^asio.hpp]
 
@@ -101515,92 +92676,32 @@
 
 
 
-[section:io_control posix::stream_descriptor_service::io_control]
-
-[indexterm2 io_control..posix::stream_descriptor_service] 
-Perform an IO control command on the descriptor. 
+[section:native_handle posix::stream_descriptor::native_handle]
 
 
-  template<
-      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
-  asio::error_code io_control(
-      implementation_type & impl,
-      IoControlCommand & command,
-      asio::error_code & ec);
+['Inherited from posix::descriptor.]
 
+[indexterm2 native_handle..posix::stream_descriptor] 
+Get the native descriptor representation. 
+
+
+  native_handle_type native_handle();
+
+
+This function may be used to obtain the underlying representation of the descriptor. This is intended to allow access to native descriptor functionality that is not otherwise provided. 
 
 
 [endsect]
 
 
 
-[section:is_open posix::stream_descriptor_service::is_open]
-
-[indexterm2 is_open..posix::stream_descriptor_service] 
-Determine whether the descriptor is open. 
+[section:native_handle_type posix::stream_descriptor::native_handle_type]
 
 
-  bool is_open(
-      const implementation_type & impl) const;
+['Inherited from posix::descriptor.]
 
-
-
-[endsect]
-
-
-
-[section:move_assign posix::stream_descriptor_service::move_assign]
-
-[indexterm2 move_assign..posix::stream_descriptor_service] 
-Move-assign from another stream descriptor implementation. 
-
-
-  void move_assign(
-      implementation_type & impl,
-      stream_descriptor_service & other_service,
-      implementation_type & other_impl);
-
-
-
-[endsect]
-
-
-
-[section:move_construct posix::stream_descriptor_service::move_construct]
-
-[indexterm2 move_construct..posix::stream_descriptor_service] 
-Move-construct a new stream descriptor implementation. 
-
-
-  void move_construct(
-      implementation_type & impl,
-      implementation_type & other_impl);
-
-
-
-[endsect]
-
-
-
-[section:native_handle posix::stream_descriptor_service::native_handle]
-
-[indexterm2 native_handle..posix::stream_descriptor_service] 
-Get the native descriptor implementation. 
-
-
-  native_handle_type native_handle(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:native_handle_type posix::stream_descriptor_service::native_handle_type]
-
-[indexterm2 native_handle_type..posix::stream_descriptor_service] 
-The native descriptor type. 
+[indexterm2 native_handle_type..posix::stream_descriptor] 
+The native representation of a descriptor. 
 
 
   typedef implementation_defined native_handle_type;
@@ -101609,7 +92710,7 @@
 
 [heading Requirements]
 
-['Header: ][^asio/posix/stream_descriptor_service.hpp]
+['Header: ][^asio/posix/stream_descriptor.hpp]
 
 ['Convenience header: ][^asio.hpp]
 
@@ -101617,35 +92718,53 @@
 [endsect]
 
 
-[section:native_non_blocking posix::stream_descriptor_service::native_non_blocking]
+[section:native_non_blocking posix::stream_descriptor::native_non_blocking]
 
-[indexterm2 native_non_blocking..posix::stream_descriptor_service] 
+[indexterm2 native_non_blocking..posix::stream_descriptor] 
 Gets the non-blocking mode of the native descriptor implementation. 
 
 
-  bool ``[link asio.reference.posix__stream_descriptor_service.native_non_blocking.overload1 native_non_blocking]``(
-      const implementation_type & impl) const;
-  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor_service.native_non_blocking.overload1 more...]]``
+  bool ``[link asio.reference.posix__stream_descriptor.native_non_blocking.overload1 native_non_blocking]``() const;
+  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor.native_non_blocking.overload1 more...]]``
 
 
 Sets the non-blocking mode of the native descriptor implementation. 
 
 
-  asio::error_code ``[link asio.reference.posix__stream_descriptor_service.native_non_blocking.overload2 native_non_blocking]``(
-      implementation_type & impl,
+  void ``[link asio.reference.posix__stream_descriptor.native_non_blocking.overload2 native_non_blocking]``(
+      bool mode);
+  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor.native_non_blocking.overload2 more...]]``
+
+  asio::error_code ``[link asio.reference.posix__stream_descriptor.native_non_blocking.overload3 native_non_blocking]``(
       bool mode,
       asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor_service.native_non_blocking.overload2 more...]]``
+  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor.native_non_blocking.overload3 more...]]``
 
 
-[section:overload1 posix::stream_descriptor_service::native_non_blocking (1 of 2 overloads)]
+[section:overload1 posix::stream_descriptor::native_non_blocking (1 of 3 overloads)]
+
+
+['Inherited from posix::descriptor.]
 
 
 Gets the non-blocking mode of the native descriptor implementation. 
 
 
-  bool native_non_blocking(
-      const implementation_type & impl) const;
+  bool native_non_blocking() const;
+
+
+This function is used to retrieve the non-blocking mode of the underlying native descriptor. This mode has no effect on the behaviour of the descriptor object's synchronous operations.
+
+
+[heading Return Value]
+      
+`true` if the underlying descriptor is in non-blocking mode and direct system calls may fail with `asio::error::would_block` (or the equivalent system error).
+
+
+[heading Remarks]
+      
+The current non-blocking mode is cached by the descriptor object. Consequently, the return value may be incorrect if the non-blocking mode was set directly on the native descriptor. 
+
 
 
 
@@ -101653,53 +92772,129 @@
 
 
 
-[section:overload2 posix::stream_descriptor_service::native_non_blocking (2 of 2 overloads)]
+[section:overload2 posix::stream_descriptor::native_non_blocking (2 of 3 overloads)]
+
+
+['Inherited from posix::descriptor.]
+
+
+Sets the non-blocking mode of the native descriptor implementation. 
+
+
+  void native_non_blocking(
+      bool mode);
+
+
+This function is used to modify the non-blocking mode of the underlying native descriptor. It has no effect on the behaviour of the descriptor object's synchronous operations.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[mode][If `true`, the underlying descriptor is put into non-blocking mode and direct system calls may fail with `asio::error::would_block` (or the equivalent system error).]]
+
+]
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[asio::system_error][Thrown on failure. If the `mode` is `false`, but the current value of `non_blocking()` is `true`, this function fails with `asio::error::invalid_argument`, as the combination does not make sense. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+
+[section:overload3 posix::stream_descriptor::native_non_blocking (3 of 3 overloads)]
+
+
+['Inherited from posix::descriptor.]
 
 
 Sets the non-blocking mode of the native descriptor implementation. 
 
 
   asio::error_code native_non_blocking(
-      implementation_type & impl,
       bool mode,
       asio::error_code & ec);
 
 
+This function is used to modify the non-blocking mode of the underlying native descriptor. It has no effect on the behaviour of the descriptor object's synchronous operations.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[mode][If `true`, the underlying descriptor is put into non-blocking mode and direct system calls may fail with `asio::error::would_block` (or the equivalent system error).]]
+
+[[ec][Set to indicate what error occurred, if any. If the `mode` is `false`, but the current value of `non_blocking()` is `true`, this function fails with `asio::error::invalid_argument`, as the combination does not make sense. ]]
+
+]
+
+
+
 
 [endsect]
 
 
 [endsect]
 
-[section:non_blocking posix::stream_descriptor_service::non_blocking]
+[section:non_blocking posix::stream_descriptor::non_blocking]
 
-[indexterm2 non_blocking..posix::stream_descriptor_service] 
+[indexterm2 non_blocking..posix::stream_descriptor] 
 Gets the non-blocking mode of the descriptor. 
 
 
-  bool ``[link asio.reference.posix__stream_descriptor_service.non_blocking.overload1 non_blocking]``(
-      const implementation_type & impl) const;
-  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor_service.non_blocking.overload1 more...]]``
+  bool ``[link asio.reference.posix__stream_descriptor.non_blocking.overload1 non_blocking]``() const;
+  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor.non_blocking.overload1 more...]]``
 
 
 Sets the non-blocking mode of the descriptor. 
 
 
-  asio::error_code ``[link asio.reference.posix__stream_descriptor_service.non_blocking.overload2 non_blocking]``(
-      implementation_type & impl,
+  void ``[link asio.reference.posix__stream_descriptor.non_blocking.overload2 non_blocking]``(
+      bool mode);
+  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor.non_blocking.overload2 more...]]``
+
+  asio::error_code ``[link asio.reference.posix__stream_descriptor.non_blocking.overload3 non_blocking]``(
       bool mode,
       asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor_service.non_blocking.overload2 more...]]``
+  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor.non_blocking.overload3 more...]]``
 
 
-[section:overload1 posix::stream_descriptor_service::non_blocking (1 of 2 overloads)]
+[section:overload1 posix::stream_descriptor::non_blocking (1 of 3 overloads)]
+
+
+['Inherited from posix::descriptor.]
 
 
 Gets the non-blocking mode of the descriptor. 
 
 
-  bool non_blocking(
-      const implementation_type & impl) const;
+  bool non_blocking() const;
+
+
+
+[heading Return Value]
+      
+`true` if the descriptor's synchronous operations will fail with `asio::error::would_block` if they are unable to perform the requested operation immediately. If `false`, synchronous operations will block until complete.
+
+
+[heading Remarks]
+      
+The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error `asio::error::would_block`. 
+
 
 
 
@@ -101707,103 +92902,631 @@
 
 
 
-[section:overload2 posix::stream_descriptor_service::non_blocking (2 of 2 overloads)]
+[section:overload2 posix::stream_descriptor::non_blocking (2 of 3 overloads)]
+
+
+['Inherited from posix::descriptor.]
+
+
+Sets the non-blocking mode of the descriptor. 
+
+
+  void non_blocking(
+      bool mode);
+
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[mode][If `true`, the descriptor's synchronous operations will fail with `asio::error::would_block` if they are unable to perform the requested operation immediately. If `false`, synchronous operations will block until complete.]]
+
+]
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[asio::system_error][Thrown on failure.]]
+
+]
+
+
+[heading Remarks]
+      
+The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error `asio::error::would_block`. 
+
+
+
+
+[endsect]
+
+
+
+[section:overload3 posix::stream_descriptor::non_blocking (3 of 3 overloads)]
+
+
+['Inherited from posix::descriptor.]
 
 
 Sets the non-blocking mode of the descriptor. 
 
 
   asio::error_code non_blocking(
-      implementation_type & impl,
       bool mode,
       asio::error_code & ec);
 
 
 
+[heading Parameters]
+    
+
+[variablelist
+  
+[[mode][If `true`, the descriptor's synchronous operations will fail with `asio::error::would_block` if they are unable to perform the requested operation immediately. If `false`, synchronous operations will block until complete.]]
+
+[[ec][Set to indicate what error occurred, if any.]]
+
+]
+
+
+[heading Remarks]
+      
+The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error `asio::error::would_block`. 
+
+
+
+
 [endsect]
 
 
 [endsect]
 
 
-[section:read_some posix::stream_descriptor_service::read_some]
+[section:operator_eq_ posix::stream_descriptor::operator=]
 
-[indexterm2 read_some..posix::stream_descriptor_service] 
-Read some data from the stream. 
+[indexterm2 operator=..posix::stream_descriptor] 
+Move-assign a [link asio.reference.posix__stream_descriptor `posix::stream_descriptor`] from another. 
+
+
+  stream_descriptor & operator=(
+      stream_descriptor && other);
+
+
+This assignment operator moves a stream descriptor from one object to another.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[other][The other [link asio.reference.posix__stream_descriptor `posix::stream_descriptor`] object from which the move will occur.]]
+
+]
+
+
+[heading Remarks]
+      
+Following the move, the moved-from object is in the same state as if constructed using the `stream_descriptor(io_context&) constructor`. 
+
+
+
+
+[endsect]
+
+
+[section:read_some posix::stream_descriptor::read_some]
+
+[indexterm2 read_some..posix::stream_descriptor] 
+Read some data from the descriptor. 
+
+
+  template<
+      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
+  std::size_t ``[link asio.reference.posix__stream_descriptor.read_some.overload1 read_some]``(
+      const MutableBufferSequence & buffers);
+  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor.read_some.overload1 more...]]``
+
+  template<
+      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
+  std::size_t ``[link asio.reference.posix__stream_descriptor.read_some.overload2 read_some]``(
+      const MutableBufferSequence & buffers,
+      asio::error_code & ec);
+  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor.read_some.overload2 more...]]``
+
+
+[section:overload1 posix::stream_descriptor::read_some (1 of 2 overloads)]
+
+
+Read some data from the descriptor. 
 
 
   template<
       typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
   std::size_t read_some(
-      implementation_type & impl,
+      const MutableBufferSequence & buffers);
+
+
+This function is used to read data from the stream descriptor. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[buffers][One or more buffers into which the data will be read.]]
+
+]
+
+
+[heading Return Value]
+      
+The number of bytes read.
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[asio::system_error][Thrown on failure. An error code of `asio::error::eof` indicates that the connection was closed by the peer.]]
+
+]
+
+
+[heading Remarks]
+      
+The read\_some operation may not read all of the requested number of bytes. Consider using the [link asio.reference.read `read`]  function if you need to ensure that the requested amount of data is read before the blocking operation completes.
+
+
+[heading Example]
+  
+To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 
+
+   descriptor.read_some(asio::buffer(data, size));
+
+
+See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 
+
+
+
+
+[endsect]
+
+
+
+[section:overload2 posix::stream_descriptor::read_some (2 of 2 overloads)]
+
+
+Read some data from the descriptor. 
+
+
+  template<
+      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
+  std::size_t read_some(
       const MutableBufferSequence & buffers,
       asio::error_code & ec);
 
 
+This function is used to read data from the stream descriptor. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[buffers][One or more buffers into which the data will be read.]]
+
+[[ec][Set to indicate what error occurred, if any.]]
+
+]
+
+
+[heading Return Value]
+      
+The number of bytes read. Returns 0 if an error occurred.
+
+
+[heading Remarks]
+      
+The read\_some operation may not read all of the requested number of bytes. Consider using the [link asio.reference.read `read`]  function if you need to ensure that the requested amount of data is read before the blocking operation completes. 
+
+
+
 
 [endsect]
 
 
+[endsect]
 
-[section:release posix::stream_descriptor_service::release]
 
-[indexterm2 release..posix::stream_descriptor_service] 
+[section:release posix::stream_descriptor::release]
+
+
+['Inherited from posix::descriptor.]
+
+[indexterm2 release..posix::stream_descriptor] 
 Release ownership of the native descriptor implementation. 
 
 
-  native_handle_type release(
-      implementation_type & impl);
+  native_handle_type release();
 
 
+This function may be used to obtain the underlying representation of the descriptor. After calling this function, `is_open()` returns false. The caller is responsible for closing the descriptor.
+
+All outstanding asynchronous read or write operations will finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error. 
+
 
 [endsect]
 
 
+[section:stream_descriptor posix::stream_descriptor::stream_descriptor]
 
-[section:stream_descriptor_service posix::stream_descriptor_service::stream_descriptor_service]
-
-[indexterm2 stream_descriptor_service..posix::stream_descriptor_service] 
-Construct a new stream descriptor service for the specified [link asio.reference.io_context `io_context`]. 
+[indexterm2 stream_descriptor..posix::stream_descriptor] 
+Construct a [link asio.reference.posix__stream_descriptor `posix::stream_descriptor`] without opening it. 
 
 
-  stream_descriptor_service(
+  explicit ``[link asio.reference.posix__stream_descriptor.stream_descriptor.overload1 stream_descriptor]``(
+      asio::io_context & io_context);
+  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor.stream_descriptor.overload1 more...]]``
+
+
+Construct a [link asio.reference.posix__stream_descriptor `posix::stream_descriptor`] on an existing native descriptor. 
+
+
+  ``[link asio.reference.posix__stream_descriptor.stream_descriptor.overload2 stream_descriptor]``(
+      asio::io_context & io_context,
+      const native_handle_type & native_descriptor);
+  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor.stream_descriptor.overload2 more...]]``
+
+
+Move-construct a [link asio.reference.posix__stream_descriptor `posix::stream_descriptor`] from another. 
+
+
+  ``[link asio.reference.posix__stream_descriptor.stream_descriptor.overload3 stream_descriptor]``(
+      stream_descriptor && other);
+  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor.stream_descriptor.overload3 more...]]``
+
+
+[section:overload1 posix::stream_descriptor::stream_descriptor (1 of 3 overloads)]
+
+
+Construct a [link asio.reference.posix__stream_descriptor `posix::stream_descriptor`] without opening it. 
+
+
+  stream_descriptor(
       asio::io_context & io_context);
 
 
+This constructor creates a stream descriptor without opening it. The descriptor needs to be opened and then connected or accepted before data can be sent or received on it.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[io_context][The [link asio.reference.io_context `io_context`] object that the stream descriptor will use to dispatch handlers for any asynchronous operations performed on the descriptor. ]]
+
+]
+
+
+
 
 [endsect]
 
 
 
-[section:wait posix::stream_descriptor_service::wait]
+[section:overload2 posix::stream_descriptor::stream_descriptor (2 of 3 overloads)]
 
-[indexterm2 wait..posix::stream_descriptor_service] 
+
+Construct a [link asio.reference.posix__stream_descriptor `posix::stream_descriptor`] on an existing native descriptor. 
+
+
+  stream_descriptor(
+      asio::io_context & io_context,
+      const native_handle_type & native_descriptor);
+
+
+This constructor creates a stream descriptor object to hold an existing native descriptor.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[io_context][The [link asio.reference.io_context `io_context`] object that the stream descriptor will use to dispatch handlers for any asynchronous operations performed on the descriptor.]]
+
+[[native_descriptor][The new underlying descriptor implementation.]]
+
+]
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[asio::system_error][Thrown on failure. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+
+[section:overload3 posix::stream_descriptor::stream_descriptor (3 of 3 overloads)]
+
+
+Move-construct a [link asio.reference.posix__stream_descriptor `posix::stream_descriptor`] from another. 
+
+
+  stream_descriptor(
+      stream_descriptor && other);
+
+
+This constructor moves a stream descriptor from one object to another.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[other][The other [link asio.reference.posix__stream_descriptor `posix::stream_descriptor`] object from which the move will occur.]]
+
+]
+
+
+[heading Remarks]
+      
+Following the move, the moved-from object is in the same state as if constructed using the `stream_descriptor(io_context&) constructor`. 
+
+
+
+
+[endsect]
+
+
+[endsect]
+
+[section:wait posix::stream_descriptor::wait]
+
+[indexterm2 wait..posix::stream_descriptor] 
+Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. 
+
+
+  void ``[link asio.reference.posix__stream_descriptor.wait.overload1 wait]``(
+      wait_type w);
+  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor.wait.overload1 more...]]``
+
+  asio::error_code ``[link asio.reference.posix__stream_descriptor.wait.overload2 wait]``(
+      wait_type w,
+      asio::error_code & ec);
+  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor.wait.overload2 more...]]``
+
+
+[section:overload1 posix::stream_descriptor::wait (1 of 2 overloads)]
+
+
+['Inherited from posix::descriptor.]
+
+
+Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. 
+
+
+  void wait(
+      wait_type w);
+
+
+This function is used to perform a blocking wait for a descriptor to enter a ready to read, write or error condition state.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[w][Specifies the desired descriptor state.]]
+
+]
+
+
+[heading Example]
+  
+Waiting for a descriptor to become readable. 
+
+   asio::posix::stream_descriptor descriptor(io_context);
+   ...
+   descriptor.wait(asio::posix::stream_descriptor::wait_read);
+
+
+
+
+
+
+
+[endsect]
+
+
+
+[section:overload2 posix::stream_descriptor::wait (2 of 2 overloads)]
+
+
+['Inherited from posix::descriptor.]
+
+
 Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions. 
 
 
   asio::error_code wait(
-      implementation_type & impl,
-      descriptor_base::wait_type w,
+      wait_type w,
       asio::error_code & ec);
 
 
+This function is used to perform a blocking wait for a descriptor to enter a ready to read, write or error condition state.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[w][Specifies the desired descriptor state.]]
+
+[[ec][Set to indicate what error occurred, if any.]]
+
+]
+
+
+[heading Example]
+  
+Waiting for a descriptor to become readable. 
+
+   asio::posix::stream_descriptor descriptor(io_context);
+   ...
+   asio::error_code ec;
+   descriptor.wait(asio::posix::stream_descriptor::wait_read, ec);
+
+
+
+
+
+
 
 [endsect]
 
 
+[endsect]
 
-[section:write_some posix::stream_descriptor_service::write_some]
 
-[indexterm2 write_some..posix::stream_descriptor_service] 
-Write the given data to the stream. 
+[section:wait_type posix::stream_descriptor::wait_type]
+
+
+['Inherited from posix::descriptor.]
+
+[indexterm2 wait_type..posix::stream_descriptor] 
+Wait types. 
+
+
+  enum wait_type
+
+[indexterm2 wait_read..posix::stream_descriptor]
+[indexterm2 wait_write..posix::stream_descriptor]
+[indexterm2 wait_error..posix::stream_descriptor]
+
+[heading Values]
+[variablelist
+
+  [
+    [wait_read]
+    [Wait for a descriptor to become ready to read. ]
+  ]
+
+  [
+    [wait_write]
+    [Wait for a descriptor to become ready to write. ]
+  ]
+
+  [
+    [wait_error]
+    [Wait for a descriptor to have error conditions pending. ]
+  ]
+
+]
+
+
+For use with `descriptor::wait()` and `descriptor::async_wait()`. 
+
+
+[endsect]
+
+
+[section:write_some posix::stream_descriptor::write_some]
+
+[indexterm2 write_some..posix::stream_descriptor] 
+Write some data to the descriptor. 
+
+
+  template<
+      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
+  std::size_t ``[link asio.reference.posix__stream_descriptor.write_some.overload1 write_some]``(
+      const ConstBufferSequence & buffers);
+  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor.write_some.overload1 more...]]``
+
+  template<
+      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
+  std::size_t ``[link asio.reference.posix__stream_descriptor.write_some.overload2 write_some]``(
+      const ConstBufferSequence & buffers,
+      asio::error_code & ec);
+  ``  [''''&raquo;''' [link asio.reference.posix__stream_descriptor.write_some.overload2 more...]]``
+
+
+[section:overload1 posix::stream_descriptor::write_some (1 of 2 overloads)]
+
+
+Write some data to the descriptor. 
 
 
   template<
       typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
   std::size_t write_some(
-      implementation_type & impl,
-      const ConstBufferSequence & buffers,
-      asio::error_code & ec);
+      const ConstBufferSequence & buffers);
+
+
+This function is used to write data to the stream descriptor. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[buffers][One or more data buffers to be written to the descriptor.]]
+
+]
+
+
+[heading Return Value]
+      
+The number of bytes written.
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[asio::system_error][Thrown on failure. An error code of `asio::error::eof` indicates that the connection was closed by the peer.]]
+
+]
+
+
+[heading Remarks]
+      
+The write\_some operation may not transmit all of the data to the peer. Consider using the [link asio.reference.write `write`]  function if you need to ensure that all data is written before the blocking operation completes.
+
+
+[heading Example]
+  
+To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 
+
+   descriptor.write_some(asio::buffer(data, size));
+
+
+See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 
+
 
 
 
@@ -101811,6 +93534,52 @@
 
 
 
+[section:overload2 posix::stream_descriptor::write_some (2 of 2 overloads)]
+
+
+Write some data to the descriptor. 
+
+
+  template<
+      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
+  std::size_t write_some(
+      const ConstBufferSequence & buffers,
+      asio::error_code & ec);
+
+
+This function is used to write data to the stream descriptor. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[buffers][One or more data buffers to be written to the descriptor.]]
+
+[[ec][Set to indicate what error occurred, if any.]]
+
+]
+
+
+[heading Return Value]
+      
+The number of bytes written. Returns 0 if an error occurred.
+
+
+[heading Remarks]
+      
+The write\_some operation may not transmit all of the data to the peer. Consider using the [link asio.reference.write `write`]  function if you need to ensure that all data is written before the blocking operation completes. 
+
+
+
+
+[endsect]
+
+
+[endsect]
+
+
 [endsect]
 
 [section:post post]
@@ -101969,1092 +93738,6 @@
 
 [endsect]
 
-[section:raw_socket_service raw_socket_service]
-
-
-Default service implementation for a raw socket. 
-
-
-  template<
-      typename ``[link asio.reference.Protocol Protocol]``>
-  class raw_socket_service :
-    public io_context::service
-
-
-[heading Types]
-[table
-  [[Name][Description]]
-
-  [
-
-    [[link asio.reference.raw_socket_service.endpoint_type [*endpoint_type]]]
-    [The endpoint type. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.raw_socket_service.implementation_type [*implementation_type]]]
-    [The type of a raw socket. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.raw_socket_service.native_handle_type [*native_handle_type]]]
-    [The native socket type. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.raw_socket_service.protocol_type [*protocol_type]]]
-    [The protocol type. ]
-  
-  ]
-
-]
-
-[heading Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.raw_socket_service.assign [*assign]]]
-    [Assign an existing native socket to a raw socket. ]
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.async_connect [*async_connect]]]
-    [Start an asynchronous connect. ]
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.async_receive [*async_receive]]]
-    [Start an asynchronous receive. ]
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.async_receive_from [*async_receive_from]]]
-    [Start an asynchronous receive that will get the endpoint of the sender. ]
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.async_send [*async_send]]]
-    [Start an asynchronous send. ]
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.async_send_to [*async_send_to]]]
-    [Start an asynchronous send. ]
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.async_wait [*async_wait]]]
-    [Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.at_mark [*at_mark]]]
-    [Determine whether the socket is at the out-of-band data mark. ]
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.available [*available]]]
-    [Determine the number of bytes available for reading. ]
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.bind [*bind]]]
-    []
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.cancel [*cancel]]]
-    [Cancel all asynchronous operations associated with the socket. ]
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.close [*close]]]
-    [Close a raw socket implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.connect [*connect]]]
-    [Connect the raw socket to the specified endpoint. ]
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.construct [*construct]]]
-    [Construct a new raw socket implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.converting_move_construct [*converting_move_construct]]]
-    [Move-construct a new raw socket implementation from another protocol type. ]
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.destroy [*destroy]]]
-    [Destroy a raw socket implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.get_io_context [*get_io_context]]]
-    [Get the io_context object that owns the service. ]
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.get_io_service [*get_io_service]]]
-    [Get the io_context object that owns the service. ]
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.get_option [*get_option]]]
-    [Get a socket option. ]
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.io_control [*io_control]]]
-    [Perform an IO control command on the socket. ]
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.is_open [*is_open]]]
-    [Determine whether the socket is open. ]
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.local_endpoint [*local_endpoint]]]
-    [Get the local endpoint. ]
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.move_assign [*move_assign]]]
-    [Move-assign from another raw socket implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.move_construct [*move_construct]]]
-    [Move-construct a new raw socket implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.native_handle [*native_handle]]]
-    [Get the native socket implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.native_non_blocking [*native_non_blocking]]]
-    [Gets the non-blocking mode of the native socket implementation. 
-
-     Sets the non-blocking mode of the native socket implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.non_blocking [*non_blocking]]]
-    [Gets the non-blocking mode of the socket. 
-
-     Sets the non-blocking mode of the socket. ]
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.open [*open]]]
-    []
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.raw_socket_service [*raw_socket_service]]]
-    [Construct a new raw socket service for the specified io_context. ]
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.receive [*receive]]]
-    [Receive some data from the peer. ]
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.receive_from [*receive_from]]]
-    [Receive raw data with the endpoint of the sender. ]
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.remote_endpoint [*remote_endpoint]]]
-    [Get the remote endpoint. ]
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.send [*send]]]
-    [Send the given data to the peer. ]
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.send_to [*send_to]]]
-    [Send raw data to the specified endpoint. ]
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.set_option [*set_option]]]
-    [Set a socket option. ]
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.shutdown [*shutdown]]]
-    [Disable sends or receives on the socket. ]
-  ]
-  
-  [
-    [[link asio.reference.raw_socket_service.wait [*wait]]]
-    [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
-  ]
-  
-]
-
-[heading Data Members]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.raw_socket_service.id [*id]]]
-    [The unique service identifier. ]
-  ]
-
-]
-
-[heading Requirements]
-
-['Header: ][^asio/raw_socket_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[section:assign raw_socket_service::assign]
-
-[indexterm2 assign..raw_socket_service] 
-Assign an existing native socket to a raw socket. 
-
-
-  asio::error_code assign(
-      implementation_type & impl,
-      const protocol_type & protocol,
-      const native_handle_type & native_socket,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:async_connect raw_socket_service::async_connect]
-
-[indexterm2 async_connect..raw_socket_service] 
-Start an asynchronous connect. 
-
-
-  template<
-      typename ``[link asio.reference.ConnectHandler ConnectHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_connect(
-      implementation_type & impl,
-      const endpoint_type & peer_endpoint,
-      ConnectHandler && handler);
-
-
-
-[endsect]
-
-
-
-[section:async_receive raw_socket_service::async_receive]
-
-[indexterm2 async_receive..raw_socket_service] 
-Start an asynchronous receive. 
-
-
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
-      typename ``[link asio.reference.ReadHandler ReadHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_receive(
-      implementation_type & impl,
-      const MutableBufferSequence & buffers,
-      socket_base::message_flags flags,
-      ReadHandler && handler);
-
-
-
-[endsect]
-
-
-
-[section:async_receive_from raw_socket_service::async_receive_from]
-
-[indexterm2 async_receive_from..raw_socket_service] 
-Start an asynchronous receive that will get the endpoint of the sender. 
-
-
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
-      typename ``[link asio.reference.ReadHandler ReadHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_receive_from(
-      implementation_type & impl,
-      const MutableBufferSequence & buffers,
-      endpoint_type & sender_endpoint,
-      socket_base::message_flags flags,
-      ReadHandler && handler);
-
-
-
-[endsect]
-
-
-
-[section:async_send raw_socket_service::async_send]
-
-[indexterm2 async_send..raw_socket_service] 
-Start an asynchronous send. 
-
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
-      typename ``[link asio.reference.WriteHandler WriteHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_send(
-      implementation_type & impl,
-      const ConstBufferSequence & buffers,
-      socket_base::message_flags flags,
-      WriteHandler && handler);
-
-
-
-[endsect]
-
-
-
-[section:async_send_to raw_socket_service::async_send_to]
-
-[indexterm2 async_send_to..raw_socket_service] 
-Start an asynchronous send. 
-
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
-      typename ``[link asio.reference.WriteHandler WriteHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_send_to(
-      implementation_type & impl,
-      const ConstBufferSequence & buffers,
-      const endpoint_type & destination,
-      socket_base::message_flags flags,
-      WriteHandler && handler);
-
-
-
-[endsect]
-
-
-
-[section:async_wait raw_socket_service::async_wait]
-
-[indexterm2 async_wait..raw_socket_service] 
-Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. 
-
-
-  template<
-      typename ``[link asio.reference.WaitHandler WaitHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
-      implementation_type & impl,
-      socket_base::wait_type w,
-      WaitHandler && handler);
-
-
-
-[endsect]
-
-
-
-[section:at_mark raw_socket_service::at_mark]
-
-[indexterm2 at_mark..raw_socket_service] 
-Determine whether the socket is at the out-of-band data mark. 
-
-
-  bool at_mark(
-      const implementation_type & impl,
-      asio::error_code & ec) const;
-
-
-
-[endsect]
-
-
-
-[section:available raw_socket_service::available]
-
-[indexterm2 available..raw_socket_service] 
-Determine the number of bytes available for reading. 
-
-
-  std::size_t available(
-      const implementation_type & impl,
-      asio::error_code & ec) const;
-
-
-
-[endsect]
-
-
-
-[section:bind raw_socket_service::bind]
-
-[indexterm2 bind..raw_socket_service] 
-
-  asio::error_code bind(
-      implementation_type & impl,
-      const endpoint_type & endpoint,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:cancel raw_socket_service::cancel]
-
-[indexterm2 cancel..raw_socket_service] 
-Cancel all asynchronous operations associated with the socket. 
-
-
-  asio::error_code cancel(
-      implementation_type & impl,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:close raw_socket_service::close]
-
-[indexterm2 close..raw_socket_service] 
-Close a raw socket implementation. 
-
-
-  asio::error_code close(
-      implementation_type & impl,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:connect raw_socket_service::connect]
-
-[indexterm2 connect..raw_socket_service] 
-Connect the raw socket to the specified endpoint. 
-
-
-  asio::error_code connect(
-      implementation_type & impl,
-      const endpoint_type & peer_endpoint,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:construct raw_socket_service::construct]
-
-[indexterm2 construct..raw_socket_service] 
-Construct a new raw socket implementation. 
-
-
-  void construct(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:converting_move_construct raw_socket_service::converting_move_construct]
-
-[indexterm2 converting_move_construct..raw_socket_service] 
-Move-construct a new raw socket implementation from another protocol type. 
-
-
-  template<
-      typename ``[link asio.reference.Protocol Protocol1]``>
-  void converting_move_construct(
-      implementation_type & impl,
-      typename raw_socket_service< Protocol1 >::implementation_type & other_impl,
-      typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);
-
-
-
-[endsect]
-
-
-
-[section:destroy raw_socket_service::destroy]
-
-[indexterm2 destroy..raw_socket_service] 
-Destroy a raw socket implementation. 
-
-
-  void destroy(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:endpoint_type raw_socket_service::endpoint_type]
-
-[indexterm2 endpoint_type..raw_socket_service] 
-The endpoint type. 
-
-
-  typedef Protocol::endpoint endpoint_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/raw_socket_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:get_io_context raw_socket_service::get_io_context]
-
-
-['Inherited from io_context.]
-
-[indexterm2 get_io_context..raw_socket_service] 
-Get the [link asio.reference.io_context `io_context`] object that owns the service. 
-
-
-  asio::io_context & get_io_context();
-
-
-
-[endsect]
-
-
-
-[section:get_io_service raw_socket_service::get_io_service]
-
-
-['Inherited from io_context.]
-
-[indexterm2 get_io_service..raw_socket_service] 
-Get the [link asio.reference.io_context `io_context`] object that owns the service. 
-
-
-  asio::io_context & get_io_service();
-
-
-
-[endsect]
-
-
-
-[section:get_option raw_socket_service::get_option]
-
-[indexterm2 get_option..raw_socket_service] 
-Get a socket option. 
-
-
-  template<
-      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
-  asio::error_code get_option(
-      const implementation_type & impl,
-      GettableSocketOption & option,
-      asio::error_code & ec) const;
-
-
-
-[endsect]
-
-
-
-[section:id raw_socket_service::id]
-
-[indexterm2 id..raw_socket_service] 
-The unique service identifier. 
-
-
-  static asio::io_context::id id;
-
-
-
-[endsect]
-
-
-
-[section:implementation_type raw_socket_service::implementation_type]
-
-[indexterm2 implementation_type..raw_socket_service] 
-The type of a raw socket. 
-
-
-  typedef implementation_defined implementation_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/raw_socket_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:io_control raw_socket_service::io_control]
-
-[indexterm2 io_control..raw_socket_service] 
-Perform an IO control command on the socket. 
-
-
-  template<
-      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
-  asio::error_code io_control(
-      implementation_type & impl,
-      IoControlCommand & command,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:is_open raw_socket_service::is_open]
-
-[indexterm2 is_open..raw_socket_service] 
-Determine whether the socket is open. 
-
-
-  bool is_open(
-      const implementation_type & impl) const;
-
-
-
-[endsect]
-
-
-
-[section:local_endpoint raw_socket_service::local_endpoint]
-
-[indexterm2 local_endpoint..raw_socket_service] 
-Get the local endpoint. 
-
-
-  endpoint_type local_endpoint(
-      const implementation_type & impl,
-      asio::error_code & ec) const;
-
-
-
-[endsect]
-
-
-
-[section:move_assign raw_socket_service::move_assign]
-
-[indexterm2 move_assign..raw_socket_service] 
-Move-assign from another raw socket implementation. 
-
-
-  void move_assign(
-      implementation_type & impl,
-      raw_socket_service & other_service,
-      implementation_type & other_impl);
-
-
-
-[endsect]
-
-
-
-[section:move_construct raw_socket_service::move_construct]
-
-[indexterm2 move_construct..raw_socket_service] 
-Move-construct a new raw socket implementation. 
-
-
-  void move_construct(
-      implementation_type & impl,
-      implementation_type & other_impl);
-
-
-
-[endsect]
-
-
-
-[section:native_handle raw_socket_service::native_handle]
-
-[indexterm2 native_handle..raw_socket_service] 
-Get the native socket implementation. 
-
-
-  native_handle_type native_handle(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:native_handle_type raw_socket_service::native_handle_type]
-
-[indexterm2 native_handle_type..raw_socket_service] 
-The native socket type. 
-
-
-  typedef implementation_defined native_handle_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/raw_socket_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-[section:native_non_blocking raw_socket_service::native_non_blocking]
-
-[indexterm2 native_non_blocking..raw_socket_service] 
-Gets the non-blocking mode of the native socket implementation. 
-
-
-  bool ``[link asio.reference.raw_socket_service.native_non_blocking.overload1 native_non_blocking]``(
-      const implementation_type & impl) const;
-  ``  [''''&raquo;''' [link asio.reference.raw_socket_service.native_non_blocking.overload1 more...]]``
-
-
-Sets the non-blocking mode of the native socket implementation. 
-
-
-  asio::error_code ``[link asio.reference.raw_socket_service.native_non_blocking.overload2 native_non_blocking]``(
-      implementation_type & impl,
-      bool mode,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.raw_socket_service.native_non_blocking.overload2 more...]]``
-
-
-[section:overload1 raw_socket_service::native_non_blocking (1 of 2 overloads)]
-
-
-Gets the non-blocking mode of the native socket implementation. 
-
-
-  bool native_non_blocking(
-      const implementation_type & impl) const;
-
-
-
-[endsect]
-
-
-
-[section:overload2 raw_socket_service::native_non_blocking (2 of 2 overloads)]
-
-
-Sets the non-blocking mode of the native socket implementation. 
-
-
-  asio::error_code native_non_blocking(
-      implementation_type & impl,
-      bool mode,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-[endsect]
-
-[section:non_blocking raw_socket_service::non_blocking]
-
-[indexterm2 non_blocking..raw_socket_service] 
-Gets the non-blocking mode of the socket. 
-
-
-  bool ``[link asio.reference.raw_socket_service.non_blocking.overload1 non_blocking]``(
-      const implementation_type & impl) const;
-  ``  [''''&raquo;''' [link asio.reference.raw_socket_service.non_blocking.overload1 more...]]``
-
-
-Sets the non-blocking mode of the socket. 
-
-
-  asio::error_code ``[link asio.reference.raw_socket_service.non_blocking.overload2 non_blocking]``(
-      implementation_type & impl,
-      bool mode,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.raw_socket_service.non_blocking.overload2 more...]]``
-
-
-[section:overload1 raw_socket_service::non_blocking (1 of 2 overloads)]
-
-
-Gets the non-blocking mode of the socket. 
-
-
-  bool non_blocking(
-      const implementation_type & impl) const;
-
-
-
-[endsect]
-
-
-
-[section:overload2 raw_socket_service::non_blocking (2 of 2 overloads)]
-
-
-Sets the non-blocking mode of the socket. 
-
-
-  asio::error_code non_blocking(
-      implementation_type & impl,
-      bool mode,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:open raw_socket_service::open]
-
-[indexterm2 open..raw_socket_service] 
-
-  asio::error_code open(
-      implementation_type & impl,
-      const protocol_type & protocol,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:protocol_type raw_socket_service::protocol_type]
-
-[indexterm2 protocol_type..raw_socket_service] 
-The protocol type. 
-
-
-  typedef Protocol protocol_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/raw_socket_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:raw_socket_service raw_socket_service::raw_socket_service]
-
-[indexterm2 raw_socket_service..raw_socket_service] 
-Construct a new raw socket service for the specified [link asio.reference.io_context `io_context`]. 
-
-
-  raw_socket_service(
-      asio::io_context & io_context);
-
-
-
-[endsect]
-
-
-
-[section:receive raw_socket_service::receive]
-
-[indexterm2 receive..raw_socket_service] 
-Receive some data from the peer. 
-
-
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
-  std::size_t receive(
-      implementation_type & impl,
-      const MutableBufferSequence & buffers,
-      socket_base::message_flags flags,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:receive_from raw_socket_service::receive_from]
-
-[indexterm2 receive_from..raw_socket_service] 
-Receive raw data with the endpoint of the sender. 
-
-
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
-  std::size_t receive_from(
-      implementation_type & impl,
-      const MutableBufferSequence & buffers,
-      endpoint_type & sender_endpoint,
-      socket_base::message_flags flags,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:remote_endpoint raw_socket_service::remote_endpoint]
-
-[indexterm2 remote_endpoint..raw_socket_service] 
-Get the remote endpoint. 
-
-
-  endpoint_type remote_endpoint(
-      const implementation_type & impl,
-      asio::error_code & ec) const;
-
-
-
-[endsect]
-
-
-
-[section:send raw_socket_service::send]
-
-[indexterm2 send..raw_socket_service] 
-Send the given data to the peer. 
-
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
-  std::size_t send(
-      implementation_type & impl,
-      const ConstBufferSequence & buffers,
-      socket_base::message_flags flags,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:send_to raw_socket_service::send_to]
-
-[indexterm2 send_to..raw_socket_service] 
-Send raw data to the specified endpoint. 
-
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
-  std::size_t send_to(
-      implementation_type & impl,
-      const ConstBufferSequence & buffers,
-      const endpoint_type & destination,
-      socket_base::message_flags flags,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:set_option raw_socket_service::set_option]
-
-[indexterm2 set_option..raw_socket_service] 
-Set a socket option. 
-
-
-  template<
-      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
-  asio::error_code set_option(
-      implementation_type & impl,
-      const SettableSocketOption & option,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:shutdown raw_socket_service::shutdown]
-
-[indexterm2 shutdown..raw_socket_service] 
-Disable sends or receives on the socket. 
-
-
-  asio::error_code shutdown(
-      implementation_type & impl,
-      socket_base::shutdown_type what,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:wait raw_socket_service::wait]
-
-[indexterm2 wait..raw_socket_service] 
-Wait for the socket to become ready to read, ready to write, or to have pending error conditions. 
-
-
-  asio::error_code wait(
-      implementation_type & impl,
-      socket_base::wait_type w,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[endsect]
-
 [section:read read]
 
 [indexterm1 read] 
@@ -106278,1000 +96961,14 @@
 
 [endsect]
 
-[section:seq_packet_socket_service seq_packet_socket_service]
-
-
-Default service implementation for a sequenced packet socket. 
-
-
-  template<
-      typename ``[link asio.reference.Protocol Protocol]``>
-  class seq_packet_socket_service :
-    public io_context::service
-
-
-[heading Types]
-[table
-  [[Name][Description]]
-
-  [
-
-    [[link asio.reference.seq_packet_socket_service.endpoint_type [*endpoint_type]]]
-    [The endpoint type. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.seq_packet_socket_service.implementation_type [*implementation_type]]]
-    [The type of a sequenced packet socket implementation. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.seq_packet_socket_service.native_handle_type [*native_handle_type]]]
-    [The native socket type. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.seq_packet_socket_service.protocol_type [*protocol_type]]]
-    [The protocol type. ]
-  
-  ]
-
-]
-
-[heading Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.seq_packet_socket_service.assign [*assign]]]
-    [Assign an existing native socket to a sequenced packet socket. ]
-  ]
-  
-  [
-    [[link asio.reference.seq_packet_socket_service.async_connect [*async_connect]]]
-    [Start an asynchronous connect. ]
-  ]
-  
-  [
-    [[link asio.reference.seq_packet_socket_service.async_receive [*async_receive]]]
-    [Start an asynchronous receive. ]
-  ]
-  
-  [
-    [[link asio.reference.seq_packet_socket_service.async_send [*async_send]]]
-    [Start an asynchronous send. ]
-  ]
-  
-  [
-    [[link asio.reference.seq_packet_socket_service.async_wait [*async_wait]]]
-    [Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
-  ]
-  
-  [
-    [[link asio.reference.seq_packet_socket_service.at_mark [*at_mark]]]
-    [Determine whether the socket is at the out-of-band data mark. ]
-  ]
-  
-  [
-    [[link asio.reference.seq_packet_socket_service.available [*available]]]
-    [Determine the number of bytes available for reading. ]
-  ]
-  
-  [
-    [[link asio.reference.seq_packet_socket_service.bind [*bind]]]
-    [Bind the sequenced packet socket to the specified local endpoint. ]
-  ]
-  
-  [
-    [[link asio.reference.seq_packet_socket_service.cancel [*cancel]]]
-    [Cancel all asynchronous operations associated with the socket. ]
-  ]
-  
-  [
-    [[link asio.reference.seq_packet_socket_service.close [*close]]]
-    [Close a sequenced packet socket implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.seq_packet_socket_service.connect [*connect]]]
-    [Connect the sequenced packet socket to the specified endpoint. ]
-  ]
-  
-  [
-    [[link asio.reference.seq_packet_socket_service.construct [*construct]]]
-    [Construct a new sequenced packet socket implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.seq_packet_socket_service.converting_move_construct [*converting_move_construct]]]
-    [Move-construct a new sequenced packet socket implementation from another protocol type. ]
-  ]
-  
-  [
-    [[link asio.reference.seq_packet_socket_service.destroy [*destroy]]]
-    [Destroy a sequenced packet socket implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.seq_packet_socket_service.get_io_context [*get_io_context]]]
-    [Get the io_context object that owns the service. ]
-  ]
-  
-  [
-    [[link asio.reference.seq_packet_socket_service.get_io_service [*get_io_service]]]
-    [Get the io_context object that owns the service. ]
-  ]
-  
-  [
-    [[link asio.reference.seq_packet_socket_service.get_option [*get_option]]]
-    [Get a socket option. ]
-  ]
-  
-  [
-    [[link asio.reference.seq_packet_socket_service.io_control [*io_control]]]
-    [Perform an IO control command on the socket. ]
-  ]
-  
-  [
-    [[link asio.reference.seq_packet_socket_service.is_open [*is_open]]]
-    [Determine whether the socket is open. ]
-  ]
-  
-  [
-    [[link asio.reference.seq_packet_socket_service.local_endpoint [*local_endpoint]]]
-    [Get the local endpoint. ]
-  ]
-  
-  [
-    [[link asio.reference.seq_packet_socket_service.move_assign [*move_assign]]]
-    [Move-assign from another sequenced packet socket implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.seq_packet_socket_service.move_construct [*move_construct]]]
-    [Move-construct a new sequenced packet socket implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.seq_packet_socket_service.native_handle [*native_handle]]]
-    [Get the native socket implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.seq_packet_socket_service.native_non_blocking [*native_non_blocking]]]
-    [Gets the non-blocking mode of the native socket implementation. 
-
-     Sets the non-blocking mode of the native socket implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.seq_packet_socket_service.non_blocking [*non_blocking]]]
-    [Gets the non-blocking mode of the socket. 
-
-     Sets the non-blocking mode of the socket. ]
-  ]
-  
-  [
-    [[link asio.reference.seq_packet_socket_service.open [*open]]]
-    [Open a sequenced packet socket. ]
-  ]
-  
-  [
-    [[link asio.reference.seq_packet_socket_service.receive [*receive]]]
-    [Receive some data from the peer. ]
-  ]
-  
-  [
-    [[link asio.reference.seq_packet_socket_service.remote_endpoint [*remote_endpoint]]]
-    [Get the remote endpoint. ]
-  ]
-  
-  [
-    [[link asio.reference.seq_packet_socket_service.send [*send]]]
-    [Send the given data to the peer. ]
-  ]
-  
-  [
-    [[link asio.reference.seq_packet_socket_service.seq_packet_socket_service [*seq_packet_socket_service]]]
-    [Construct a new sequenced packet socket service for the specified io_context. ]
-  ]
-  
-  [
-    [[link asio.reference.seq_packet_socket_service.set_option [*set_option]]]
-    [Set a socket option. ]
-  ]
-  
-  [
-    [[link asio.reference.seq_packet_socket_service.shutdown [*shutdown]]]
-    [Disable sends or receives on the socket. ]
-  ]
-  
-  [
-    [[link asio.reference.seq_packet_socket_service.wait [*wait]]]
-    [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
-  ]
-  
-]
-
-[heading Data Members]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.seq_packet_socket_service.id [*id]]]
-    [The unique service identifier. ]
-  ]
-
-]
-
-[heading Requirements]
-
-['Header: ][^asio/seq_packet_socket_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[section:assign seq_packet_socket_service::assign]
-
-[indexterm2 assign..seq_packet_socket_service] 
-Assign an existing native socket to a sequenced packet socket. 
-
-
-  asio::error_code assign(
-      implementation_type & impl,
-      const protocol_type & protocol,
-      const native_handle_type & native_socket,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:async_connect seq_packet_socket_service::async_connect]
-
-[indexterm2 async_connect..seq_packet_socket_service] 
-Start an asynchronous connect. 
-
-
-  template<
-      typename ``[link asio.reference.ConnectHandler ConnectHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_connect(
-      implementation_type & impl,
-      const endpoint_type & peer_endpoint,
-      ConnectHandler && handler);
-
-
-
-[endsect]
-
-
-
-[section:async_receive seq_packet_socket_service::async_receive]
-
-[indexterm2 async_receive..seq_packet_socket_service] 
-Start an asynchronous receive. 
-
-
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
-      typename ``[link asio.reference.ReadHandler ReadHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_receive(
-      implementation_type & impl,
-      const MutableBufferSequence & buffers,
-      socket_base::message_flags in_flags,
-      socket_base::message_flags & out_flags,
-      ReadHandler && handler);
-
-
-
-[endsect]
-
-
-
-[section:async_send seq_packet_socket_service::async_send]
-
-[indexterm2 async_send..seq_packet_socket_service] 
-Start an asynchronous send. 
-
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
-      typename ``[link asio.reference.WriteHandler WriteHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_send(
-      implementation_type & impl,
-      const ConstBufferSequence & buffers,
-      socket_base::message_flags flags,
-      WriteHandler && handler);
-
-
-
-[endsect]
-
-
-
-[section:async_wait seq_packet_socket_service::async_wait]
-
-[indexterm2 async_wait..seq_packet_socket_service] 
-Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. 
-
-
-  template<
-      typename ``[link asio.reference.WaitHandler WaitHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
-      implementation_type & impl,
-      socket_base::wait_type w,
-      WaitHandler && handler);
-
-
-
-[endsect]
-
-
-
-[section:at_mark seq_packet_socket_service::at_mark]
-
-[indexterm2 at_mark..seq_packet_socket_service] 
-Determine whether the socket is at the out-of-band data mark. 
-
-
-  bool at_mark(
-      const implementation_type & impl,
-      asio::error_code & ec) const;
-
-
-
-[endsect]
-
-
-
-[section:available seq_packet_socket_service::available]
-
-[indexterm2 available..seq_packet_socket_service] 
-Determine the number of bytes available for reading. 
-
-
-  std::size_t available(
-      const implementation_type & impl,
-      asio::error_code & ec) const;
-
-
-
-[endsect]
-
-
-
-[section:bind seq_packet_socket_service::bind]
-
-[indexterm2 bind..seq_packet_socket_service] 
-Bind the sequenced packet socket to the specified local endpoint. 
-
-
-  asio::error_code bind(
-      implementation_type & impl,
-      const endpoint_type & endpoint,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:cancel seq_packet_socket_service::cancel]
-
-[indexterm2 cancel..seq_packet_socket_service] 
-Cancel all asynchronous operations associated with the socket. 
-
-
-  asio::error_code cancel(
-      implementation_type & impl,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:close seq_packet_socket_service::close]
-
-[indexterm2 close..seq_packet_socket_service] 
-Close a sequenced packet socket implementation. 
-
-
-  asio::error_code close(
-      implementation_type & impl,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:connect seq_packet_socket_service::connect]
-
-[indexterm2 connect..seq_packet_socket_service] 
-Connect the sequenced packet socket to the specified endpoint. 
-
-
-  asio::error_code connect(
-      implementation_type & impl,
-      const endpoint_type & peer_endpoint,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:construct seq_packet_socket_service::construct]
-
-[indexterm2 construct..seq_packet_socket_service] 
-Construct a new sequenced packet socket implementation. 
-
-
-  void construct(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:converting_move_construct seq_packet_socket_service::converting_move_construct]
-
-[indexterm2 converting_move_construct..seq_packet_socket_service] 
-Move-construct a new sequenced packet socket implementation from another protocol type. 
-
-
-  template<
-      typename ``[link asio.reference.Protocol Protocol1]``>
-  void converting_move_construct(
-      implementation_type & impl,
-      typename seq_packet_socket_service< Protocol1 >::implementation_type & other_impl,
-      typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);
-
-
-
-[endsect]
-
-
-
-[section:destroy seq_packet_socket_service::destroy]
-
-[indexterm2 destroy..seq_packet_socket_service] 
-Destroy a sequenced packet socket implementation. 
-
-
-  void destroy(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:endpoint_type seq_packet_socket_service::endpoint_type]
-
-[indexterm2 endpoint_type..seq_packet_socket_service] 
-The endpoint type. 
-
-
-  typedef Protocol::endpoint endpoint_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/seq_packet_socket_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:get_io_context seq_packet_socket_service::get_io_context]
-
-
-['Inherited from io_context.]
-
-[indexterm2 get_io_context..seq_packet_socket_service] 
-Get the [link asio.reference.io_context `io_context`] object that owns the service. 
-
-
-  asio::io_context & get_io_context();
-
-
-
-[endsect]
-
-
-
-[section:get_io_service seq_packet_socket_service::get_io_service]
-
-
-['Inherited from io_context.]
-
-[indexterm2 get_io_service..seq_packet_socket_service] 
-Get the [link asio.reference.io_context `io_context`] object that owns the service. 
-
-
-  asio::io_context & get_io_service();
-
-
-
-[endsect]
-
-
-
-[section:get_option seq_packet_socket_service::get_option]
-
-[indexterm2 get_option..seq_packet_socket_service] 
-Get a socket option. 
-
-
-  template<
-      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
-  asio::error_code get_option(
-      const implementation_type & impl,
-      GettableSocketOption & option,
-      asio::error_code & ec) const;
-
-
-
-[endsect]
-
-
-
-[section:id seq_packet_socket_service::id]
-
-[indexterm2 id..seq_packet_socket_service] 
-The unique service identifier. 
-
-
-  static asio::io_context::id id;
-
-
-
-[endsect]
-
-
-
-[section:implementation_type seq_packet_socket_service::implementation_type]
-
-[indexterm2 implementation_type..seq_packet_socket_service] 
-The type of a sequenced packet socket implementation. 
-
-
-  typedef implementation_defined implementation_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/seq_packet_socket_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:io_control seq_packet_socket_service::io_control]
-
-[indexterm2 io_control..seq_packet_socket_service] 
-Perform an IO control command on the socket. 
-
-
-  template<
-      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
-  asio::error_code io_control(
-      implementation_type & impl,
-      IoControlCommand & command,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:is_open seq_packet_socket_service::is_open]
-
-[indexterm2 is_open..seq_packet_socket_service] 
-Determine whether the socket is open. 
-
-
-  bool is_open(
-      const implementation_type & impl) const;
-
-
-
-[endsect]
-
-
-
-[section:local_endpoint seq_packet_socket_service::local_endpoint]
-
-[indexterm2 local_endpoint..seq_packet_socket_service] 
-Get the local endpoint. 
-
-
-  endpoint_type local_endpoint(
-      const implementation_type & impl,
-      asio::error_code & ec) const;
-
-
-
-[endsect]
-
-
-
-[section:move_assign seq_packet_socket_service::move_assign]
-
-[indexterm2 move_assign..seq_packet_socket_service] 
-Move-assign from another sequenced packet socket implementation. 
-
-
-  void move_assign(
-      implementation_type & impl,
-      seq_packet_socket_service & other_service,
-      implementation_type & other_impl);
-
-
-
-[endsect]
-
-
-
-[section:move_construct seq_packet_socket_service::move_construct]
-
-[indexterm2 move_construct..seq_packet_socket_service] 
-Move-construct a new sequenced packet socket implementation. 
-
-
-  void move_construct(
-      implementation_type & impl,
-      implementation_type & other_impl);
-
-
-
-[endsect]
-
-
-
-[section:native_handle seq_packet_socket_service::native_handle]
-
-[indexterm2 native_handle..seq_packet_socket_service] 
-Get the native socket implementation. 
-
-
-  native_handle_type native_handle(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:native_handle_type seq_packet_socket_service::native_handle_type]
-
-[indexterm2 native_handle_type..seq_packet_socket_service] 
-The native socket type. 
-
-
-  typedef implementation_defined native_handle_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/seq_packet_socket_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-[section:native_non_blocking seq_packet_socket_service::native_non_blocking]
-
-[indexterm2 native_non_blocking..seq_packet_socket_service] 
-Gets the non-blocking mode of the native socket implementation. 
-
-
-  bool ``[link asio.reference.seq_packet_socket_service.native_non_blocking.overload1 native_non_blocking]``(
-      const implementation_type & impl) const;
-  ``  [''''&raquo;''' [link asio.reference.seq_packet_socket_service.native_non_blocking.overload1 more...]]``
-
-
-Sets the non-blocking mode of the native socket implementation. 
-
-
-  asio::error_code ``[link asio.reference.seq_packet_socket_service.native_non_blocking.overload2 native_non_blocking]``(
-      implementation_type & impl,
-      bool mode,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.seq_packet_socket_service.native_non_blocking.overload2 more...]]``
-
-
-[section:overload1 seq_packet_socket_service::native_non_blocking (1 of 2 overloads)]
-
-
-Gets the non-blocking mode of the native socket implementation. 
-
-
-  bool native_non_blocking(
-      const implementation_type & impl) const;
-
-
-
-[endsect]
-
-
-
-[section:overload2 seq_packet_socket_service::native_non_blocking (2 of 2 overloads)]
-
-
-Sets the non-blocking mode of the native socket implementation. 
-
-
-  asio::error_code native_non_blocking(
-      implementation_type & impl,
-      bool mode,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-[endsect]
-
-[section:non_blocking seq_packet_socket_service::non_blocking]
-
-[indexterm2 non_blocking..seq_packet_socket_service] 
-Gets the non-blocking mode of the socket. 
-
-
-  bool ``[link asio.reference.seq_packet_socket_service.non_blocking.overload1 non_blocking]``(
-      const implementation_type & impl) const;
-  ``  [''''&raquo;''' [link asio.reference.seq_packet_socket_service.non_blocking.overload1 more...]]``
-
-
-Sets the non-blocking mode of the socket. 
-
-
-  asio::error_code ``[link asio.reference.seq_packet_socket_service.non_blocking.overload2 non_blocking]``(
-      implementation_type & impl,
-      bool mode,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.seq_packet_socket_service.non_blocking.overload2 more...]]``
-
-
-[section:overload1 seq_packet_socket_service::non_blocking (1 of 2 overloads)]
-
-
-Gets the non-blocking mode of the socket. 
-
-
-  bool non_blocking(
-      const implementation_type & impl) const;
-
-
-
-[endsect]
-
-
-
-[section:overload2 seq_packet_socket_service::non_blocking (2 of 2 overloads)]
-
-
-Sets the non-blocking mode of the socket. 
-
-
-  asio::error_code non_blocking(
-      implementation_type & impl,
-      bool mode,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:open seq_packet_socket_service::open]
-
-[indexterm2 open..seq_packet_socket_service] 
-Open a sequenced packet socket. 
-
-
-  asio::error_code open(
-      implementation_type & impl,
-      const protocol_type & protocol,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:protocol_type seq_packet_socket_service::protocol_type]
-
-[indexterm2 protocol_type..seq_packet_socket_service] 
-The protocol type. 
-
-
-  typedef Protocol protocol_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/seq_packet_socket_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:receive seq_packet_socket_service::receive]
-
-[indexterm2 receive..seq_packet_socket_service] 
-Receive some data from the peer. 
-
-
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
-  std::size_t receive(
-      implementation_type & impl,
-      const MutableBufferSequence & buffers,
-      socket_base::message_flags in_flags,
-      socket_base::message_flags & out_flags,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:remote_endpoint seq_packet_socket_service::remote_endpoint]
-
-[indexterm2 remote_endpoint..seq_packet_socket_service] 
-Get the remote endpoint. 
-
-
-  endpoint_type remote_endpoint(
-      const implementation_type & impl,
-      asio::error_code & ec) const;
-
-
-
-[endsect]
-
-
-
-[section:send seq_packet_socket_service::send]
-
-[indexterm2 send..seq_packet_socket_service] 
-Send the given data to the peer. 
-
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
-  std::size_t send(
-      implementation_type & impl,
-      const ConstBufferSequence & buffers,
-      socket_base::message_flags flags,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:seq_packet_socket_service seq_packet_socket_service::seq_packet_socket_service]
-
-[indexterm2 seq_packet_socket_service..seq_packet_socket_service] 
-Construct a new sequenced packet socket service for the specified [link asio.reference.io_context `io_context`]. 
-
-
-  seq_packet_socket_service(
-      asio::io_context & io_context);
-
-
-
-[endsect]
-
-
-
-[section:set_option seq_packet_socket_service::set_option]
-
-[indexterm2 set_option..seq_packet_socket_service] 
-Set a socket option. 
-
-
-  template<
-      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
-  asio::error_code set_option(
-      implementation_type & impl,
-      const SettableSocketOption & option,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:shutdown seq_packet_socket_service::shutdown]
-
-[indexterm2 shutdown..seq_packet_socket_service] 
-Disable sends or receives on the socket. 
-
-
-  asio::error_code shutdown(
-      implementation_type & impl,
-      socket_base::shutdown_type what,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:wait seq_packet_socket_service::wait]
-
-[indexterm2 wait..seq_packet_socket_service] 
-Wait for the socket to become ready to read, ready to write, or to have pending error conditions. 
-
-
-  asio::error_code wait(
-      implementation_type & impl,
-      socket_base::wait_type w,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[endsect]
-
-
 [section:serial_port serial_port]
 
-[indexterm1 serial_port] 
-Typedef for the typical usage of a serial port. 
+
+Provides serial port functionality. 
 
 
-  typedef basic_serial_port serial_port;
+  class serial_port :
+    public serial_port_base
 
 
 [heading Types]
@@ -107280,39 +96977,25 @@
 
   [
 
-    [[link asio.reference.basic_serial_port.executor_type [*executor_type]]]
+    [[link asio.reference.serial_port.executor_type [*executor_type]]]
     [The type of the executor associated with the object. ]
   
   ]
 
   [
 
-    [[link asio.reference.basic_serial_port.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.basic_serial_port.lowest_layer_type [*lowest_layer_type]]]
+    [[link asio.reference.serial_port.lowest_layer_type [*lowest_layer_type]]]
     [A basic_serial_port is always the lowest layer. ]
   
   ]
 
   [
 
-    [[link asio.reference.basic_serial_port.native_handle_type [*native_handle_type]]]
+    [[link asio.reference.serial_port.native_handle_type [*native_handle_type]]]
     [The native representation of a serial port. ]
   
   ]
 
-  [
-
-    [[link asio.reference.basic_serial_port.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
 ]
 
 [heading Member Functions]
@@ -107320,127 +97003,904 @@
   [[Name][Description]]
 
   [
-    [[link asio.reference.basic_serial_port.assign [*assign]]]
+    [[link asio.reference.serial_port.assign [*assign]]]
     [Assign an existing native serial port to the serial port. ]
   ]
   
   [
-    [[link asio.reference.basic_serial_port.async_read_some [*async_read_some]]]
+    [[link asio.reference.serial_port.async_read_some [*async_read_some]]]
     [Start an asynchronous read. ]
   ]
   
   [
-    [[link asio.reference.basic_serial_port.async_write_some [*async_write_some]]]
+    [[link asio.reference.serial_port.async_write_some [*async_write_some]]]
     [Start an asynchronous write. ]
   ]
   
   [
-    [[link asio.reference.basic_serial_port.basic_serial_port [*basic_serial_port]]]
-    [Construct a basic_serial_port without opening it. 
-
-     Construct and open a basic_serial_port. 
-
-     Construct a basic_serial_port on an existing native serial port. 
-
-     Move-construct a basic_serial_port from another. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_serial_port.cancel [*cancel]]]
+    [[link asio.reference.serial_port.cancel [*cancel]]]
     [Cancel all asynchronous operations associated with the serial port. ]
   ]
   
   [
-    [[link asio.reference.basic_serial_port.close [*close]]]
+    [[link asio.reference.serial_port.close [*close]]]
     [Close the serial port. ]
   ]
   
   [
-    [[link asio.reference.basic_serial_port.get_executor [*get_executor]]]
+    [[link asio.reference.serial_port.get_executor [*get_executor]]]
     [Get the executor associated with the object. ]
   ]
   
   [
-    [[link asio.reference.basic_serial_port.get_io_context [*get_io_context]]]
+    [[link asio.reference.serial_port.get_io_context [*get_io_context]]]
     [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
   ]
   
   [
-    [[link asio.reference.basic_serial_port.get_io_service [*get_io_service]]]
+    [[link asio.reference.serial_port.get_io_service [*get_io_service]]]
     [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
   ]
   
   [
-    [[link asio.reference.basic_serial_port.get_option [*get_option]]]
+    [[link asio.reference.serial_port.get_option [*get_option]]]
     [Get an option from the serial port. ]
   ]
   
   [
-    [[link asio.reference.basic_serial_port.is_open [*is_open]]]
+    [[link asio.reference.serial_port.is_open [*is_open]]]
     [Determine whether the serial port is open. ]
   ]
   
   [
-    [[link asio.reference.basic_serial_port.lowest_layer [*lowest_layer]]]
+    [[link asio.reference.serial_port.lowest_layer [*lowest_layer]]]
     [Get a reference to the lowest layer. 
 
      Get a const reference to the lowest layer. ]
   ]
   
   [
-    [[link asio.reference.basic_serial_port.native_handle [*native_handle]]]
+    [[link asio.reference.serial_port.native_handle [*native_handle]]]
     [Get the native serial port representation. ]
   ]
   
   [
-    [[link asio.reference.basic_serial_port.open [*open]]]
+    [[link asio.reference.serial_port.open [*open]]]
     [Open the serial port using the specified device name. ]
   ]
   
   [
-    [[link asio.reference.basic_serial_port.operator_eq_ [*operator=]]]
-    [Move-assign a basic_serial_port from another. ]
+    [[link asio.reference.serial_port.operator_eq_ [*operator=]]]
+    [Move-assign a serial_port from another. ]
   ]
   
   [
-    [[link asio.reference.basic_serial_port.read_some [*read_some]]]
+    [[link asio.reference.serial_port.read_some [*read_some]]]
     [Read some data from the serial port. ]
   ]
   
   [
-    [[link asio.reference.basic_serial_port.send_break [*send_break]]]
+    [[link asio.reference.serial_port.send_break [*send_break]]]
     [Send a break sequence to the serial port. ]
   ]
   
   [
-    [[link asio.reference.basic_serial_port.set_option [*set_option]]]
+    [[link asio.reference.serial_port.serial_port [*serial_port]]]
+    [Construct a serial_port without opening it. 
+
+     Construct and open a serial_port. 
+
+     Construct a serial_port on an existing native serial port. 
+
+     Move-construct a serial_port from another. ]
+  ]
+  
+  [
+    [[link asio.reference.serial_port.set_option [*set_option]]]
     [Set an option on the serial port. ]
   ]
   
   [
-    [[link asio.reference.basic_serial_port.write_some [*write_some]]]
+    [[link asio.reference.serial_port.write_some [*write_some]]]
     [Write some data to the serial port. ]
   ]
   
+  [
+    [[link asio.reference.serial_port._serial_port [*~serial_port]]]
+    [Destroys the serial port. ]
+  ]
+  
 ]
 
-[heading Protected Member Functions]
+The [link asio.reference.serial_port `serial_port`] class provides a wrapper over serial port functionality.
+
+
+[heading Thread Safety]
+  
+['Distinct] ['objects:] Safe.
+
+['Shared] ['objects:] Unsafe. 
+
+
+
+[heading Requirements]
+
+['Header: ][^asio/serial_port.hpp]
+
+['Convenience header: ][^asio.hpp]
+
+[section:assign serial_port::assign]
+
+[indexterm2 assign..serial_port] 
+Assign an existing native serial port to the serial port. 
+
+
+  void ``[link asio.reference.serial_port.assign.overload1 assign]``(
+      const native_handle_type & native_serial_port);
+  ``  [''''&raquo;''' [link asio.reference.serial_port.assign.overload1 more...]]``
+
+  asio::error_code ``[link asio.reference.serial_port.assign.overload2 assign]``(
+      const native_handle_type & native_serial_port,
+      asio::error_code & ec);
+  ``  [''''&raquo;''' [link asio.reference.serial_port.assign.overload2 more...]]``
+
+
+[section:overload1 serial_port::assign (1 of 2 overloads)]
+
+
+Assign an existing native serial port to the serial port. 
+
+
+  void assign(
+      const native_handle_type & native_serial_port);
+
+
+
+[endsect]
+
+
+
+[section:overload2 serial_port::assign (2 of 2 overloads)]
+
+
+Assign an existing native serial port to the serial port. 
+
+
+  asio::error_code assign(
+      const native_handle_type & native_serial_port,
+      asio::error_code & ec);
+
+
+
+[endsect]
+
+
+[endsect]
+
+
+[section:async_read_some serial_port::async_read_some]
+
+[indexterm2 async_read_some..serial_port] 
+Start an asynchronous read. 
+
+
+  template<
+      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
+      typename ``[link asio.reference.ReadHandler ReadHandler]``>
+  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_some(
+      const MutableBufferSequence & buffers,
+      ReadHandler && handler);
+
+
+This function is used to asynchronously read data from the serial port. The function call always returns immediately.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[buffers][One or more buffers into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]
+
+[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
+``
+   void handler(
+     const asio::error_code& error, // Result of operation.
+     std::size_t bytes_transferred           // Number of bytes read.
+   ); 
+``
+Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using `asio::io_context::post()`.]]
+
+]
+
+
+[heading Remarks]
+      
+The read operation may not read all of the requested number of bytes. Consider using the [link asio.reference.async_read `async_read`]  function if you need to ensure that the requested amount of data is read before the asynchronous operation completes.
+
+
+[heading Example]
+  
+To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 
+
+   serial_port.async_read_some(asio::buffer(data, size), handler);
+
+
+See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 
+
+
+
+
+[endsect]
+
+
+
+[section:async_write_some serial_port::async_write_some]
+
+[indexterm2 async_write_some..serial_port] 
+Start an asynchronous write. 
+
+
+  template<
+      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
+      typename ``[link asio.reference.WriteHandler WriteHandler]``>
+  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_write_some(
+      const ConstBufferSequence & buffers,
+      WriteHandler && handler);
+
+
+This function is used to asynchronously write data to the serial port. The function call always returns immediately.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[buffers][One or more data buffers to be written to the serial port. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]
+
+[[handler][The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
+``
+   void handler(
+     const asio::error_code& error, // Result of operation.
+     std::size_t bytes_transferred           // Number of bytes written.
+   ); 
+``
+Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using `asio::io_context::post()`.]]
+
+]
+
+
+[heading Remarks]
+      
+The write operation may not transmit all of the data to the peer. Consider using the [link asio.reference.async_write `async_write`]  function if you need to ensure that all data is written before the asynchronous operation completes.
+
+
+[heading Example]
+  
+To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 
+
+   serial_port.async_write_some(asio::buffer(data, size), handler);
+
+
+See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 
+
+
+
+
+[endsect]
+
+
+[section:cancel serial_port::cancel]
+
+[indexterm2 cancel..serial_port] 
+Cancel all asynchronous operations associated with the serial port. 
+
+
+  void ``[link asio.reference.serial_port.cancel.overload1 cancel]``();
+  ``  [''''&raquo;''' [link asio.reference.serial_port.cancel.overload1 more...]]``
+
+  asio::error_code ``[link asio.reference.serial_port.cancel.overload2 cancel]``(
+      asio::error_code & ec);
+  ``  [''''&raquo;''' [link asio.reference.serial_port.cancel.overload2 more...]]``
+
+
+[section:overload1 serial_port::cancel (1 of 2 overloads)]
+
+
+Cancel all asynchronous operations associated with the serial port. 
+
+
+  void cancel();
+
+
+This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[asio::system_error][Thrown on failure. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+
+[section:overload2 serial_port::cancel (2 of 2 overloads)]
+
+
+Cancel all asynchronous operations associated with the serial port. 
+
+
+  asio::error_code cancel(
+      asio::error_code & ec);
+
+
+This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[ec][Set to indicate what error occurred, if any. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+[endsect]
+
+[section:close serial_port::close]
+
+[indexterm2 close..serial_port] 
+Close the serial port. 
+
+
+  void ``[link asio.reference.serial_port.close.overload1 close]``();
+  ``  [''''&raquo;''' [link asio.reference.serial_port.close.overload1 more...]]``
+
+  asio::error_code ``[link asio.reference.serial_port.close.overload2 close]``(
+      asio::error_code & ec);
+  ``  [''''&raquo;''' [link asio.reference.serial_port.close.overload2 more...]]``
+
+
+[section:overload1 serial_port::close (1 of 2 overloads)]
+
+
+Close the serial port. 
+
+
+  void close();
+
+
+This function is used to close the serial port. Any asynchronous read or write operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[asio::system_error][Thrown on failure. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+
+[section:overload2 serial_port::close (2 of 2 overloads)]
+
+
+Close the serial port. 
+
+
+  asio::error_code close(
+      asio::error_code & ec);
+
+
+This function is used to close the serial port. Any asynchronous read or write operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[ec][Set to indicate what error occurred, if any. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+[endsect]
+
+
+[section:executor_type serial_port::executor_type]
+
+[indexterm2 executor_type..serial_port] 
+The type of the executor associated with the object. 
+
+
+  typedef io_context::executor_type executor_type;
+
+
+[heading Member Functions]
 [table
   [[Name][Description]]
 
   [
-    [[link asio.reference.basic_serial_port.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
+    [[link asio.reference.io_context__executor_type.context [*context]]]
+    [Obtain the underlying execution context. ]
   ]
   
   [
-    [[link asio.reference.basic_serial_port.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
+    [[link asio.reference.io_context__executor_type.defer [*defer]]]
+    [Request the io_context to invoke the given function object. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context__executor_type.dispatch [*dispatch]]]
+    [Request the io_context to invoke the given function object. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context__executor_type.on_work_finished [*on_work_finished]]]
+    [Inform the io_context that some work is no longer outstanding. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context__executor_type.on_work_started [*on_work_started]]]
+    [Inform the io_context that it has some outstanding work to do. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context__executor_type.post [*post]]]
+    [Request the io_context to invoke the given function object. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context__executor_type.running_in_this_thread [*running_in_this_thread]]]
+    [Determine whether the io_context is running in the current thread. ]
   ]
   
 ]
 
-The [link asio.reference.basic_serial_port `basic_serial_port`] class template provides functionality that is common to all serial ports.
+[heading Friends]
+[table
+  [[Name][Description]]
+
+  [
+    [[link asio.reference.io_context__executor_type.operator_not__eq_ [*operator!=]]]
+    [Compare two executors for inequality. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context__executor_type.operator_eq__eq_ [*operator==]]]
+    [Compare two executors for equality. ]
+  ]
+  
+]
+
+
+[heading Requirements]
+
+['Header: ][^asio/serial_port.hpp]
+
+['Convenience header: ][^asio.hpp]
+
+
+[endsect]
+
+
+
+[section:get_executor serial_port::get_executor]
+
+[indexterm2 get_executor..serial_port] 
+Get the executor associated with the object. 
+
+
+  executor_type get_executor();
+
+
+
+[endsect]
+
+
+
+[section:get_io_context serial_port::get_io_context]
+
+[indexterm2 get_io_context..serial_port] 
+(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
+
+
+  asio::io_context & get_io_context();
+
+
+This function may be used to obtain the [link asio.reference.io_context `io_context`] object that the I/O object uses to dispatch handlers for asynchronous operations.
+
+
+[heading Return Value]
+      
+A reference to the [link asio.reference.io_context `io_context`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 
+
+
+
+
+[endsect]
+
+
+
+[section:get_io_service serial_port::get_io_service]
+
+[indexterm2 get_io_service..serial_port] 
+(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
+
+
+  asio::io_context & get_io_service();
+
+
+This function may be used to obtain the [link asio.reference.io_context `io_context`] object that the I/O object uses to dispatch handlers for asynchronous operations.
+
+
+[heading Return Value]
+      
+A reference to the [link asio.reference.io_context `io_context`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 
+
+
+
+
+[endsect]
+
+
+[section:get_option serial_port::get_option]
+
+[indexterm2 get_option..serial_port] 
+Get an option from the serial port. 
+
+
+  template<
+      typename ``[link asio.reference.GettableSerialPortOption GettableSerialPortOption]``>
+  void ``[link asio.reference.serial_port.get_option.overload1 get_option]``(
+      GettableSerialPortOption & option);
+  ``  [''''&raquo;''' [link asio.reference.serial_port.get_option.overload1 more...]]``
+
+  template<
+      typename ``[link asio.reference.GettableSerialPortOption GettableSerialPortOption]``>
+  asio::error_code ``[link asio.reference.serial_port.get_option.overload2 get_option]``(
+      GettableSerialPortOption & option,
+      asio::error_code & ec);
+  ``  [''''&raquo;''' [link asio.reference.serial_port.get_option.overload2 more...]]``
+
+
+[section:overload1 serial_port::get_option (1 of 2 overloads)]
+
+
+Get an option from the serial port. 
+
+
+  template<
+      typename ``[link asio.reference.GettableSerialPortOption GettableSerialPortOption]``>
+  void get_option(
+      GettableSerialPortOption & option);
+
+
+This function is used to get the current value of an option on the serial port.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[option][The option value to be obtained from the serial port.]]
+
+]
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[asio::system_error][Thrown on failure.]]
+
+]
+
+
+
+
+
+[endsect]
+
+
+
+[section:overload2 serial_port::get_option (2 of 2 overloads)]
+
+
+Get an option from the serial port. 
+
+
+  template<
+      typename ``[link asio.reference.GettableSerialPortOption GettableSerialPortOption]``>
+  asio::error_code get_option(
+      GettableSerialPortOption & option,
+      asio::error_code & ec);
+
+
+This function is used to get the current value of an option on the serial port.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[option][The option value to be obtained from the serial port.]]
+
+[[ec][Set to indicate what error occurred, if any.]]
+
+]
+
+
+
+
+
+[endsect]
+
+
+[endsect]
+
+
+[section:is_open serial_port::is_open]
+
+[indexterm2 is_open..serial_port] 
+Determine whether the serial port is open. 
+
+
+  bool is_open() const;
+
+
+
+[endsect]
+
+
+[section:lowest_layer serial_port::lowest_layer]
+
+[indexterm2 lowest_layer..serial_port] 
+Get a reference to the lowest layer. 
+
+
+  lowest_layer_type & ``[link asio.reference.serial_port.lowest_layer.overload1 lowest_layer]``();
+  ``  [''''&raquo;''' [link asio.reference.serial_port.lowest_layer.overload1 more...]]``
+
+
+Get a const reference to the lowest layer. 
+
+
+  const lowest_layer_type & ``[link asio.reference.serial_port.lowest_layer.overload2 lowest_layer]``() const;
+  ``  [''''&raquo;''' [link asio.reference.serial_port.lowest_layer.overload2 more...]]``
+
+
+[section:overload1 serial_port::lowest_layer (1 of 2 overloads)]
+
+
+Get a reference to the lowest layer. 
+
+
+  lowest_layer_type & lowest_layer();
+
+
+This function returns a reference to the lowest layer in a stack of layers. Since a [link asio.reference.serial_port `serial_port`] cannot contain any further layers, it simply returns a reference to itself.
+
+
+[heading Return Value]
+      
+A reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 
+
+
+
+
+[endsect]
+
+
+
+[section:overload2 serial_port::lowest_layer (2 of 2 overloads)]
+
+
+Get a const reference to the lowest layer. 
+
+
+  const lowest_layer_type & lowest_layer() const;
+
+
+This function returns a const reference to the lowest layer in a stack of layers. Since a [link asio.reference.serial_port `serial_port`] cannot contain any further layers, it simply returns a reference to itself.
+
+
+[heading Return Value]
+      
+A const reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 
+
+
+
+
+[endsect]
+
+
+[endsect]
+
+
+[section:lowest_layer_type serial_port::lowest_layer_type]
+
+[indexterm2 lowest_layer_type..serial_port] 
+A basic\_serial\_port is always the lowest layer. 
+
+
+  typedef serial_port lowest_layer_type;
+
+
+[heading Types]
+[table
+  [[Name][Description]]
+
+  [
+
+    [[link asio.reference.serial_port.executor_type [*executor_type]]]
+    [The type of the executor associated with the object. ]
+  
+  ]
+
+  [
+
+    [[link asio.reference.serial_port.lowest_layer_type [*lowest_layer_type]]]
+    [A basic_serial_port is always the lowest layer. ]
+  
+  ]
+
+  [
+
+    [[link asio.reference.serial_port.native_handle_type [*native_handle_type]]]
+    [The native representation of a serial port. ]
+  
+  ]
+
+]
+
+[heading Member Functions]
+[table
+  [[Name][Description]]
+
+  [
+    [[link asio.reference.serial_port.assign [*assign]]]
+    [Assign an existing native serial port to the serial port. ]
+  ]
+  
+  [
+    [[link asio.reference.serial_port.async_read_some [*async_read_some]]]
+    [Start an asynchronous read. ]
+  ]
+  
+  [
+    [[link asio.reference.serial_port.async_write_some [*async_write_some]]]
+    [Start an asynchronous write. ]
+  ]
+  
+  [
+    [[link asio.reference.serial_port.cancel [*cancel]]]
+    [Cancel all asynchronous operations associated with the serial port. ]
+  ]
+  
+  [
+    [[link asio.reference.serial_port.close [*close]]]
+    [Close the serial port. ]
+  ]
+  
+  [
+    [[link asio.reference.serial_port.get_executor [*get_executor]]]
+    [Get the executor associated with the object. ]
+  ]
+  
+  [
+    [[link asio.reference.serial_port.get_io_context [*get_io_context]]]
+    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
+  ]
+  
+  [
+    [[link asio.reference.serial_port.get_io_service [*get_io_service]]]
+    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
+  ]
+  
+  [
+    [[link asio.reference.serial_port.get_option [*get_option]]]
+    [Get an option from the serial port. ]
+  ]
+  
+  [
+    [[link asio.reference.serial_port.is_open [*is_open]]]
+    [Determine whether the serial port is open. ]
+  ]
+  
+  [
+    [[link asio.reference.serial_port.lowest_layer [*lowest_layer]]]
+    [Get a reference to the lowest layer. 
+
+     Get a const reference to the lowest layer. ]
+  ]
+  
+  [
+    [[link asio.reference.serial_port.native_handle [*native_handle]]]
+    [Get the native serial port representation. ]
+  ]
+  
+  [
+    [[link asio.reference.serial_port.open [*open]]]
+    [Open the serial port using the specified device name. ]
+  ]
+  
+  [
+    [[link asio.reference.serial_port.operator_eq_ [*operator=]]]
+    [Move-assign a serial_port from another. ]
+  ]
+  
+  [
+    [[link asio.reference.serial_port.read_some [*read_some]]]
+    [Read some data from the serial port. ]
+  ]
+  
+  [
+    [[link asio.reference.serial_port.send_break [*send_break]]]
+    [Send a break sequence to the serial port. ]
+  ]
+  
+  [
+    [[link asio.reference.serial_port.serial_port [*serial_port]]]
+    [Construct a serial_port without opening it. 
+
+     Construct and open a serial_port. 
+
+     Construct a serial_port on an existing native serial port. 
+
+     Move-construct a serial_port from another. ]
+  ]
+  
+  [
+    [[link asio.reference.serial_port.set_option [*set_option]]]
+    [Set an option on the serial port. ]
+  ]
+  
+  [
+    [[link asio.reference.serial_port.write_some [*write_some]]]
+    [Write some data to the serial port. ]
+  ]
+  
+  [
+    [[link asio.reference.serial_port._serial_port [*~serial_port]]]
+    [Destroys the serial port. ]
+  ]
+  
+]
+
+The [link asio.reference.serial_port `serial_port`] class provides a wrapper over serial port functionality.
 
 
 [heading Thread Safety]
@@ -107462,10 +97922,822 @@
 [endsect]
 
 
+
+[section:native_handle serial_port::native_handle]
+
+[indexterm2 native_handle..serial_port] 
+Get the native serial port representation. 
+
+
+  native_handle_type native_handle();
+
+
+This function may be used to obtain the underlying representation of the serial port. This is intended to allow access to native serial port functionality that is not otherwise provided. 
+
+
+[endsect]
+
+
+
+[section:native_handle_type serial_port::native_handle_type]
+
+[indexterm2 native_handle_type..serial_port] 
+The native representation of a serial port. 
+
+
+  typedef implementation_defined native_handle_type;
+
+
+
+[heading Requirements]
+
+['Header: ][^asio/serial_port.hpp]
+
+['Convenience header: ][^asio.hpp]
+
+
+[endsect]
+
+
+[section:open serial_port::open]
+
+[indexterm2 open..serial_port] 
+Open the serial port using the specified device name. 
+
+
+  void ``[link asio.reference.serial_port.open.overload1 open]``(
+      const std::string & device);
+  ``  [''''&raquo;''' [link asio.reference.serial_port.open.overload1 more...]]``
+
+  asio::error_code ``[link asio.reference.serial_port.open.overload2 open]``(
+      const std::string & device,
+      asio::error_code & ec);
+  ``  [''''&raquo;''' [link asio.reference.serial_port.open.overload2 more...]]``
+
+
+[section:overload1 serial_port::open (1 of 2 overloads)]
+
+
+Open the serial port using the specified device name. 
+
+
+  void open(
+      const std::string & device);
+
+
+This function opens the serial port for the specified device name.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[device][The platform-specific device name.]]
+
+]
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[asio::system_error][Thrown on failure. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+
+[section:overload2 serial_port::open (2 of 2 overloads)]
+
+
+Open the serial port using the specified device name. 
+
+
+  asio::error_code open(
+      const std::string & device,
+      asio::error_code & ec);
+
+
+This function opens the serial port using the given platform-specific device name.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[device][The platform-specific device name.]]
+
+[[ec][Set the indicate what error occurred, if any. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+[endsect]
+
+
+[section:operator_eq_ serial_port::operator=]
+
+[indexterm2 operator=..serial_port] 
+Move-assign a [link asio.reference.serial_port `serial_port`] from another. 
+
+
+  serial_port & operator=(
+      serial_port && other);
+
+
+This assignment operator moves a serial port from one object to another.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[other][The other [link asio.reference.serial_port `serial_port`] object from which the move will occur.]]
+
+]
+
+
+[heading Remarks]
+      
+Following the move, the moved-from object is in the same state as if constructed using the `serial_port(io_context&) constructor`. 
+
+
+
+
+[endsect]
+
+
+[section:read_some serial_port::read_some]
+
+[indexterm2 read_some..serial_port] 
+Read some data from the serial port. 
+
+
+  template<
+      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
+  std::size_t ``[link asio.reference.serial_port.read_some.overload1 read_some]``(
+      const MutableBufferSequence & buffers);
+  ``  [''''&raquo;''' [link asio.reference.serial_port.read_some.overload1 more...]]``
+
+  template<
+      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
+  std::size_t ``[link asio.reference.serial_port.read_some.overload2 read_some]``(
+      const MutableBufferSequence & buffers,
+      asio::error_code & ec);
+  ``  [''''&raquo;''' [link asio.reference.serial_port.read_some.overload2 more...]]``
+
+
+[section:overload1 serial_port::read_some (1 of 2 overloads)]
+
+
+Read some data from the serial port. 
+
+
+  template<
+      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
+  std::size_t read_some(
+      const MutableBufferSequence & buffers);
+
+
+This function is used to read data from the serial port. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[buffers][One or more buffers into which the data will be read.]]
+
+]
+
+
+[heading Return Value]
+      
+The number of bytes read.
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[asio::system_error][Thrown on failure. An error code of `asio::error::eof` indicates that the connection was closed by the peer.]]
+
+]
+
+
+[heading Remarks]
+      
+The read\_some operation may not read all of the requested number of bytes. Consider using the [link asio.reference.read `read`]  function if you need to ensure that the requested amount of data is read before the blocking operation completes.
+
+
+[heading Example]
+  
+To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 
+
+   serial_port.read_some(asio::buffer(data, size));
+
+
+See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 
+
+
+
+
+[endsect]
+
+
+
+[section:overload2 serial_port::read_some (2 of 2 overloads)]
+
+
+Read some data from the serial port. 
+
+
+  template<
+      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
+  std::size_t read_some(
+      const MutableBufferSequence & buffers,
+      asio::error_code & ec);
+
+
+This function is used to read data from the serial port. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[buffers][One or more buffers into which the data will be read.]]
+
+[[ec][Set to indicate what error occurred, if any.]]
+
+]
+
+
+[heading Return Value]
+      
+The number of bytes read. Returns 0 if an error occurred.
+
+
+[heading Remarks]
+      
+The read\_some operation may not read all of the requested number of bytes. Consider using the [link asio.reference.read `read`]  function if you need to ensure that the requested amount of data is read before the blocking operation completes. 
+
+
+
+
+[endsect]
+
+
+[endsect]
+
+[section:send_break serial_port::send_break]
+
+[indexterm2 send_break..serial_port] 
+Send a break sequence to the serial port. 
+
+
+  void ``[link asio.reference.serial_port.send_break.overload1 send_break]``();
+  ``  [''''&raquo;''' [link asio.reference.serial_port.send_break.overload1 more...]]``
+
+  asio::error_code ``[link asio.reference.serial_port.send_break.overload2 send_break]``(
+      asio::error_code & ec);
+  ``  [''''&raquo;''' [link asio.reference.serial_port.send_break.overload2 more...]]``
+
+
+[section:overload1 serial_port::send_break (1 of 2 overloads)]
+
+
+Send a break sequence to the serial port. 
+
+
+  void send_break();
+
+
+This function causes a break sequence of platform-specific duration to be sent out the serial port.
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[asio::system_error][Thrown on failure. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+
+[section:overload2 serial_port::send_break (2 of 2 overloads)]
+
+
+Send a break sequence to the serial port. 
+
+
+  asio::error_code send_break(
+      asio::error_code & ec);
+
+
+This function causes a break sequence of platform-specific duration to be sent out the serial port.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[ec][Set to indicate what error occurred, if any. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+[endsect]
+
+[section:serial_port serial_port::serial_port]
+
+[indexterm2 serial_port..serial_port] 
+Construct a [link asio.reference.serial_port `serial_port`] without opening it. 
+
+
+  explicit ``[link asio.reference.serial_port.serial_port.overload1 serial_port]``(
+      asio::io_context & io_context);
+  ``  [''''&raquo;''' [link asio.reference.serial_port.serial_port.overload1 more...]]``
+
+
+Construct and open a [link asio.reference.serial_port `serial_port`]. 
+
+
+  explicit ``[link asio.reference.serial_port.serial_port.overload2 serial_port]``(
+      asio::io_context & io_context,
+      const char * device);
+  ``  [''''&raquo;''' [link asio.reference.serial_port.serial_port.overload2 more...]]``
+
+  explicit ``[link asio.reference.serial_port.serial_port.overload3 serial_port]``(
+      asio::io_context & io_context,
+      const std::string & device);
+  ``  [''''&raquo;''' [link asio.reference.serial_port.serial_port.overload3 more...]]``
+
+
+Construct a [link asio.reference.serial_port `serial_port`] on an existing native serial port. 
+
+
+  ``[link asio.reference.serial_port.serial_port.overload4 serial_port]``(
+      asio::io_context & io_context,
+      const native_handle_type & native_serial_port);
+  ``  [''''&raquo;''' [link asio.reference.serial_port.serial_port.overload4 more...]]``
+
+
+Move-construct a [link asio.reference.serial_port `serial_port`] from another. 
+
+
+  ``[link asio.reference.serial_port.serial_port.overload5 serial_port]``(
+      serial_port && other);
+  ``  [''''&raquo;''' [link asio.reference.serial_port.serial_port.overload5 more...]]``
+
+
+[section:overload1 serial_port::serial_port (1 of 5 overloads)]
+
+
+Construct a [link asio.reference.serial_port `serial_port`] without opening it. 
+
+
+  serial_port(
+      asio::io_context & io_context);
+
+
+This constructor creates a serial port without opening it.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[io_context][The [link asio.reference.io_context `io_context`] object that the serial port will use to dispatch handlers for any asynchronous operations performed on the port. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+
+[section:overload2 serial_port::serial_port (2 of 5 overloads)]
+
+
+Construct and open a [link asio.reference.serial_port `serial_port`]. 
+
+
+  serial_port(
+      asio::io_context & io_context,
+      const char * device);
+
+
+This constructor creates and opens a serial port for the specified device name.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[io_context][The [link asio.reference.io_context `io_context`] object that the serial port will use to dispatch handlers for any asynchronous operations performed on the port.]]
+
+[[device][The platform-specific device name for this serial port. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+
+[section:overload3 serial_port::serial_port (3 of 5 overloads)]
+
+
+Construct and open a [link asio.reference.serial_port `serial_port`]. 
+
+
+  serial_port(
+      asio::io_context & io_context,
+      const std::string & device);
+
+
+This constructor creates and opens a serial port for the specified device name.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[io_context][The [link asio.reference.io_context `io_context`] object that the serial port will use to dispatch handlers for any asynchronous operations performed on the port.]]
+
+[[device][The platform-specific device name for this serial port. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+
+[section:overload4 serial_port::serial_port (4 of 5 overloads)]
+
+
+Construct a [link asio.reference.serial_port `serial_port`] on an existing native serial port. 
+
+
+  serial_port(
+      asio::io_context & io_context,
+      const native_handle_type & native_serial_port);
+
+
+This constructor creates a serial port object to hold an existing native serial port.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[io_context][The [link asio.reference.io_context `io_context`] object that the serial port will use to dispatch handlers for any asynchronous operations performed on the port.]]
+
+[[native_serial_port][A native serial port.]]
+
+]
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[asio::system_error][Thrown on failure. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+
+[section:overload5 serial_port::serial_port (5 of 5 overloads)]
+
+
+Move-construct a [link asio.reference.serial_port `serial_port`] from another. 
+
+
+  serial_port(
+      serial_port && other);
+
+
+This constructor moves a serial port from one object to another.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[other][The other [link asio.reference.serial_port `serial_port`] object from which the move will occur.]]
+
+]
+
+
+[heading Remarks]
+      
+Following the move, the moved-from object is in the same state as if constructed using the `serial_port(io_context&) constructor`. 
+
+
+
+
+[endsect]
+
+
+[endsect]
+
+[section:set_option serial_port::set_option]
+
+[indexterm2 set_option..serial_port] 
+Set an option on the serial port. 
+
+
+  template<
+      typename ``[link asio.reference.SettableSerialPortOption SettableSerialPortOption]``>
+  void ``[link asio.reference.serial_port.set_option.overload1 set_option]``(
+      const SettableSerialPortOption & option);
+  ``  [''''&raquo;''' [link asio.reference.serial_port.set_option.overload1 more...]]``
+
+  template<
+      typename ``[link asio.reference.SettableSerialPortOption SettableSerialPortOption]``>
+  asio::error_code ``[link asio.reference.serial_port.set_option.overload2 set_option]``(
+      const SettableSerialPortOption & option,
+      asio::error_code & ec);
+  ``  [''''&raquo;''' [link asio.reference.serial_port.set_option.overload2 more...]]``
+
+
+[section:overload1 serial_port::set_option (1 of 2 overloads)]
+
+
+Set an option on the serial port. 
+
+
+  template<
+      typename ``[link asio.reference.SettableSerialPortOption SettableSerialPortOption]``>
+  void set_option(
+      const SettableSerialPortOption & option);
+
+
+This function is used to set an option on the serial port.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[option][The option value to be set on the serial port.]]
+
+]
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[asio::system_error][Thrown on failure.]]
+
+]
+
+
+
+
+
+[endsect]
+
+
+
+[section:overload2 serial_port::set_option (2 of 2 overloads)]
+
+
+Set an option on the serial port. 
+
+
+  template<
+      typename ``[link asio.reference.SettableSerialPortOption SettableSerialPortOption]``>
+  asio::error_code set_option(
+      const SettableSerialPortOption & option,
+      asio::error_code & ec);
+
+
+This function is used to set an option on the serial port.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[option][The option value to be set on the serial port.]]
+
+[[ec][Set to indicate what error occurred, if any.]]
+
+]
+
+
+
+
+
+[endsect]
+
+
+[endsect]
+
+[section:write_some serial_port::write_some]
+
+[indexterm2 write_some..serial_port] 
+Write some data to the serial port. 
+
+
+  template<
+      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
+  std::size_t ``[link asio.reference.serial_port.write_some.overload1 write_some]``(
+      const ConstBufferSequence & buffers);
+  ``  [''''&raquo;''' [link asio.reference.serial_port.write_some.overload1 more...]]``
+
+  template<
+      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
+  std::size_t ``[link asio.reference.serial_port.write_some.overload2 write_some]``(
+      const ConstBufferSequence & buffers,
+      asio::error_code & ec);
+  ``  [''''&raquo;''' [link asio.reference.serial_port.write_some.overload2 more...]]``
+
+
+[section:overload1 serial_port::write_some (1 of 2 overloads)]
+
+
+Write some data to the serial port. 
+
+
+  template<
+      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
+  std::size_t write_some(
+      const ConstBufferSequence & buffers);
+
+
+This function is used to write data to the serial port. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[buffers][One or more data buffers to be written to the serial port.]]
+
+]
+
+
+[heading Return Value]
+      
+The number of bytes written.
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[asio::system_error][Thrown on failure. An error code of `asio::error::eof` indicates that the connection was closed by the peer.]]
+
+]
+
+
+[heading Remarks]
+      
+The write\_some operation may not transmit all of the data to the peer. Consider using the [link asio.reference.write `write`]  function if you need to ensure that all data is written before the blocking operation completes.
+
+
+[heading Example]
+  
+To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 
+
+   serial_port.write_some(asio::buffer(data, size));
+
+
+See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 
+
+
+
+
+[endsect]
+
+
+
+[section:overload2 serial_port::write_some (2 of 2 overloads)]
+
+
+Write some data to the serial port. 
+
+
+  template<
+      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
+  std::size_t write_some(
+      const ConstBufferSequence & buffers,
+      asio::error_code & ec);
+
+
+This function is used to write data to the serial port. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[buffers][One or more data buffers to be written to the serial port.]]
+
+[[ec][Set to indicate what error occurred, if any.]]
+
+]
+
+
+[heading Return Value]
+      
+The number of bytes written. Returns 0 if an error occurred.
+
+
+[heading Remarks]
+      
+The write\_some operation may not transmit all of the data to the peer. Consider using the [link asio.reference.write `write`]  function if you need to ensure that all data is written before the blocking operation completes. 
+
+
+
+
+[endsect]
+
+
+[endsect]
+
+
+[section:_serial_port serial_port::~serial_port]
+
+[indexterm2 ~serial_port..serial_port] 
+Destroys the serial port. 
+
+
+  ~serial_port();
+
+
+This function destroys the serial port, cancelling any outstanding asynchronous wait operations associated with the serial port as if by calling `cancel`. 
+
+
+[endsect]
+
+
+
+[endsect]
+
 [section:serial_port_base serial_port_base]
 
 
-The [link asio.reference.serial_port_base `serial_port_base`] class is used as a base for the [link asio.reference.basic_serial_port `basic_serial_port`] class template so that we have a common place to define the serial port options. 
+The [link asio.reference.serial_port_base `serial_port_base`] class is used as a base for the basic\_serial\_port class template so that we have a common place to define the serial port options. 
 
 
   class serial_port_base
@@ -108188,558 +99460,6 @@
 
 [endsect]
 
-[section:serial_port_service serial_port_service]
-
-
-Default service implementation for a serial port. 
-
-
-  class serial_port_service :
-    public io_context::service
-
-
-[heading Types]
-[table
-  [[Name][Description]]
-
-  [
-
-    [[link asio.reference.serial_port_service.implementation_type [*implementation_type]]]
-    [The type of a serial port implementation. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.serial_port_service.native_handle_type [*native_handle_type]]]
-    [The native handle type. ]
-  
-  ]
-
-]
-
-[heading Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.serial_port_service.assign [*assign]]]
-    [Assign an existing native handle to a serial port. ]
-  ]
-  
-  [
-    [[link asio.reference.serial_port_service.async_read_some [*async_read_some]]]
-    [Start an asynchronous read. ]
-  ]
-  
-  [
-    [[link asio.reference.serial_port_service.async_write_some [*async_write_some]]]
-    [Start an asynchronous write. ]
-  ]
-  
-  [
-    [[link asio.reference.serial_port_service.cancel [*cancel]]]
-    [Cancel all asynchronous operations associated with the handle. ]
-  ]
-  
-  [
-    [[link asio.reference.serial_port_service.close [*close]]]
-    [Close a serial port implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.serial_port_service.construct [*construct]]]
-    [Construct a new serial port implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.serial_port_service.destroy [*destroy]]]
-    [Destroy a serial port implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.serial_port_service.get_io_context [*get_io_context]]]
-    [Get the io_context object that owns the service. ]
-  ]
-  
-  [
-    [[link asio.reference.serial_port_service.get_io_service [*get_io_service]]]
-    [Get the io_context object that owns the service. ]
-  ]
-  
-  [
-    [[link asio.reference.serial_port_service.get_option [*get_option]]]
-    [Get a serial port option. ]
-  ]
-  
-  [
-    [[link asio.reference.serial_port_service.is_open [*is_open]]]
-    [Determine whether the handle is open. ]
-  ]
-  
-  [
-    [[link asio.reference.serial_port_service.move_assign [*move_assign]]]
-    [Move-assign from another serial port implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.serial_port_service.move_construct [*move_construct]]]
-    [Move-construct a new serial port implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.serial_port_service.native_handle [*native_handle]]]
-    [Get the native handle implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.serial_port_service.open [*open]]]
-    [Open a serial port. ]
-  ]
-  
-  [
-    [[link asio.reference.serial_port_service.read_some [*read_some]]]
-    [Read some data from the stream. ]
-  ]
-  
-  [
-    [[link asio.reference.serial_port_service.send_break [*send_break]]]
-    [Send a break sequence to the serial port. ]
-  ]
-  
-  [
-    [[link asio.reference.serial_port_service.serial_port_service [*serial_port_service]]]
-    [Construct a new serial port service for the specified io_context. ]
-  ]
-  
-  [
-    [[link asio.reference.serial_port_service.set_option [*set_option]]]
-    [Set a serial port option. ]
-  ]
-  
-  [
-    [[link asio.reference.serial_port_service.write_some [*write_some]]]
-    [Write the given data to the stream. ]
-  ]
-  
-]
-
-[heading Data Members]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.serial_port_service.id [*id]]]
-    [The unique service identifier. ]
-  ]
-
-]
-
-[heading Requirements]
-
-['Header: ][^asio/serial_port_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[section:assign serial_port_service::assign]
-
-[indexterm2 assign..serial_port_service] 
-Assign an existing native handle to a serial port. 
-
-
-  asio::error_code assign(
-      implementation_type & impl,
-      const native_handle_type & handle,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:async_read_some serial_port_service::async_read_some]
-
-[indexterm2 async_read_some..serial_port_service] 
-Start an asynchronous read. 
-
-
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
-      typename ``[link asio.reference.ReadHandler ReadHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_some(
-      implementation_type & impl,
-      const MutableBufferSequence & buffers,
-      ReadHandler && handler);
-
-
-
-[endsect]
-
-
-
-[section:async_write_some serial_port_service::async_write_some]
-
-[indexterm2 async_write_some..serial_port_service] 
-Start an asynchronous write. 
-
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
-      typename ``[link asio.reference.WriteHandler WriteHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_write_some(
-      implementation_type & impl,
-      const ConstBufferSequence & buffers,
-      WriteHandler && handler);
-
-
-
-[endsect]
-
-
-
-[section:cancel serial_port_service::cancel]
-
-[indexterm2 cancel..serial_port_service] 
-Cancel all asynchronous operations associated with the handle. 
-
-
-  asio::error_code cancel(
-      implementation_type & impl,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:close serial_port_service::close]
-
-[indexterm2 close..serial_port_service] 
-Close a serial port implementation. 
-
-
-  asio::error_code close(
-      implementation_type & impl,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:construct serial_port_service::construct]
-
-[indexterm2 construct..serial_port_service] 
-Construct a new serial port implementation. 
-
-
-  void construct(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:destroy serial_port_service::destroy]
-
-[indexterm2 destroy..serial_port_service] 
-Destroy a serial port implementation. 
-
-
-  void destroy(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:get_io_context serial_port_service::get_io_context]
-
-
-['Inherited from io_context.]
-
-[indexterm2 get_io_context..serial_port_service] 
-Get the [link asio.reference.io_context `io_context`] object that owns the service. 
-
-
-  asio::io_context & get_io_context();
-
-
-
-[endsect]
-
-
-
-[section:get_io_service serial_port_service::get_io_service]
-
-
-['Inherited from io_context.]
-
-[indexterm2 get_io_service..serial_port_service] 
-Get the [link asio.reference.io_context `io_context`] object that owns the service. 
-
-
-  asio::io_context & get_io_service();
-
-
-
-[endsect]
-
-
-
-[section:get_option serial_port_service::get_option]
-
-[indexterm2 get_option..serial_port_service] 
-Get a serial port option. 
-
-
-  template<
-      typename ``[link asio.reference.GettableSerialPortOption GettableSerialPortOption]``>
-  asio::error_code get_option(
-      const implementation_type & impl,
-      GettableSerialPortOption & option,
-      asio::error_code & ec) const;
-
-
-
-[endsect]
-
-
-
-[section:id serial_port_service::id]
-
-[indexterm2 id..serial_port_service] 
-The unique service identifier. 
-
-
-  static asio::io_context::id id;
-
-
-
-[endsect]
-
-
-
-[section:implementation_type serial_port_service::implementation_type]
-
-[indexterm2 implementation_type..serial_port_service] 
-The type of a serial port implementation. 
-
-
-  typedef implementation_defined implementation_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/serial_port_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:is_open serial_port_service::is_open]
-
-[indexterm2 is_open..serial_port_service] 
-Determine whether the handle is open. 
-
-
-  bool is_open(
-      const implementation_type & impl) const;
-
-
-
-[endsect]
-
-
-
-[section:move_assign serial_port_service::move_assign]
-
-[indexterm2 move_assign..serial_port_service] 
-Move-assign from another serial port implementation. 
-
-
-  void move_assign(
-      implementation_type & impl,
-      serial_port_service & other_service,
-      implementation_type & other_impl);
-
-
-
-[endsect]
-
-
-
-[section:move_construct serial_port_service::move_construct]
-
-[indexterm2 move_construct..serial_port_service] 
-Move-construct a new serial port implementation. 
-
-
-  void move_construct(
-      implementation_type & impl,
-      implementation_type & other_impl);
-
-
-
-[endsect]
-
-
-
-[section:native_handle serial_port_service::native_handle]
-
-[indexterm2 native_handle..serial_port_service] 
-Get the native handle implementation. 
-
-
-  native_handle_type native_handle(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:native_handle_type serial_port_service::native_handle_type]
-
-[indexterm2 native_handle_type..serial_port_service] 
-The native handle type. 
-
-
-  typedef implementation_defined native_handle_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/serial_port_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:open serial_port_service::open]
-
-[indexterm2 open..serial_port_service] 
-Open a serial port. 
-
-
-  asio::error_code open(
-      implementation_type & impl,
-      const std::string & device,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:read_some serial_port_service::read_some]
-
-[indexterm2 read_some..serial_port_service] 
-Read some data from the stream. 
-
-
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
-  std::size_t read_some(
-      implementation_type & impl,
-      const MutableBufferSequence & buffers,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:send_break serial_port_service::send_break]
-
-[indexterm2 send_break..serial_port_service] 
-Send a break sequence to the serial port. 
-
-
-  asio::error_code send_break(
-      implementation_type & impl,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:serial_port_service serial_port_service::serial_port_service]
-
-[indexterm2 serial_port_service..serial_port_service] 
-Construct a new serial port service for the specified [link asio.reference.io_context `io_context`]. 
-
-
-  serial_port_service(
-      asio::io_context & io_context);
-
-
-
-[endsect]
-
-
-
-[section:set_option serial_port_service::set_option]
-
-[indexterm2 set_option..serial_port_service] 
-Set a serial port option. 
-
-
-  template<
-      typename ``[link asio.reference.SettableSerialPortOption SettableSerialPortOption]``>
-  asio::error_code set_option(
-      implementation_type & impl,
-      const SettableSerialPortOption & option,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:write_some serial_port_service::write_some]
-
-[indexterm2 write_some..serial_port_service] 
-Write the given data to the stream. 
-
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
-  std::size_t write_some(
-      implementation_type & impl,
-      const ConstBufferSequence & buffers,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[endsect]
-
 [section:service_already_exists service_already_exists]
 
 
@@ -108781,14 +99501,14 @@
 
 [endsect]
 
-
 [section:signal_set signal_set]
 
-[indexterm1 signal_set] 
-Typedef for the typical usage of a signal set. 
+
+Provides signal functionality. 
 
 
-  typedef basic_signal_set signal_set;
+  class signal_set :
+    basic_io_object< detail::signal_set_service >
 
 
 [heading Types]
@@ -108797,25 +99517,11 @@
 
   [
 
-    [[link asio.reference.basic_signal_set.executor_type [*executor_type]]]
+    [[link asio.reference.signal_set.executor_type [*executor_type]]]
     [The type of the executor associated with the object. ]
   
   ]
 
-  [
-
-    [[link asio.reference.basic_signal_set.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.basic_signal_set.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
 ]
 
 [heading Member Functions]
@@ -108823,17 +99529,47 @@
   [[Name][Description]]
 
   [
-    [[link asio.reference.basic_signal_set.add [*add]]]
+    [[link asio.reference.signal_set.add [*add]]]
     [Add a signal to a signal_set. ]
   ]
   
   [
-    [[link asio.reference.basic_signal_set.async_wait [*async_wait]]]
+    [[link asio.reference.signal_set.async_wait [*async_wait]]]
     [Start an asynchronous operation to wait for a signal to be delivered. ]
   ]
   
   [
-    [[link asio.reference.basic_signal_set.basic_signal_set [*basic_signal_set]]]
+    [[link asio.reference.signal_set.cancel [*cancel]]]
+    [Cancel all operations associated with the signal set. ]
+  ]
+  
+  [
+    [[link asio.reference.signal_set.clear [*clear]]]
+    [Remove all signals from a signal_set. ]
+  ]
+  
+  [
+    [[link asio.reference.signal_set.get_executor [*get_executor]]]
+    [Get the executor associated with the object. ]
+  ]
+  
+  [
+    [[link asio.reference.signal_set.get_io_context [*get_io_context]]]
+    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
+  ]
+  
+  [
+    [[link asio.reference.signal_set.get_io_service [*get_io_service]]]
+    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
+  ]
+  
+  [
+    [[link asio.reference.signal_set.remove [*remove]]]
+    [Remove a signal from a signal_set. ]
+  ]
+  
+  [
+    [[link asio.reference.signal_set.signal_set [*signal_set]]]
     [Construct a signal set without adding any signals. 
 
      Construct a signal set and add one signal. 
@@ -108844,56 +99580,13 @@
   ]
   
   [
-    [[link asio.reference.basic_signal_set.cancel [*cancel]]]
-    [Cancel all operations associated with the signal set. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_signal_set.clear [*clear]]]
-    [Remove all signals from a signal_set. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_signal_set.get_executor [*get_executor]]]
-    [Get the executor associated with the object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_signal_set.get_io_context [*get_io_context]]]
-    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_signal_set.get_io_service [*get_io_service]]]
-    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_signal_set.remove [*remove]]]
-    [Remove a signal from a signal_set. ]
+    [[link asio.reference.signal_set._signal_set [*~signal_set]]]
+    [Destroys the signal set. ]
   ]
   
 ]
 
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.basic_signal_set.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_signal_set.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
-  ]
-  
-]
-
-The [link asio.reference.basic_signal_set `basic_signal_set`] class template provides the ability to perform an asynchronous wait for one or more signals to occur.
-
-Most applications will use the [link asio.reference.signal_set `signal_set`] typedef.
+The [link asio.reference.signal_set `signal_set`] class provides the ability to perform an asynchronous wait for one or more signals to occur.
 
 
 [heading Thread Safety]
@@ -108933,16 +99626,16 @@
   
 
 
-If a signal is registered with a signal\_set, and the signal occurs when there are no waiting handlers, then the signal notification is queued. The next async\_wait operation on that signal\_set will dequeue the notification. If multiple notifications are queued, subsequent async\_wait operations dequeue them one at a time. Signal notifications are dequeued in order of ascending signal number.
+If a signal is registered with a [link asio.reference.signal_set `signal_set`], and the signal occurs when there are no waiting handlers, then the signal notification is queued. The next async\_wait operation on that [link asio.reference.signal_set `signal_set`] will dequeue the notification. If multiple notifications are queued, subsequent async\_wait operations dequeue them one at a time. Signal notifications are dequeued in order of ascending signal number.
 
-If a signal number is removed from a signal\_set (using the `remove` or `erase` member functions) then any queued notifications for that signal are discarded.
+If a signal number is removed from a [link asio.reference.signal_set `signal_set`] (using the `remove` or `erase` member functions) then any queued notifications for that signal are discarded.
 
 
 [heading Multiple registration of signals]
   
 
 
-The same signal number may be registered with different signal\_set objects. When the signal occurs, one handler is called for each signal\_set object.
+The same signal number may be registered with different [link asio.reference.signal_set `signal_set`] objects. When the signal occurs, one handler is called for each [link asio.reference.signal_set `signal_set`] object.
 
 Note that multiple registration only works for signals that are registered using Asio. The application must not also register a signal handler using functions such as `signal()` or `sigaction()`.
 
@@ -108951,7 +99644,394 @@
   
 
 
-POSIX allows signals to be blocked using functions such as `sigprocmask()` and `pthread_sigmask()`. For signals to be delivered, programs must ensure that any signals registered using signal\_set objects are unblocked in at least one thread. 
+POSIX allows signals to be blocked using functions such as `sigprocmask()` and `pthread_sigmask()`. For signals to be delivered, programs must ensure that any signals registered using [link asio.reference.signal_set `signal_set`] objects are unblocked in at least one thread. 
+
+[heading Requirements]
+
+['Header: ][^asio/signal_set.hpp]
+
+['Convenience header: ][^asio.hpp]
+
+[section:add signal_set::add]
+
+[indexterm2 add..signal_set] 
+Add a signal to a [link asio.reference.signal_set `signal_set`]. 
+
+
+  void ``[link asio.reference.signal_set.add.overload1 add]``(
+      int signal_number);
+  ``  [''''&raquo;''' [link asio.reference.signal_set.add.overload1 more...]]``
+
+  asio::error_code ``[link asio.reference.signal_set.add.overload2 add]``(
+      int signal_number,
+      asio::error_code & ec);
+  ``  [''''&raquo;''' [link asio.reference.signal_set.add.overload2 more...]]``
+
+
+[section:overload1 signal_set::add (1 of 2 overloads)]
+
+
+Add a signal to a [link asio.reference.signal_set `signal_set`]. 
+
+
+  void add(
+      int signal_number);
+
+
+This function adds the specified signal to the set. It has no effect if the signal is already in the set.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[signal_number][The signal to be added to the set.]]
+
+]
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[asio::system_error][Thrown on failure. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+
+[section:overload2 signal_set::add (2 of 2 overloads)]
+
+
+Add a signal to a [link asio.reference.signal_set `signal_set`]. 
+
+
+  asio::error_code add(
+      int signal_number,
+      asio::error_code & ec);
+
+
+This function adds the specified signal to the set. It has no effect if the signal is already in the set.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[signal_number][The signal to be added to the set.]]
+
+[[ec][Set to indicate what error occurred, if any. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+[endsect]
+
+
+[section:async_wait signal_set::async_wait]
+
+[indexterm2 async_wait..signal_set] 
+Start an asynchronous operation to wait for a signal to be delivered. 
+
+
+  template<
+      typename ``[link asio.reference.SignalHandler SignalHandler]``>
+  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
+      SignalHandler && handler);
+
+
+This function may be used to initiate an asynchronous wait against the signal set. It always returns immediately.
+
+For each call to `async_wait()`, the supplied handler will be called exactly once. The handler will be called when:
+
+
+* One of the registered signals in the signal set occurs; or
+
+
+* The signal set was cancelled, in which case the handler is passed the error code `asio::error::operation_aborted`.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[handler][The handler to be called when the signal occurs. Copies will be made of the handler as required. The function signature of the handler must be: 
+``
+   void handler(
+     const asio::error_code& error, // Result of operation.
+     int signal_number // Indicates which signal occurred.
+   ); 
+``
+Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using `asio::io_context::post()`. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+[section:cancel signal_set::cancel]
+
+[indexterm2 cancel..signal_set] 
+Cancel all operations associated with the signal set. 
+
+
+  void ``[link asio.reference.signal_set.cancel.overload1 cancel]``();
+  ``  [''''&raquo;''' [link asio.reference.signal_set.cancel.overload1 more...]]``
+
+  asio::error_code ``[link asio.reference.signal_set.cancel.overload2 cancel]``(
+      asio::error_code & ec);
+  ``  [''''&raquo;''' [link asio.reference.signal_set.cancel.overload2 more...]]``
+
+
+[section:overload1 signal_set::cancel (1 of 2 overloads)]
+
+
+Cancel all operations associated with the signal set. 
+
+
+  void cancel();
+
+
+This function forces the completion of any pending asynchronous wait operations against the signal set. The handler for each cancelled operation will be invoked with the `asio::error::operation_aborted` error code.
+
+Cancellation does not alter the set of registered signals.
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[asio::system_error][Thrown on failure.]]
+
+]
+
+
+[heading Remarks]
+      
+If a registered signal occurred before `cancel()` is called, then the handlers for asynchronous wait operations will:
+
+
+* have already been invoked; or
+
+
+* have been queued for invocation in the near future.
+
+These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation. 
+
+
+[endsect]
+
+
+
+[section:overload2 signal_set::cancel (2 of 2 overloads)]
+
+
+Cancel all operations associated with the signal set. 
+
+
+  asio::error_code cancel(
+      asio::error_code & ec);
+
+
+This function forces the completion of any pending asynchronous wait operations against the signal set. The handler for each cancelled operation will be invoked with the `asio::error::operation_aborted` error code.
+
+Cancellation does not alter the set of registered signals.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[ec][Set to indicate what error occurred, if any.]]
+
+]
+
+
+[heading Remarks]
+      
+If a registered signal occurred before `cancel()` is called, then the handlers for asynchronous wait operations will:
+
+
+* have already been invoked; or
+
+
+* have been queued for invocation in the near future.
+
+These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation. 
+
+
+[endsect]
+
+
+[endsect]
+
+[section:clear signal_set::clear]
+
+[indexterm2 clear..signal_set] 
+Remove all signals from a [link asio.reference.signal_set `signal_set`]. 
+
+
+  void ``[link asio.reference.signal_set.clear.overload1 clear]``();
+  ``  [''''&raquo;''' [link asio.reference.signal_set.clear.overload1 more...]]``
+
+  asio::error_code ``[link asio.reference.signal_set.clear.overload2 clear]``(
+      asio::error_code & ec);
+  ``  [''''&raquo;''' [link asio.reference.signal_set.clear.overload2 more...]]``
+
+
+[section:overload1 signal_set::clear (1 of 2 overloads)]
+
+
+Remove all signals from a [link asio.reference.signal_set `signal_set`]. 
+
+
+  void clear();
+
+
+This function removes all signals from the set. It has no effect if the set is already empty.
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[asio::system_error][Thrown on failure.]]
+
+]
+
+
+[heading Remarks]
+      
+Removes all queued notifications. 
+
+
+
+
+[endsect]
+
+
+
+[section:overload2 signal_set::clear (2 of 2 overloads)]
+
+
+Remove all signals from a [link asio.reference.signal_set `signal_set`]. 
+
+
+  asio::error_code clear(
+      asio::error_code & ec);
+
+
+This function removes all signals from the set. It has no effect if the set is already empty.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[ec][Set to indicate what error occurred, if any.]]
+
+]
+
+
+[heading Remarks]
+      
+Removes all queued notifications. 
+
+
+
+
+[endsect]
+
+
+[endsect]
+
+
+[section:executor_type signal_set::executor_type]
+
+[indexterm2 executor_type..signal_set] 
+The type of the executor associated with the object. 
+
+
+  typedef io_context::executor_type executor_type;
+
+
+[heading Member Functions]
+[table
+  [[Name][Description]]
+
+  [
+    [[link asio.reference.io_context__executor_type.context [*context]]]
+    [Obtain the underlying execution context. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context__executor_type.defer [*defer]]]
+    [Request the io_context to invoke the given function object. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context__executor_type.dispatch [*dispatch]]]
+    [Request the io_context to invoke the given function object. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context__executor_type.on_work_finished [*on_work_finished]]]
+    [Inform the io_context that some work is no longer outstanding. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context__executor_type.on_work_started [*on_work_started]]]
+    [Inform the io_context that it has some outstanding work to do. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context__executor_type.post [*post]]]
+    [Request the io_context to invoke the given function object. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context__executor_type.running_in_this_thread [*running_in_this_thread]]]
+    [Determine whether the io_context is running in the current thread. ]
+  ]
+  
+]
+
+[heading Friends]
+[table
+  [[Name][Description]]
+
+  [
+    [[link asio.reference.io_context__executor_type.operator_not__eq_ [*operator!=]]]
+    [Compare two executors for inequality. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context__executor_type.operator_eq__eq_ [*operator==]]]
+    [Compare two executors for equality. ]
+  ]
+  
+]
 
 
 [heading Requirements]
@@ -108964,113 +100044,14 @@
 [endsect]
 
 
-[section:signal_set_service signal_set_service]
+
+[section:get_executor signal_set::get_executor]
+
+[indexterm2 get_executor..signal_set] 
+Get the executor associated with the object. 
 
 
-Default service implementation for a signal set. 
-
-
-  class signal_set_service :
-    public io_context::service
-
-
-[heading Types]
-[table
-  [[Name][Description]]
-
-  [
-
-    [[link asio.reference.signal_set_service.implementation_type [*implementation_type]]]
-    [The type of a signal set implementation. ]
-  
-  ]
-
-]
-
-[heading Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.signal_set_service.add [*add]]]
-    [Add a signal to a signal_set. ]
-  ]
-  
-  [
-    [[link asio.reference.signal_set_service.async_wait [*async_wait]]]
-    []
-  ]
-  
-  [
-    [[link asio.reference.signal_set_service.cancel [*cancel]]]
-    [Cancel all operations associated with the signal set. ]
-  ]
-  
-  [
-    [[link asio.reference.signal_set_service.clear [*clear]]]
-    [Remove all signals from a signal_set. ]
-  ]
-  
-  [
-    [[link asio.reference.signal_set_service.construct [*construct]]]
-    [Construct a new signal set implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.signal_set_service.destroy [*destroy]]]
-    [Destroy a signal set implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.signal_set_service.get_io_context [*get_io_context]]]
-    [Get the io_context object that owns the service. ]
-  ]
-  
-  [
-    [[link asio.reference.signal_set_service.get_io_service [*get_io_service]]]
-    [Get the io_context object that owns the service. ]
-  ]
-  
-  [
-    [[link asio.reference.signal_set_service.remove [*remove]]]
-    [Remove a signal to a signal_set. ]
-  ]
-  
-  [
-    [[link asio.reference.signal_set_service.signal_set_service [*signal_set_service]]]
-    [Construct a new signal set service for the specified io_context. ]
-  ]
-  
-]
-
-[heading Data Members]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.signal_set_service.id [*id]]]
-    [The unique service identifier. ]
-  ]
-
-]
-
-[heading Requirements]
-
-['Header: ][^asio/signal_set_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[section:add signal_set_service::add]
-
-[indexterm2 add..signal_set_service] 
-Add a signal to a signal\_set. 
-
-
-  asio::error_code add(
-      implementation_type & impl,
-      int signal_number,
-      asio::error_code & ec);
+  executor_type get_executor();
 
 
 
@@ -109078,125 +100059,104 @@
 
 
 
-[section:async_wait signal_set_service::async_wait]
+[section:get_io_context signal_set::get_io_context]
 
-[indexterm2 async_wait..signal_set_service] 
-
-  template<
-      typename ``[link asio.reference.SignalHandler SignalHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
-      implementation_type & impl,
-      SignalHandler && handler);
-
-
-
-[endsect]
-
-
-
-[section:cancel signal_set_service::cancel]
-
-[indexterm2 cancel..signal_set_service] 
-Cancel all operations associated with the signal set. 
-
-
-  asio::error_code cancel(
-      implementation_type & impl,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:clear signal_set_service::clear]
-
-[indexterm2 clear..signal_set_service] 
-Remove all signals from a signal\_set. 
-
-
-  asio::error_code clear(
-      implementation_type & impl,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:construct signal_set_service::construct]
-
-[indexterm2 construct..signal_set_service] 
-Construct a new signal set implementation. 
-
-
-  void construct(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:destroy signal_set_service::destroy]
-
-[indexterm2 destroy..signal_set_service] 
-Destroy a signal set implementation. 
-
-
-  void destroy(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:get_io_context signal_set_service::get_io_context]
-
-
-['Inherited from io_context.]
-
-[indexterm2 get_io_context..signal_set_service] 
-Get the [link asio.reference.io_context `io_context`] object that owns the service. 
+[indexterm2 get_io_context..signal_set] 
+(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
 
 
   asio::io_context & get_io_context();
 
 
+This function may be used to obtain the [link asio.reference.io_context `io_context`] object that the I/O object uses to dispatch handlers for asynchronous operations.
+
+
+[heading Return Value]
+      
+A reference to the [link asio.reference.io_context `io_context`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 
+
+
+
 
 [endsect]
 
 
 
-[section:get_io_service signal_set_service::get_io_service]
+[section:get_io_service signal_set::get_io_service]
 
-
-['Inherited from io_context.]
-
-[indexterm2 get_io_service..signal_set_service] 
-Get the [link asio.reference.io_context `io_context`] object that owns the service. 
+[indexterm2 get_io_service..signal_set] 
+(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
 
 
   asio::io_context & get_io_service();
 
 
+This function may be used to obtain the [link asio.reference.io_context `io_context`] object that the I/O object uses to dispatch handlers for asynchronous operations.
+
+
+[heading Return Value]
+      
+A reference to the [link asio.reference.io_context `io_context`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 
+
+
+
 
 [endsect]
 
 
+[section:remove signal_set::remove]
 
-[section:id signal_set_service::id]
-
-[indexterm2 id..signal_set_service] 
-The unique service identifier. 
+[indexterm2 remove..signal_set] 
+Remove a signal from a [link asio.reference.signal_set `signal_set`]. 
 
 
-  static asio::io_context::id id;
+  void ``[link asio.reference.signal_set.remove.overload1 remove]``(
+      int signal_number);
+  ``  [''''&raquo;''' [link asio.reference.signal_set.remove.overload1 more...]]``
+
+  asio::error_code ``[link asio.reference.signal_set.remove.overload2 remove]``(
+      int signal_number,
+      asio::error_code & ec);
+  ``  [''''&raquo;''' [link asio.reference.signal_set.remove.overload2 more...]]``
+
+
+[section:overload1 signal_set::remove (1 of 2 overloads)]
+
+
+Remove a signal from a [link asio.reference.signal_set `signal_set`]. 
+
+
+  void remove(
+      int signal_number);
+
+
+This function removes the specified signal from the set. It has no effect if the signal is not in the set.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[signal_number][The signal to be removed from the set.]]
+
+]
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[asio::system_error][Thrown on failure.]]
+
+]
+
+
+[heading Remarks]
+      
+Removes any notifications that have been queued for the specified signal number. 
+
 
 
 
@@ -109204,280 +100164,150 @@
 
 
 
-[section:implementation_type signal_set_service::implementation_type]
-
-[indexterm2 implementation_type..signal_set_service] 
-The type of a signal set implementation. 
+[section:overload2 signal_set::remove (2 of 2 overloads)]
 
 
-  typedef implementation_defined implementation_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/signal_set_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:remove signal_set_service::remove]
-
-[indexterm2 remove..signal_set_service] 
-Remove a signal to a signal\_set. 
+Remove a signal from a [link asio.reference.signal_set `signal_set`]. 
 
 
   asio::error_code remove(
-      implementation_type & impl,
       int signal_number,
       asio::error_code & ec);
 
 
+This function removes the specified signal from the set. It has no effect if the signal is not in the set.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[signal_number][The signal to be removed from the set.]]
+
+[[ec][Set to indicate what error occurred, if any.]]
+
+]
+
+
+[heading Remarks]
+      
+Removes any notifications that have been queued for the specified signal number. 
+
+
+
 
 [endsect]
 
 
+[endsect]
 
-[section:signal_set_service signal_set_service::signal_set_service]
+[section:signal_set signal_set::signal_set]
 
-[indexterm2 signal_set_service..signal_set_service] 
-Construct a new signal set service for the specified [link asio.reference.io_context `io_context`]. 
+[indexterm2 signal_set..signal_set] 
+Construct a signal set without adding any signals. 
 
 
-  signal_set_service(
+  explicit ``[link asio.reference.signal_set.signal_set.overload1 signal_set]``(
+      asio::io_context & io_context);
+  ``  [''''&raquo;''' [link asio.reference.signal_set.signal_set.overload1 more...]]``
+
+
+Construct a signal set and add one signal. 
+
+
+  ``[link asio.reference.signal_set.signal_set.overload2 signal_set]``(
+      asio::io_context & io_context,
+      int signal_number_1);
+  ``  [''''&raquo;''' [link asio.reference.signal_set.signal_set.overload2 more...]]``
+
+
+Construct a signal set and add two signals. 
+
+
+  ``[link asio.reference.signal_set.signal_set.overload3 signal_set]``(
+      asio::io_context & io_context,
+      int signal_number_1,
+      int signal_number_2);
+  ``  [''''&raquo;''' [link asio.reference.signal_set.signal_set.overload3 more...]]``
+
+
+Construct a signal set and add three signals. 
+
+
+  ``[link asio.reference.signal_set.signal_set.overload4 signal_set]``(
+      asio::io_context & io_context,
+      int signal_number_1,
+      int signal_number_2,
+      int signal_number_3);
+  ``  [''''&raquo;''' [link asio.reference.signal_set.signal_set.overload4 more...]]``
+
+
+[section:overload1 signal_set::signal_set (1 of 4 overloads)]
+
+
+Construct a signal set without adding any signals. 
+
+
+  signal_set(
       asio::io_context & io_context);
 
 
-
-[endsect]
+This constructor creates a signal set without registering for any signals.
 
 
+[heading Parameters]
+    
 
-[endsect]
-
-[section:socket_acceptor_service socket_acceptor_service]
-
-
-Default service implementation for a socket acceptor. 
-
-
-  template<
-      typename ``[link asio.reference.Protocol Protocol]``>
-  class socket_acceptor_service :
-    public io_context::service
-
-
-[heading Types]
-[table
-  [[Name][Description]]
-
-  [
-
-    [[link asio.reference.socket_acceptor_service.endpoint_type [*endpoint_type]]]
-    [The endpoint type. ]
+[variablelist
   
-  ]
-
-  [
-
-    [[link asio.reference.socket_acceptor_service.implementation_type [*implementation_type]]]
-    [The native type of the socket acceptor. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.socket_acceptor_service.native_handle_type [*native_handle_type]]]
-    [The native acceptor type. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.socket_acceptor_service.protocol_type [*protocol_type]]]
-    [The protocol type. ]
-  
-  ]
+[[io_context][The [link asio.reference.io_context `io_context`] object that the signal set will use to dispatch handlers for any asynchronous operations performed on the set. ]]
 
 ]
 
-[heading Member Functions]
-[table
-  [[Name][Description]]
 
-  [
-    [[link asio.reference.socket_acceptor_service.accept [*accept]]]
-    [Accept a new connection. ]
-  ]
-  
-  [
-    [[link asio.reference.socket_acceptor_service.assign [*assign]]]
-    [Assign an existing native acceptor to a socket acceptor. ]
-  ]
-  
-  [
-    [[link asio.reference.socket_acceptor_service.async_accept [*async_accept]]]
-    [Start an asynchronous accept. ]
-  ]
-  
-  [
-    [[link asio.reference.socket_acceptor_service.async_wait [*async_wait]]]
-    [Asynchronously wait for the acceptor to become ready to read, ready to write, or to have pending error conditions. ]
-  ]
-  
-  [
-    [[link asio.reference.socket_acceptor_service.bind [*bind]]]
-    [Bind the socket acceptor to the specified local endpoint. ]
-  ]
-  
-  [
-    [[link asio.reference.socket_acceptor_service.cancel [*cancel]]]
-    [Cancel all asynchronous operations associated with the acceptor. ]
-  ]
-  
-  [
-    [[link asio.reference.socket_acceptor_service.close [*close]]]
-    [Close a socket acceptor implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.socket_acceptor_service.construct [*construct]]]
-    [Construct a new socket acceptor implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.socket_acceptor_service.converting_move_construct [*converting_move_construct]]]
-    [Move-construct a new socket acceptor implementation from another protocol type. ]
-  ]
-  
-  [
-    [[link asio.reference.socket_acceptor_service.destroy [*destroy]]]
-    [Destroy a socket acceptor implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.socket_acceptor_service.get_io_context [*get_io_context]]]
-    [Get the io_context object that owns the service. ]
-  ]
-  
-  [
-    [[link asio.reference.socket_acceptor_service.get_io_service [*get_io_service]]]
-    [Get the io_context object that owns the service. ]
-  ]
-  
-  [
-    [[link asio.reference.socket_acceptor_service.get_option [*get_option]]]
-    [Get a socket option. ]
-  ]
-  
-  [
-    [[link asio.reference.socket_acceptor_service.io_control [*io_control]]]
-    [Perform an IO control command on the socket. ]
-  ]
-  
-  [
-    [[link asio.reference.socket_acceptor_service.is_open [*is_open]]]
-    [Determine whether the acceptor is open. ]
-  ]
-  
-  [
-    [[link asio.reference.socket_acceptor_service.listen [*listen]]]
-    [Place the socket acceptor into the state where it will listen for new connections. ]
-  ]
-  
-  [
-    [[link asio.reference.socket_acceptor_service.local_endpoint [*local_endpoint]]]
-    [Get the local endpoint. ]
-  ]
-  
-  [
-    [[link asio.reference.socket_acceptor_service.move_assign [*move_assign]]]
-    [Move-assign from another socket acceptor implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.socket_acceptor_service.move_construct [*move_construct]]]
-    [Move-construct a new socket acceptor implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.socket_acceptor_service.native_handle [*native_handle]]]
-    [Get the native acceptor implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.socket_acceptor_service.native_non_blocking [*native_non_blocking]]]
-    [Gets the non-blocking mode of the native acceptor implementation. 
 
-     Sets the non-blocking mode of the native acceptor implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.socket_acceptor_service.non_blocking [*non_blocking]]]
-    [Gets the non-blocking mode of the acceptor. 
 
-     Sets the non-blocking mode of the acceptor. ]
-  ]
-  
-  [
-    [[link asio.reference.socket_acceptor_service.open [*open]]]
-    [Open a new socket acceptor implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.socket_acceptor_service.set_option [*set_option]]]
-    [Set a socket option. ]
-  ]
-  
-  [
-    [[link asio.reference.socket_acceptor_service.socket_acceptor_service [*socket_acceptor_service]]]
-    [Construct a new socket acceptor service for the specified io_context. ]
-  ]
-  
-  [
-    [[link asio.reference.socket_acceptor_service.wait [*wait]]]
-    [Wait for the acceptor to become ready to read, ready to write, or to have pending error conditions. ]
-  ]
-  
-]
+[endsect]
 
-[heading Data Members]
-[table
-  [[Name][Description]]
 
-  [
-    [[link asio.reference.socket_acceptor_service.id [*id]]]
-    [The unique service identifier. ]
-  ]
+
+[section:overload2 signal_set::signal_set (2 of 4 overloads)]
+
+
+Construct a signal set and add one signal. 
+
+
+  signal_set(
+      asio::io_context & io_context,
+      int signal_number_1);
+
+
+This constructor creates a signal set and registers for one signal.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[io_context][The [link asio.reference.io_context `io_context`] object that the signal set will use to dispatch handlers for any asynchronous operations performed on the set.]]
+
+[[signal_number_1][The signal number to be added.]]
 
 ]
 
-[heading Requirements]
 
-['Header: ][^asio/socket_acceptor_service.hpp]
+[heading Remarks]
+      
+This constructor is equivalent to performing: 
 
-['Convenience header: ][^asio.hpp]
+   asio::signal_set signals(io_context);
+   signals.add(signal_number_1); 
 
 
-[section:accept socket_acceptor_service::accept]
-
-[indexterm2 accept..socket_acceptor_service] 
-Accept a new connection. 
 
 
-  template<
-      typename ``[link asio.reference.Protocol Protocol1]``,
-      typename ``[link asio.reference.SocketService SocketService]``>
-  asio::error_code accept(
-      implementation_type & impl,
-      basic_socket< Protocol1, SocketService > & peer,
-      endpoint_type * peer_endpoint,
-      asio::error_code & ec,
-      typename enable_if< is_convertible< Protocol, Protocol1 >::value >::type *  = 0);
 
 
 
@@ -109485,17 +100315,46 @@
 
 
 
-[section:assign socket_acceptor_service::assign]
-
-[indexterm2 assign..socket_acceptor_service] 
-Assign an existing native acceptor to a socket acceptor. 
+[section:overload3 signal_set::signal_set (3 of 4 overloads)]
 
 
-  asio::error_code assign(
-      implementation_type & impl,
-      const protocol_type & protocol,
-      const native_handle_type & native_acceptor,
-      asio::error_code & ec);
+Construct a signal set and add two signals. 
+
+
+  signal_set(
+      asio::io_context & io_context,
+      int signal_number_1,
+      int signal_number_2);
+
+
+This constructor creates a signal set and registers for two signals.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[io_context][The [link asio.reference.io_context `io_context`] object that the signal set will use to dispatch handlers for any asynchronous operations performed on the set.]]
+
+[[signal_number_1][The first signal number to be added.]]
+
+[[signal_number_2][The second signal number to be added.]]
+
+]
+
+
+[heading Remarks]
+      
+This constructor is equivalent to performing: 
+
+   asio::signal_set signals(io_context);
+   signals.add(signal_number_1);
+   signals.add(signal_number_2); 
+
+
+
+
 
 
 
@@ -109503,490 +100362,50 @@
 
 
 
-[section:async_accept socket_acceptor_service::async_accept]
+[section:overload4 signal_set::signal_set (4 of 4 overloads)]
 
-[indexterm2 async_accept..socket_acceptor_service] 
-Start an asynchronous accept. 
 
+Construct a signal set and add three signals. 
 
-  template<
-      typename ``[link asio.reference.Protocol Protocol1]``,
-      typename ``[link asio.reference.SocketService SocketService]``,
-      typename ``[link asio.reference.AcceptHandler AcceptHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_accept(
-      implementation_type & impl,
-      basic_socket< Protocol1, SocketService > & peer,
-      endpoint_type * peer_endpoint,
-      AcceptHandler && handler,
-      typename enable_if< is_convertible< Protocol, Protocol1 >::value >::type *  = 0);
 
+  signal_set(
+      asio::io_context & io_context,
+      int signal_number_1,
+      int signal_number_2,
+      int signal_number_3);
 
 
-[endsect]
+This constructor creates a signal set and registers for three signals.
 
 
+[heading Parameters]
+    
 
-[section:async_wait socket_acceptor_service::async_wait]
+[variablelist
+  
+[[io_context][The [link asio.reference.io_context `io_context`] object that the signal set will use to dispatch handlers for any asynchronous operations performed on the set.]]
 
-[indexterm2 async_wait..socket_acceptor_service] 
-Asynchronously wait for the acceptor to become ready to read, ready to write, or to have pending error conditions. 
+[[signal_number_1][The first signal number to be added.]]
 
+[[signal_number_2][The second signal number to be added.]]
 
-  template<
-      typename ``[link asio.reference.WaitHandler WaitHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
-      implementation_type & impl,
-      socket_base::wait_type w,
-      WaitHandler && handler);
+[[signal_number_3][The third signal number to be added.]]
 
+]
 
 
-[endsect]
+[heading Remarks]
+      
+This constructor is equivalent to performing: 
 
-
-
-[section:bind socket_acceptor_service::bind]
-
-[indexterm2 bind..socket_acceptor_service] 
-Bind the socket acceptor to the specified local endpoint. 
-
-
-  asio::error_code bind(
-      implementation_type & impl,
-      const endpoint_type & endpoint,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:cancel socket_acceptor_service::cancel]
-
-[indexterm2 cancel..socket_acceptor_service] 
-Cancel all asynchronous operations associated with the acceptor. 
-
-
-  asio::error_code cancel(
-      implementation_type & impl,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:close socket_acceptor_service::close]
-
-[indexterm2 close..socket_acceptor_service] 
-Close a socket acceptor implementation. 
-
-
-  asio::error_code close(
-      implementation_type & impl,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:construct socket_acceptor_service::construct]
-
-[indexterm2 construct..socket_acceptor_service] 
-Construct a new socket acceptor implementation. 
-
-
-  void construct(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:converting_move_construct socket_acceptor_service::converting_move_construct]
-
-[indexterm2 converting_move_construct..socket_acceptor_service] 
-Move-construct a new socket acceptor implementation from another protocol type. 
-
-
-  template<
-      typename ``[link asio.reference.Protocol Protocol1]``>
-  void converting_move_construct(
-      implementation_type & impl,
-      typename socket_acceptor_service< Protocol1 >::implementation_type & other_impl,
-      typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);
-
-
-
-[endsect]
-
-
-
-[section:destroy socket_acceptor_service::destroy]
-
-[indexterm2 destroy..socket_acceptor_service] 
-Destroy a socket acceptor implementation. 
-
-
-  void destroy(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:endpoint_type socket_acceptor_service::endpoint_type]
-
-[indexterm2 endpoint_type..socket_acceptor_service] 
-The endpoint type. 
-
-
-  typedef protocol_type::endpoint endpoint_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/socket_acceptor_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:get_io_context socket_acceptor_service::get_io_context]
-
-
-['Inherited from io_context.]
-
-[indexterm2 get_io_context..socket_acceptor_service] 
-Get the [link asio.reference.io_context `io_context`] object that owns the service. 
-
-
-  asio::io_context & get_io_context();
-
-
-
-[endsect]
-
-
-
-[section:get_io_service socket_acceptor_service::get_io_service]
-
-
-['Inherited from io_context.]
-
-[indexterm2 get_io_service..socket_acceptor_service] 
-Get the [link asio.reference.io_context `io_context`] object that owns the service. 
-
-
-  asio::io_context & get_io_service();
-
-
-
-[endsect]
-
-
-
-[section:get_option socket_acceptor_service::get_option]
-
-[indexterm2 get_option..socket_acceptor_service] 
-Get a socket option. 
-
-
-  template<
-      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
-  asio::error_code get_option(
-      const implementation_type & impl,
-      GettableSocketOption & option,
-      asio::error_code & ec) const;
-
-
-
-[endsect]
-
-
-
-[section:id socket_acceptor_service::id]
-
-[indexterm2 id..socket_acceptor_service] 
-The unique service identifier. 
-
-
-  static asio::io_context::id id;
-
-
-
-[endsect]
-
-
-
-[section:implementation_type socket_acceptor_service::implementation_type]
-
-[indexterm2 implementation_type..socket_acceptor_service] 
-The native type of the socket acceptor. 
-
-
-  typedef implementation_defined implementation_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/socket_acceptor_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:io_control socket_acceptor_service::io_control]
-
-[indexterm2 io_control..socket_acceptor_service] 
-Perform an IO control command on the socket. 
-
-
-  template<
-      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
-  asio::error_code io_control(
-      implementation_type & impl,
-      IoControlCommand & command,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:is_open socket_acceptor_service::is_open]
-
-[indexterm2 is_open..socket_acceptor_service] 
-Determine whether the acceptor is open. 
-
-
-  bool is_open(
-      const implementation_type & impl) const;
-
-
-
-[endsect]
-
-
-
-[section:listen socket_acceptor_service::listen]
-
-[indexterm2 listen..socket_acceptor_service] 
-Place the socket acceptor into the state where it will listen for new connections. 
-
-
-  asio::error_code listen(
-      implementation_type & impl,
-      int backlog,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:local_endpoint socket_acceptor_service::local_endpoint]
-
-[indexterm2 local_endpoint..socket_acceptor_service] 
-Get the local endpoint. 
-
-
-  endpoint_type local_endpoint(
-      const implementation_type & impl,
-      asio::error_code & ec) const;
-
-
-
-[endsect]
-
-
-
-[section:move_assign socket_acceptor_service::move_assign]
-
-[indexterm2 move_assign..socket_acceptor_service] 
-Move-assign from another socket acceptor implementation. 
-
-
-  void move_assign(
-      implementation_type & impl,
-      socket_acceptor_service & other_service,
-      implementation_type & other_impl);
-
-
-
-[endsect]
-
-
-
-[section:move_construct socket_acceptor_service::move_construct]
-
-[indexterm2 move_construct..socket_acceptor_service] 
-Move-construct a new socket acceptor implementation. 
-
-
-  void move_construct(
-      implementation_type & impl,
-      implementation_type & other_impl);
-
-
-
-[endsect]
-
-
-
-[section:native_handle socket_acceptor_service::native_handle]
-
-[indexterm2 native_handle..socket_acceptor_service] 
-Get the native acceptor implementation. 
-
-
-  native_handle_type native_handle(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:native_handle_type socket_acceptor_service::native_handle_type]
-
-[indexterm2 native_handle_type..socket_acceptor_service] 
-The native acceptor type. 
-
-
-  typedef implementation_defined native_handle_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/socket_acceptor_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-[section:native_non_blocking socket_acceptor_service::native_non_blocking]
-
-[indexterm2 native_non_blocking..socket_acceptor_service] 
-Gets the non-blocking mode of the native acceptor implementation. 
-
-
-  bool ``[link asio.reference.socket_acceptor_service.native_non_blocking.overload1 native_non_blocking]``(
-      const implementation_type & impl) const;
-  ``  [''''&raquo;''' [link asio.reference.socket_acceptor_service.native_non_blocking.overload1 more...]]``
-
-
-Sets the non-blocking mode of the native acceptor implementation. 
-
-
-  asio::error_code ``[link asio.reference.socket_acceptor_service.native_non_blocking.overload2 native_non_blocking]``(
-      implementation_type & impl,
-      bool mode,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.socket_acceptor_service.native_non_blocking.overload2 more...]]``
-
-
-[section:overload1 socket_acceptor_service::native_non_blocking (1 of 2 overloads)]
-
-
-Gets the non-blocking mode of the native acceptor implementation. 
-
-
-  bool native_non_blocking(
-      const implementation_type & impl) const;
-
-
-
-[endsect]
-
-
-
-[section:overload2 socket_acceptor_service::native_non_blocking (2 of 2 overloads)]
-
-
-Sets the non-blocking mode of the native acceptor implementation. 
-
-
-  asio::error_code native_non_blocking(
-      implementation_type & impl,
-      bool mode,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-[endsect]
-
-[section:non_blocking socket_acceptor_service::non_blocking]
-
-[indexterm2 non_blocking..socket_acceptor_service] 
-Gets the non-blocking mode of the acceptor. 
-
-
-  bool ``[link asio.reference.socket_acceptor_service.non_blocking.overload1 non_blocking]``(
-      const implementation_type & impl) const;
-  ``  [''''&raquo;''' [link asio.reference.socket_acceptor_service.non_blocking.overload1 more...]]``
-
-
-Sets the non-blocking mode of the acceptor. 
-
-
-  asio::error_code ``[link asio.reference.socket_acceptor_service.non_blocking.overload2 non_blocking]``(
-      implementation_type & impl,
-      bool mode,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.socket_acceptor_service.non_blocking.overload2 more...]]``
-
-
-[section:overload1 socket_acceptor_service::non_blocking (1 of 2 overloads)]
-
-
-Gets the non-blocking mode of the acceptor. 
-
-
-  bool non_blocking(
-      const implementation_type & impl) const;
-
-
-
-[endsect]
-
-
-
-[section:overload2 socket_acceptor_service::non_blocking (2 of 2 overloads)]
+   asio::signal_set signals(io_context);
+   signals.add(signal_number_1);
+   signals.add(signal_number_2);
+   signals.add(signal_number_3); 
 
 
-Sets the non-blocking mode of the acceptor. 
 
 
-  asio::error_code non_blocking(
-      implementation_type & impl,
-      bool mode,
-      asio::error_code & ec);
 
 
 
@@ -109996,89 +100415,16 @@
 [endsect]
 
 
-[section:open socket_acceptor_service::open]
+[section:_signal_set signal_set::~signal_set]
 
-[indexterm2 open..socket_acceptor_service] 
-Open a new socket acceptor implementation. 
+[indexterm2 ~signal_set..signal_set] 
+Destroys the signal set. 
 
 
-  asio::error_code open(
-      implementation_type & impl,
-      const protocol_type & protocol,
-      asio::error_code & ec);
+  ~signal_set();
 
 
-
-[endsect]
-
-
-
-[section:protocol_type socket_acceptor_service::protocol_type]
-
-[indexterm2 protocol_type..socket_acceptor_service] 
-The protocol type. 
-
-
-  typedef Protocol protocol_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/socket_acceptor_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:set_option socket_acceptor_service::set_option]
-
-[indexterm2 set_option..socket_acceptor_service] 
-Set a socket option. 
-
-
-  template<
-      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
-  asio::error_code set_option(
-      implementation_type & impl,
-      const SettableSocketOption & option,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:socket_acceptor_service socket_acceptor_service::socket_acceptor_service]
-
-[indexterm2 socket_acceptor_service..socket_acceptor_service] 
-Construct a new socket acceptor service for the specified [link asio.reference.io_context `io_context`]. 
-
-
-  socket_acceptor_service(
-      asio::io_context & io_context);
-
-
-
-[endsect]
-
-
-
-[section:wait socket_acceptor_service::wait]
-
-[indexterm2 wait..socket_acceptor_service] 
-Wait for the acceptor to become ready to read, ready to write, or to have pending error conditions. 
-
-
-  asio::error_code wait(
-      implementation_type & impl,
-      socket_base::wait_type w,
-      asio::error_code & ec);
-
+This function destroys the signal set, cancelling any outstanding asynchronous wait operations associated with the signal set as if by calling `cancel`. 
 
 
 [endsect]
@@ -114654,6 +105000,91 @@
 
 [endsect]
 
+
+[section:ssl__error__get_stream_category ssl::error::get_stream_category]
+
+[indexterm1 ssl::error::get_stream_category] 
+
+  const asio::error_category & get_stream_category();
+
+
+[heading Requirements]
+
+['Header: ][^asio/ssl/error.hpp]
+
+['Convenience header: ][^asio/ssl.hpp]
+
+
+[endsect]
+
+
+
+[section:ssl__error__make_error_code ssl::error::make_error_code]
+
+[indexterm1 ssl::error::make_error_code] 
+
+  asio::error_code make_error_code(
+      stream_errors e);
+
+
+[heading Requirements]
+
+['Header: ][^asio/ssl/error.hpp]
+
+['Convenience header: ][^asio/ssl.hpp]
+
+
+[endsect]
+
+
+
+[section:ssl__error__stream_category ssl::error::stream_category]
+
+[indexterm1 ssl::error::stream_category] 
+
+  static const asio::error_category & stream_category = asio::ssl::error::get_stream_category();
+
+
+[heading Requirements]
+
+['Header: ][^asio/ssl/error.hpp]
+
+['Convenience header: ][^asio/ssl.hpp]
+
+
+[endsect]
+
+
+
+[section:ssl__error__stream_errors ssl::error::stream_errors]
+
+[indexterm1 ssl::error::stream_errors] 
+
+  enum stream_errors
+
+[indexterm2 stream_truncated..ssl::error::stream_errors]
+
+[heading Values]
+[variablelist
+
+  [
+    [stream_truncated]
+    [The underlying stream closed before the ssl stream gracefully shut down. ]
+  ]
+
+]
+
+
+[heading Requirements]
+
+['Header: ][^asio/ssl/error.hpp]
+
+['Convenience header: ][^asio/ssl.hpp]
+
+
+[endsect]
+
+
 [section:ssl__rfc2818_verification ssl::rfc2818_verification]
 
 
@@ -114812,6 +105243,13 @@
 
   [
 
+    [[link asio.reference.ssl__stream.executor_type [*executor_type]]]
+    [The type of the executor associated with the object. ]
+  
+  ]
+
+  [
+
     [[link asio.reference.ssl__stream.handshake_type [*handshake_type]]]
     [Different handshake types. ]
   
@@ -114865,8 +105303,18 @@
   ]
   
   [
+    [[link asio.reference.ssl__stream.get_executor [*get_executor]]]
+    [Get the executor associated with the object. ]
+  ]
+  
+  [
     [[link asio.reference.ssl__stream.get_io_context [*get_io_context]]]
-    [Get the io_context associated with the object. ]
+    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
+  ]
+  
+  [
+    [[link asio.reference.ssl__stream.get_io_service [*get_io_service]]]
+    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
   ]
   
   [
@@ -115202,22 +105650,71 @@
 
 
 
+[section:executor_type ssl::stream::executor_type]
+
+[indexterm2 executor_type..ssl::stream] 
+The type of the executor associated with the object. 
+
+
+  typedef lowest_layer_type::executor_type executor_type;
+
+
+
+[heading Requirements]
+
+['Header: ][^asio/ssl/stream.hpp]
+
+['Convenience header: ][^asio/ssl.hpp]
+
+
+[endsect]
+
+
+
+[section:get_executor ssl::stream::get_executor]
+
+[indexterm2 get_executor..ssl::stream] 
+Get the executor associated with the object. 
+
+
+  executor_type get_executor();
+
+
+This function may be used to obtain the executor object that the stream uses to dispatch handlers for asynchronous operations.
+
+
+[heading Return Value]
+      
+A copy of the executor that stream will use to dispatch handlers. 
+
+
+
+
+[endsect]
+
+
+
 [section:get_io_context ssl::stream::get_io_context]
 
 [indexterm2 get_io_context..ssl::stream] 
-Get the [link asio.reference.io_context `io_context`] associated with the object. 
+(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
 
 
   asio::io_context & get_io_context();
 
 
-This function may be used to obtain the [link asio.reference.io_context `io_context`] object that the stream uses to dispatch handlers for asynchronous operations.
+
+[endsect]
 
 
-[heading Return Value]
-      
-A reference to the [link asio.reference.io_context `io_context`] object that stream will use to dispatch handlers. Ownership is not transferred to the caller. 
 
+[section:get_io_service ssl::stream::get_io_service]
+
+[indexterm2 get_io_service..ssl::stream] 
+(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
+
+
+  asio::io_context & get_io_service();
 
 
 
@@ -116326,6 +106823,13 @@
 
 
 
+[heading Remarks]
+      
+A `stream` object must not be destroyed while there are pending asynchronous operations associated with it. 
+
+
+
+
 [endsect]
 
 
@@ -116719,20 +107223,6 @@
 
   [
 
-    [[link asio.reference.basic_waitable_timer.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.basic_waitable_timer.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_waitable_timer.time_point [*time_point]]]
     [The time point type of the clock. ]
   
@@ -116769,12 +107259,16 @@
   
   [
     [[link asio.reference.basic_waitable_timer.cancel [*cancel]]]
-    [Cancel any asynchronous operations that are waiting on the timer. ]
+    [Cancel any asynchronous operations that are waiting on the timer. 
+
+     (Deprecated: Use non-error_code overload.) Cancel any asynchronous operations that are waiting on the timer. ]
   ]
   
   [
     [[link asio.reference.basic_waitable_timer.cancel_one [*cancel_one]]]
-    [Cancels one asynchronous operation that is waiting on the timer. ]
+    [Cancels one asynchronous operation that is waiting on the timer. 
+
+     (Deprecated: Use non-error_code overload.) Cancels one asynchronous operation that is waiting on the timer. ]
   ]
   
   [
@@ -116786,7 +107280,9 @@
     [[link asio.reference.basic_waitable_timer.expires_at [*expires_at]]]
     [(Deprecated: Use expiry().) Get the timer's expiry time as an absolute time. 
 
-     Set the timer's expiry time as an absolute time. ]
+     Set the timer's expiry time as an absolute time. 
+
+     (Deprecated: Use non-error_code overload.) Set the timer's expiry time as an absolute time. ]
   ]
   
   [
@@ -116826,20 +107322,9 @@
     [Perform a blocking wait on the timer. ]
   ]
   
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
   [
-    [[link asio.reference.basic_waitable_timer.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_waitable_timer.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
+    [[link asio.reference.basic_waitable_timer._basic_waitable_timer [*~basic_waitable_timer]]]
+    [Destroys the timer. ]
   ]
   
 ]
@@ -117630,990 +108115,6 @@
 
 [endsect]
 
-[section:stream_socket_service stream_socket_service]
-
-
-Default service implementation for a stream socket. 
-
-
-  template<
-      typename ``[link asio.reference.Protocol Protocol]``>
-  class stream_socket_service :
-    public io_context::service
-
-
-[heading Types]
-[table
-  [[Name][Description]]
-
-  [
-
-    [[link asio.reference.stream_socket_service.endpoint_type [*endpoint_type]]]
-    [The endpoint type. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.stream_socket_service.implementation_type [*implementation_type]]]
-    [The type of a stream socket implementation. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.stream_socket_service.native_handle_type [*native_handle_type]]]
-    [The native socket type. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.stream_socket_service.protocol_type [*protocol_type]]]
-    [The protocol type. ]
-  
-  ]
-
-]
-
-[heading Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.stream_socket_service.assign [*assign]]]
-    [Assign an existing native socket to a stream socket. ]
-  ]
-  
-  [
-    [[link asio.reference.stream_socket_service.async_connect [*async_connect]]]
-    [Start an asynchronous connect. ]
-  ]
-  
-  [
-    [[link asio.reference.stream_socket_service.async_receive [*async_receive]]]
-    [Start an asynchronous receive. ]
-  ]
-  
-  [
-    [[link asio.reference.stream_socket_service.async_send [*async_send]]]
-    [Start an asynchronous send. ]
-  ]
-  
-  [
-    [[link asio.reference.stream_socket_service.async_wait [*async_wait]]]
-    [Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
-  ]
-  
-  [
-    [[link asio.reference.stream_socket_service.at_mark [*at_mark]]]
-    [Determine whether the socket is at the out-of-band data mark. ]
-  ]
-  
-  [
-    [[link asio.reference.stream_socket_service.available [*available]]]
-    [Determine the number of bytes available for reading. ]
-  ]
-  
-  [
-    [[link asio.reference.stream_socket_service.bind [*bind]]]
-    [Bind the stream socket to the specified local endpoint. ]
-  ]
-  
-  [
-    [[link asio.reference.stream_socket_service.cancel [*cancel]]]
-    [Cancel all asynchronous operations associated with the socket. ]
-  ]
-  
-  [
-    [[link asio.reference.stream_socket_service.close [*close]]]
-    [Close a stream socket implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.stream_socket_service.connect [*connect]]]
-    [Connect the stream socket to the specified endpoint. ]
-  ]
-  
-  [
-    [[link asio.reference.stream_socket_service.construct [*construct]]]
-    [Construct a new stream socket implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.stream_socket_service.converting_move_construct [*converting_move_construct]]]
-    [Move-construct a new stream socket implementation from another protocol type. ]
-  ]
-  
-  [
-    [[link asio.reference.stream_socket_service.destroy [*destroy]]]
-    [Destroy a stream socket implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.stream_socket_service.get_io_context [*get_io_context]]]
-    [Get the io_context object that owns the service. ]
-  ]
-  
-  [
-    [[link asio.reference.stream_socket_service.get_io_service [*get_io_service]]]
-    [Get the io_context object that owns the service. ]
-  ]
-  
-  [
-    [[link asio.reference.stream_socket_service.get_option [*get_option]]]
-    [Get a socket option. ]
-  ]
-  
-  [
-    [[link asio.reference.stream_socket_service.io_control [*io_control]]]
-    [Perform an IO control command on the socket. ]
-  ]
-  
-  [
-    [[link asio.reference.stream_socket_service.is_open [*is_open]]]
-    [Determine whether the socket is open. ]
-  ]
-  
-  [
-    [[link asio.reference.stream_socket_service.local_endpoint [*local_endpoint]]]
-    [Get the local endpoint. ]
-  ]
-  
-  [
-    [[link asio.reference.stream_socket_service.move_assign [*move_assign]]]
-    [Move-assign from another stream socket implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.stream_socket_service.move_construct [*move_construct]]]
-    [Move-construct a new stream socket implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.stream_socket_service.native_handle [*native_handle]]]
-    [Get the native socket implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.stream_socket_service.native_non_blocking [*native_non_blocking]]]
-    [Gets the non-blocking mode of the native socket implementation. 
-
-     Sets the non-blocking mode of the native socket implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.stream_socket_service.non_blocking [*non_blocking]]]
-    [Gets the non-blocking mode of the socket. 
-
-     Sets the non-blocking mode of the socket. ]
-  ]
-  
-  [
-    [[link asio.reference.stream_socket_service.open [*open]]]
-    [Open a stream socket. ]
-  ]
-  
-  [
-    [[link asio.reference.stream_socket_service.receive [*receive]]]
-    [Receive some data from the peer. ]
-  ]
-  
-  [
-    [[link asio.reference.stream_socket_service.remote_endpoint [*remote_endpoint]]]
-    [Get the remote endpoint. ]
-  ]
-  
-  [
-    [[link asio.reference.stream_socket_service.send [*send]]]
-    [Send the given data to the peer. ]
-  ]
-  
-  [
-    [[link asio.reference.stream_socket_service.set_option [*set_option]]]
-    [Set a socket option. ]
-  ]
-  
-  [
-    [[link asio.reference.stream_socket_service.shutdown [*shutdown]]]
-    [Disable sends or receives on the socket. ]
-  ]
-  
-  [
-    [[link asio.reference.stream_socket_service.stream_socket_service [*stream_socket_service]]]
-    [Construct a new stream socket service for the specified io_context. ]
-  ]
-  
-  [
-    [[link asio.reference.stream_socket_service.wait [*wait]]]
-    [Wait for the socket to become ready to read, ready to write, or to have pending error conditions. ]
-  ]
-  
-]
-
-[heading Data Members]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.stream_socket_service.id [*id]]]
-    [The unique service identifier. ]
-  ]
-
-]
-
-[heading Requirements]
-
-['Header: ][^asio/stream_socket_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[section:assign stream_socket_service::assign]
-
-[indexterm2 assign..stream_socket_service] 
-Assign an existing native socket to a stream socket. 
-
-
-  asio::error_code assign(
-      implementation_type & impl,
-      const protocol_type & protocol,
-      const native_handle_type & native_socket,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:async_connect stream_socket_service::async_connect]
-
-[indexterm2 async_connect..stream_socket_service] 
-Start an asynchronous connect. 
-
-
-  template<
-      typename ``[link asio.reference.ConnectHandler ConnectHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_connect(
-      implementation_type & impl,
-      const endpoint_type & peer_endpoint,
-      ConnectHandler && handler);
-
-
-
-[endsect]
-
-
-
-[section:async_receive stream_socket_service::async_receive]
-
-[indexterm2 async_receive..stream_socket_service] 
-Start an asynchronous receive. 
-
-
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
-      typename ``[link asio.reference.ReadHandler ReadHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_receive(
-      implementation_type & impl,
-      const MutableBufferSequence & buffers,
-      socket_base::message_flags flags,
-      ReadHandler && handler);
-
-
-
-[endsect]
-
-
-
-[section:async_send stream_socket_service::async_send]
-
-[indexterm2 async_send..stream_socket_service] 
-Start an asynchronous send. 
-
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
-      typename ``[link asio.reference.WriteHandler WriteHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_send(
-      implementation_type & impl,
-      const ConstBufferSequence & buffers,
-      socket_base::message_flags flags,
-      WriteHandler && handler);
-
-
-
-[endsect]
-
-
-
-[section:async_wait stream_socket_service::async_wait]
-
-[indexterm2 async_wait..stream_socket_service] 
-Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions. 
-
-
-  template<
-      typename ``[link asio.reference.WaitHandler WaitHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
-      implementation_type & impl,
-      socket_base::wait_type w,
-      WaitHandler && handler);
-
-
-
-[endsect]
-
-
-
-[section:at_mark stream_socket_service::at_mark]
-
-[indexterm2 at_mark..stream_socket_service] 
-Determine whether the socket is at the out-of-band data mark. 
-
-
-  bool at_mark(
-      const implementation_type & impl,
-      asio::error_code & ec) const;
-
-
-
-[endsect]
-
-
-
-[section:available stream_socket_service::available]
-
-[indexterm2 available..stream_socket_service] 
-Determine the number of bytes available for reading. 
-
-
-  std::size_t available(
-      const implementation_type & impl,
-      asio::error_code & ec) const;
-
-
-
-[endsect]
-
-
-
-[section:bind stream_socket_service::bind]
-
-[indexterm2 bind..stream_socket_service] 
-Bind the stream socket to the specified local endpoint. 
-
-
-  asio::error_code bind(
-      implementation_type & impl,
-      const endpoint_type & endpoint,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:cancel stream_socket_service::cancel]
-
-[indexterm2 cancel..stream_socket_service] 
-Cancel all asynchronous operations associated with the socket. 
-
-
-  asio::error_code cancel(
-      implementation_type & impl,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:close stream_socket_service::close]
-
-[indexterm2 close..stream_socket_service] 
-Close a stream socket implementation. 
-
-
-  asio::error_code close(
-      implementation_type & impl,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:connect stream_socket_service::connect]
-
-[indexterm2 connect..stream_socket_service] 
-Connect the stream socket to the specified endpoint. 
-
-
-  asio::error_code connect(
-      implementation_type & impl,
-      const endpoint_type & peer_endpoint,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:construct stream_socket_service::construct]
-
-[indexterm2 construct..stream_socket_service] 
-Construct a new stream socket implementation. 
-
-
-  void construct(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:converting_move_construct stream_socket_service::converting_move_construct]
-
-[indexterm2 converting_move_construct..stream_socket_service] 
-Move-construct a new stream socket implementation from another protocol type. 
-
-
-  template<
-      typename ``[link asio.reference.Protocol Protocol1]``>
-  void converting_move_construct(
-      implementation_type & impl,
-      typename stream_socket_service< Protocol1 >::implementation_type & other_impl,
-      typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);
-
-
-
-[endsect]
-
-
-
-[section:destroy stream_socket_service::destroy]
-
-[indexterm2 destroy..stream_socket_service] 
-Destroy a stream socket implementation. 
-
-
-  void destroy(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:endpoint_type stream_socket_service::endpoint_type]
-
-[indexterm2 endpoint_type..stream_socket_service] 
-The endpoint type. 
-
-
-  typedef Protocol::endpoint endpoint_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/stream_socket_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:get_io_context stream_socket_service::get_io_context]
-
-
-['Inherited from io_context.]
-
-[indexterm2 get_io_context..stream_socket_service] 
-Get the [link asio.reference.io_context `io_context`] object that owns the service. 
-
-
-  asio::io_context & get_io_context();
-
-
-
-[endsect]
-
-
-
-[section:get_io_service stream_socket_service::get_io_service]
-
-
-['Inherited from io_context.]
-
-[indexterm2 get_io_service..stream_socket_service] 
-Get the [link asio.reference.io_context `io_context`] object that owns the service. 
-
-
-  asio::io_context & get_io_service();
-
-
-
-[endsect]
-
-
-
-[section:get_option stream_socket_service::get_option]
-
-[indexterm2 get_option..stream_socket_service] 
-Get a socket option. 
-
-
-  template<
-      typename ``[link asio.reference.GettableSocketOption GettableSocketOption]``>
-  asio::error_code get_option(
-      const implementation_type & impl,
-      GettableSocketOption & option,
-      asio::error_code & ec) const;
-
-
-
-[endsect]
-
-
-
-[section:id stream_socket_service::id]
-
-[indexterm2 id..stream_socket_service] 
-The unique service identifier. 
-
-
-  static asio::io_context::id id;
-
-
-
-[endsect]
-
-
-
-[section:implementation_type stream_socket_service::implementation_type]
-
-[indexterm2 implementation_type..stream_socket_service] 
-The type of a stream socket implementation. 
-
-
-  typedef implementation_defined implementation_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/stream_socket_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:io_control stream_socket_service::io_control]
-
-[indexterm2 io_control..stream_socket_service] 
-Perform an IO control command on the socket. 
-
-
-  template<
-      typename ``[link asio.reference.IoControlCommand IoControlCommand]``>
-  asio::error_code io_control(
-      implementation_type & impl,
-      IoControlCommand & command,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:is_open stream_socket_service::is_open]
-
-[indexterm2 is_open..stream_socket_service] 
-Determine whether the socket is open. 
-
-
-  bool is_open(
-      const implementation_type & impl) const;
-
-
-
-[endsect]
-
-
-
-[section:local_endpoint stream_socket_service::local_endpoint]
-
-[indexterm2 local_endpoint..stream_socket_service] 
-Get the local endpoint. 
-
-
-  endpoint_type local_endpoint(
-      const implementation_type & impl,
-      asio::error_code & ec) const;
-
-
-
-[endsect]
-
-
-
-[section:move_assign stream_socket_service::move_assign]
-
-[indexterm2 move_assign..stream_socket_service] 
-Move-assign from another stream socket implementation. 
-
-
-  void move_assign(
-      implementation_type & impl,
-      stream_socket_service & other_service,
-      implementation_type & other_impl);
-
-
-
-[endsect]
-
-
-
-[section:move_construct stream_socket_service::move_construct]
-
-[indexterm2 move_construct..stream_socket_service] 
-Move-construct a new stream socket implementation. 
-
-
-  void move_construct(
-      implementation_type & impl,
-      implementation_type & other_impl);
-
-
-
-[endsect]
-
-
-
-[section:native_handle stream_socket_service::native_handle]
-
-[indexterm2 native_handle..stream_socket_service] 
-Get the native socket implementation. 
-
-
-  native_handle_type native_handle(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:native_handle_type stream_socket_service::native_handle_type]
-
-[indexterm2 native_handle_type..stream_socket_service] 
-The native socket type. 
-
-
-  typedef implementation_defined native_handle_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/stream_socket_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-[section:native_non_blocking stream_socket_service::native_non_blocking]
-
-[indexterm2 native_non_blocking..stream_socket_service] 
-Gets the non-blocking mode of the native socket implementation. 
-
-
-  bool ``[link asio.reference.stream_socket_service.native_non_blocking.overload1 native_non_blocking]``(
-      const implementation_type & impl) const;
-  ``  [''''&raquo;''' [link asio.reference.stream_socket_service.native_non_blocking.overload1 more...]]``
-
-
-Sets the non-blocking mode of the native socket implementation. 
-
-
-  asio::error_code ``[link asio.reference.stream_socket_service.native_non_blocking.overload2 native_non_blocking]``(
-      implementation_type & impl,
-      bool mode,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.stream_socket_service.native_non_blocking.overload2 more...]]``
-
-
-[section:overload1 stream_socket_service::native_non_blocking (1 of 2 overloads)]
-
-
-Gets the non-blocking mode of the native socket implementation. 
-
-
-  bool native_non_blocking(
-      const implementation_type & impl) const;
-
-
-
-[endsect]
-
-
-
-[section:overload2 stream_socket_service::native_non_blocking (2 of 2 overloads)]
-
-
-Sets the non-blocking mode of the native socket implementation. 
-
-
-  asio::error_code native_non_blocking(
-      implementation_type & impl,
-      bool mode,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-[endsect]
-
-[section:non_blocking stream_socket_service::non_blocking]
-
-[indexterm2 non_blocking..stream_socket_service] 
-Gets the non-blocking mode of the socket. 
-
-
-  bool ``[link asio.reference.stream_socket_service.non_blocking.overload1 non_blocking]``(
-      const implementation_type & impl) const;
-  ``  [''''&raquo;''' [link asio.reference.stream_socket_service.non_blocking.overload1 more...]]``
-
-
-Sets the non-blocking mode of the socket. 
-
-
-  asio::error_code ``[link asio.reference.stream_socket_service.non_blocking.overload2 non_blocking]``(
-      implementation_type & impl,
-      bool mode,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.stream_socket_service.non_blocking.overload2 more...]]``
-
-
-[section:overload1 stream_socket_service::non_blocking (1 of 2 overloads)]
-
-
-Gets the non-blocking mode of the socket. 
-
-
-  bool non_blocking(
-      const implementation_type & impl) const;
-
-
-
-[endsect]
-
-
-
-[section:overload2 stream_socket_service::non_blocking (2 of 2 overloads)]
-
-
-Sets the non-blocking mode of the socket. 
-
-
-  asio::error_code non_blocking(
-      implementation_type & impl,
-      bool mode,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:open stream_socket_service::open]
-
-[indexterm2 open..stream_socket_service] 
-Open a stream socket. 
-
-
-  asio::error_code open(
-      implementation_type & impl,
-      const protocol_type & protocol,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:protocol_type stream_socket_service::protocol_type]
-
-[indexterm2 protocol_type..stream_socket_service] 
-The protocol type. 
-
-
-  typedef Protocol protocol_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/stream_socket_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:receive stream_socket_service::receive]
-
-[indexterm2 receive..stream_socket_service] 
-Receive some data from the peer. 
-
-
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
-  std::size_t receive(
-      implementation_type & impl,
-      const MutableBufferSequence & buffers,
-      socket_base::message_flags flags,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:remote_endpoint stream_socket_service::remote_endpoint]
-
-[indexterm2 remote_endpoint..stream_socket_service] 
-Get the remote endpoint. 
-
-
-  endpoint_type remote_endpoint(
-      const implementation_type & impl,
-      asio::error_code & ec) const;
-
-
-
-[endsect]
-
-
-
-[section:send stream_socket_service::send]
-
-[indexterm2 send..stream_socket_service] 
-Send the given data to the peer. 
-
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
-  std::size_t send(
-      implementation_type & impl,
-      const ConstBufferSequence & buffers,
-      socket_base::message_flags flags,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:set_option stream_socket_service::set_option]
-
-[indexterm2 set_option..stream_socket_service] 
-Set a socket option. 
-
-
-  template<
-      typename ``[link asio.reference.SettableSocketOption SettableSocketOption]``>
-  asio::error_code set_option(
-      implementation_type & impl,
-      const SettableSocketOption & option,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:shutdown stream_socket_service::shutdown]
-
-[indexterm2 shutdown..stream_socket_service] 
-Disable sends or receives on the socket. 
-
-
-  asio::error_code shutdown(
-      implementation_type & impl,
-      socket_base::shutdown_type what,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:stream_socket_service stream_socket_service::stream_socket_service]
-
-[indexterm2 stream_socket_service..stream_socket_service] 
-Construct a new stream socket service for the specified [link asio.reference.io_context `io_context`]. 
-
-
-  stream_socket_service(
-      asio::io_context & io_context);
-
-
-
-[endsect]
-
-
-
-[section:wait stream_socket_service::wait]
-
-[indexterm2 wait..stream_socket_service] 
-Wait for the socket to become ready to read, ready to write, or to have pending error conditions. 
-
-
-  asio::error_code wait(
-      implementation_type & impl,
-      socket_base::wait_type w,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[endsect]
-
 
 [section:streambuf streambuf]
 
@@ -119075,7 +108576,7 @@
 Obtain the underlying execution context. 
 
 
-  execution_context & context();
+  execution_context & context() const;
 
 
 
@@ -119094,7 +108595,7 @@
       typename Allocator>
   void defer(
       Function && f,
-      const Allocator & a);
+      const Allocator & a) const;
 
 
 This function is used to ask the executor to execute the given function object. The function object will never be executed inside this function. Instead, it will be scheduled to run on an unspecified system thread pool.
@@ -119133,7 +108634,7 @@
       typename Allocator>
   void dispatch(
       Function && f,
-      const Allocator & a);
+      const Allocator & a) const;
 
 
 This function is used to ask the executor to execute the given function object. The function object will always be executed inside this function.
@@ -119167,7 +108668,7 @@
 Inform the executor that some work is no longer outstanding. 
 
 
-  void on_work_finished();
+  void on_work_finished() const;
 
 
 For the system executor, this is a no-op. 
@@ -119183,7 +108684,7 @@
 Inform the executor that it has some outstanding work to do. 
 
 
-  void on_work_started();
+  void on_work_started() const;
 
 
 For the system executor, this is a no-op. 
@@ -119252,7 +108753,7 @@
       typename Allocator>
   void post(
       Function && f,
-      const Allocator & a);
+      const Allocator & a) const;
 
 
 This function is used to ask the executor to execute the given function object. The function object will never be executed inside this function. Instead, it will be scheduled to run on an unspecified system thread pool.
@@ -119329,12 +108830,12 @@
   [[Name][Description]]
 
   [
-    [[link asio.reference.system_executor__context_impl.destroy_context [*destroy_context]]]
+    [[link asio.reference.system_executor__context_impl.destroy [*destroy]]]
     [Destroys all services in the context. ]
   ]
   
   [
-    [[link asio.reference.system_executor__context_impl.shutdown_context [*shutdown_context]]]
+    [[link asio.reference.system_executor__context_impl.shutdown [*shutdown]]]
     [Shuts down all services in the context. ]
   ]
   
@@ -119460,16 +108961,16 @@
 
 
 
-[section:destroy_context system_executor::context_impl::destroy_context]
+[section:destroy system_executor::context_impl::destroy]
 
 
 ['Inherited from execution_context.]
 
-[indexterm2 destroy_context..system_executor::context_impl] 
+[indexterm2 destroy..system_executor::context_impl] 
 Destroys all services in the context. 
 
 
-  void destroy_context();
+  void destroy();
 
 
 This function is implemented as follows:
@@ -119684,7 +109185,7 @@
 
 [heading Remarks]
       
-For each service object `svc` in the [link asio.reference.execution_context `execution_context`] set, performs `svc->fork_service();`. When processing the fork\_prepare event, services are visited in reverse order of the beginning of service object lifetime. Otherwise, services are visited in order of the beginning of service object lifetime. 
+For each service object `svc` in the [link asio.reference.execution_context `execution_context`] set, performs `svc->notify_fork();`. When processing the fork\_prepare event, services are visited in reverse order of the beginning of service object lifetime. Otherwise, services are visited in order of the beginning of service object lifetime. 
 
 
 
@@ -119705,22 +109206,22 @@
 
 
 
-[section:shutdown_context system_executor::context_impl::shutdown_context]
+[section:shutdown system_executor::context_impl::shutdown]
 
 
 ['Inherited from execution_context.]
 
-[indexterm2 shutdown_context..system_executor::context_impl] 
+[indexterm2 shutdown..system_executor::context_impl] 
 Shuts down all services in the context. 
 
 
-  void shutdown_context();
+  void shutdown();
 
 
 This function is implemented as follows:
 
 
-* For each service object `svc` in the [link asio.reference.execution_context `execution_context`] set, in reverse order of the beginning of service object lifetime, performs `svc->shutdown_service()`. 
+* For each service object `svc` in the [link asio.reference.execution_context `execution_context`] set, in reverse order of the beginning of service object lifetime, performs `svc->shutdown()`. 
 
 
 
@@ -119969,20 +109470,6 @@
 
   [
 
-    [[link asio.reference.basic_waitable_timer.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.basic_waitable_timer.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-  [
-
     [[link asio.reference.basic_waitable_timer.time_point [*time_point]]]
     [The time point type of the clock. ]
   
@@ -120019,12 +109506,16 @@
   
   [
     [[link asio.reference.basic_waitable_timer.cancel [*cancel]]]
-    [Cancel any asynchronous operations that are waiting on the timer. ]
+    [Cancel any asynchronous operations that are waiting on the timer. 
+
+     (Deprecated: Use non-error_code overload.) Cancel any asynchronous operations that are waiting on the timer. ]
   ]
   
   [
     [[link asio.reference.basic_waitable_timer.cancel_one [*cancel_one]]]
-    [Cancels one asynchronous operation that is waiting on the timer. ]
+    [Cancels one asynchronous operation that is waiting on the timer. 
+
+     (Deprecated: Use non-error_code overload.) Cancels one asynchronous operation that is waiting on the timer. ]
   ]
   
   [
@@ -120036,7 +109527,9 @@
     [[link asio.reference.basic_waitable_timer.expires_at [*expires_at]]]
     [(Deprecated: Use expiry().) Get the timer's expiry time as an absolute time. 
 
-     Set the timer's expiry time as an absolute time. ]
+     Set the timer's expiry time as an absolute time. 
+
+     (Deprecated: Use non-error_code overload.) Set the timer's expiry time as an absolute time. ]
   ]
   
   [
@@ -120076,20 +109569,9 @@
     [Perform a blocking wait on the timer. ]
   ]
   
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
   [
-    [[link asio.reference.basic_waitable_timer.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.basic_waitable_timer.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
+    [[link asio.reference.basic_waitable_timer._basic_waitable_timer [*~basic_waitable_timer]]]
+    [Destroys the timer. ]
   ]
   
 ]
@@ -120426,12 +109908,12 @@
   [[Name][Description]]
 
   [
-    [[link asio.reference.thread_pool.destroy_context [*destroy_context]]]
+    [[link asio.reference.thread_pool.destroy [*destroy]]]
     [Destroys all services in the context. ]
   ]
   
   [
-    [[link asio.reference.thread_pool.shutdown_context [*shutdown_context]]]
+    [[link asio.reference.thread_pool.shutdown [*shutdown]]]
     [Shuts down all services in the context. ]
   ]
   
@@ -120531,16 +110013,16 @@
 
 
 
-[section:destroy_context thread_pool::destroy_context]
+[section:destroy thread_pool::destroy]
 
 
 ['Inherited from execution_context.]
 
-[indexterm2 destroy_context..thread_pool] 
+[indexterm2 destroy..thread_pool] 
 Destroys all services in the context. 
 
 
-  void destroy_context();
+  void destroy();
 
 
 This function is implemented as follows:
@@ -120785,7 +110267,7 @@
 
 [heading Remarks]
       
-For each service object `svc` in the [link asio.reference.execution_context `execution_context`] set, performs `svc->fork_service();`. When processing the fork\_prepare event, services are visited in reverse order of the beginning of service object lifetime. Otherwise, services are visited in order of the beginning of service object lifetime. 
+For each service object `svc` in the [link asio.reference.execution_context `execution_context`] set, performs `svc->notify_fork();`. When processing the fork\_prepare event, services are visited in reverse order of the beginning of service object lifetime. Otherwise, services are visited in order of the beginning of service object lifetime. 
 
 
 
@@ -120794,22 +110276,22 @@
 
 
 
-[section:shutdown_context thread_pool::shutdown_context]
+[section:shutdown thread_pool::shutdown]
 
 
 ['Inherited from execution_context.]
 
-[indexterm2 shutdown_context..thread_pool] 
+[indexterm2 shutdown..thread_pool] 
 Shuts down all services in the context. 
 
 
-  void shutdown_context();
+  void shutdown();
 
 
 This function is implemented as follows:
 
 
-* For each service object `svc` in the [link asio.reference.execution_context `execution_context`] set, in reverse order of the beginning of service object lifetime, performs `svc->shutdown_service()`. 
+* For each service object `svc` in the [link asio.reference.execution_context `execution_context`] set, in reverse order of the beginning of service object lifetime, performs `svc->shutdown()`. 
 
 
 
@@ -121094,7 +110576,7 @@
 Obtain the underlying execution context. 
 
 
-  thread_pool & context();
+  thread_pool & context() const;
 
 
 
@@ -121113,7 +110595,7 @@
       typename Allocator>
   void defer(
       Function && f,
-      const Allocator & a);
+      const Allocator & a) const;
 
 
 This function is used to ask the thread pool to execute the given function object. The function object will never be executed inside `defer()`. Instead, it will be scheduled to run on the thread pool.
@@ -121154,7 +110636,7 @@
       typename Allocator>
   void dispatch(
       Function && f,
-      const Allocator & a);
+      const Allocator & a) const;
 
 
 This function is used to ask the thread pool to execute the given function object. If the current thread belongs to the pool, `dispatch()` executes the function before returning. Otherwise, the function will be scheduled to run on the thread pool.
@@ -121188,7 +110670,7 @@
 Inform the thread pool that some work is no longer outstanding. 
 
 
-  void on_work_finished();
+  void on_work_finished() const;
 
 
 This function is used to inform the thread pool that some work has finished. Once the count of unfinished work reaches zero, the thread pool's `join()` function is permitted to exit. 
@@ -121204,7 +110686,7 @@
 Inform the thread pool that it has some outstanding work to do. 
 
 
-  void on_work_started();
+  void on_work_started() const;
 
 
 This function is used to inform the thread pool that some work has begun. This ensures that the thread pool's `join()` function will not return while the work is underway. 
@@ -121273,7 +110755,7 @@
       typename Allocator>
   void post(
       Function && f,
-      const Allocator & a);
+      const Allocator & a) const;
 
 
 This function is used to ask the thread pool to execute the given function object. The function object will never be executed inside `post()`. Instead, it will be scheduled to run on the thread pool.
@@ -122158,17 +111640,13 @@
 
 [endsect]
 
-[section:waitable_timer_service waitable_timer_service]
+[section:windows__object_handle windows::object_handle]
 
 
-Default service implementation for a timer. 
+Provides object-oriented handle functionality. 
 
 
-  template<
-      typename Clock,
-      typename ``[link asio.reference.WaitTraits WaitTraits]`` = asio::wait_traits<Clock>>
-  class waitable_timer_service :
-    public io_context::service
+  class object_handle
 
 
 [heading Types]
@@ -122177,630 +111655,25 @@
 
   [
 
-    [[link asio.reference.waitable_timer_service.clock_type [*clock_type]]]
-    [The clock type. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.waitable_timer_service.duration [*duration]]]
-    [The duration type of the clock. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.waitable_timer_service.implementation_type [*implementation_type]]]
-    [The implementation type of the waitable timer. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.waitable_timer_service.time_point [*time_point]]]
-    [The time point type of the clock. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.waitable_timer_service.traits_type [*traits_type]]]
-    [The wait traits type. ]
-  
-  ]
-
-]
-
-[heading Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.waitable_timer_service.async_wait [*async_wait]]]
-    []
-  ]
-  
-  [
-    [[link asio.reference.waitable_timer_service.cancel [*cancel]]]
-    [Cancel any asynchronous wait operations associated with the timer. ]
-  ]
-  
-  [
-    [[link asio.reference.waitable_timer_service.cancel_one [*cancel_one]]]
-    [Cancels one asynchronous wait operation associated with the timer. ]
-  ]
-  
-  [
-    [[link asio.reference.waitable_timer_service.construct [*construct]]]
-    [Construct a new timer implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.waitable_timer_service.destroy [*destroy]]]
-    [Destroy a timer implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.waitable_timer_service.expires_after [*expires_after]]]
-    [Set the expiry time for the timer relative to now. ]
-  ]
-  
-  [
-    [[link asio.reference.waitable_timer_service.expires_at [*expires_at]]]
-    [(Deprecated: Use expiry().) Get the expiry time for the timer as an absolute time. 
-
-     Set the expiry time for the timer as an absolute time. ]
-  ]
-  
-  [
-    [[link asio.reference.waitable_timer_service.expires_from_now [*expires_from_now]]]
-    [(Deprecated: Use expiry().) Get the expiry time for the timer relative to now. 
-
-     (Deprecated: Use expires_after().) Set the expiry time for the timer relative to now. ]
-  ]
-  
-  [
-    [[link asio.reference.waitable_timer_service.expiry [*expiry]]]
-    [Get the expiry time for the timer as an absolute time. ]
-  ]
-  
-  [
-    [[link asio.reference.waitable_timer_service.get_io_context [*get_io_context]]]
-    [Get the io_context object that owns the service. ]
-  ]
-  
-  [
-    [[link asio.reference.waitable_timer_service.get_io_service [*get_io_service]]]
-    [Get the io_context object that owns the service. ]
-  ]
-  
-  [
-    [[link asio.reference.waitable_timer_service.move_assign [*move_assign]]]
-    [Move-assign from another timer implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.waitable_timer_service.move_construct [*move_construct]]]
-    [Move-construct a new timer implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.waitable_timer_service.wait [*wait]]]
-    []
-  ]
-  
-  [
-    [[link asio.reference.waitable_timer_service.waitable_timer_service [*waitable_timer_service]]]
-    [Construct a new timer service for the specified io_context. ]
-  ]
-  
-]
-
-[heading Data Members]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.waitable_timer_service.id [*id]]]
-    [The unique service identifier. ]
-  ]
-
-]
-
-[heading Requirements]
-
-['Header: ][^asio/waitable_timer_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[section:async_wait waitable_timer_service::async_wait]
-
-[indexterm2 async_wait..waitable_timer_service] 
-
-  template<
-      typename ``[link asio.reference.WaitHandler WaitHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
-      implementation_type & impl,
-      WaitHandler && handler);
-
-
-
-[endsect]
-
-
-
-[section:cancel waitable_timer_service::cancel]
-
-[indexterm2 cancel..waitable_timer_service] 
-Cancel any asynchronous wait operations associated with the timer. 
-
-
-  std::size_t cancel(
-      implementation_type & impl,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:cancel_one waitable_timer_service::cancel_one]
-
-[indexterm2 cancel_one..waitable_timer_service] 
-Cancels one asynchronous wait operation associated with the timer. 
-
-
-  std::size_t cancel_one(
-      implementation_type & impl,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:clock_type waitable_timer_service::clock_type]
-
-[indexterm2 clock_type..waitable_timer_service] 
-The clock type. 
-
-
-  typedef Clock clock_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/waitable_timer_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:construct waitable_timer_service::construct]
-
-[indexterm2 construct..waitable_timer_service] 
-Construct a new timer implementation. 
-
-
-  void construct(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:destroy waitable_timer_service::destroy]
-
-[indexterm2 destroy..waitable_timer_service] 
-Destroy a timer implementation. 
-
-
-  void destroy(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:duration waitable_timer_service::duration]
-
-[indexterm2 duration..waitable_timer_service] 
-The duration type of the clock. 
-
-
-  typedef clock_type::duration duration;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/waitable_timer_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:expires_after waitable_timer_service::expires_after]
-
-[indexterm2 expires_after..waitable_timer_service] 
-Set the expiry time for the timer relative to now. 
-
-
-  std::size_t expires_after(
-      implementation_type & impl,
-      const duration & expiry_time,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-[section:expires_at waitable_timer_service::expires_at]
-
-[indexterm2 expires_at..waitable_timer_service] 
-(Deprecated: Use `expiry()`.) Get the expiry time for the timer as an absolute time. 
-
-
-  time_point ``[link asio.reference.waitable_timer_service.expires_at.overload1 expires_at]``(
-      const implementation_type & impl) const;
-  ``  [''''&raquo;''' [link asio.reference.waitable_timer_service.expires_at.overload1 more...]]``
-
-
-Set the expiry time for the timer as an absolute time. 
-
-
-  std::size_t ``[link asio.reference.waitable_timer_service.expires_at.overload2 expires_at]``(
-      implementation_type & impl,
-      const time_point & expiry_time,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.waitable_timer_service.expires_at.overload2 more...]]``
-
-
-[section:overload1 waitable_timer_service::expires_at (1 of 2 overloads)]
-
-
-(Deprecated: Use `expiry()`.) Get the expiry time for the timer as an absolute time. 
-
-
-  time_point expires_at(
-      const implementation_type & impl) const;
-
-
-
-[endsect]
-
-
-
-[section:overload2 waitable_timer_service::expires_at (2 of 2 overloads)]
-
-
-Set the expiry time for the timer as an absolute time. 
-
-
-  std::size_t expires_at(
-      implementation_type & impl,
-      const time_point & expiry_time,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-[endsect]
-
-[section:expires_from_now waitable_timer_service::expires_from_now]
-
-[indexterm2 expires_from_now..waitable_timer_service] 
-(Deprecated: Use `expiry()`.) Get the expiry time for the timer relative to now. 
-
-
-  duration ``[link asio.reference.waitable_timer_service.expires_from_now.overload1 expires_from_now]``(
-      const implementation_type & impl) const;
-  ``  [''''&raquo;''' [link asio.reference.waitable_timer_service.expires_from_now.overload1 more...]]``
-
-
-(Deprecated: Use `expires_after()`.) Set the expiry time for the timer relative to now. 
-
-
-  std::size_t ``[link asio.reference.waitable_timer_service.expires_from_now.overload2 expires_from_now]``(
-      implementation_type & impl,
-      const duration & expiry_time,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.waitable_timer_service.expires_from_now.overload2 more...]]``
-
-
-[section:overload1 waitable_timer_service::expires_from_now (1 of 2 overloads)]
-
-
-(Deprecated: Use `expiry()`.) Get the expiry time for the timer relative to now. 
-
-
-  duration expires_from_now(
-      const implementation_type & impl) const;
-
-
-
-[endsect]
-
-
-
-[section:overload2 waitable_timer_service::expires_from_now (2 of 2 overloads)]
-
-
-(Deprecated: Use `expires_after()`.) Set the expiry time for the timer relative to now. 
-
-
-  std::size_t expires_from_now(
-      implementation_type & impl,
-      const duration & expiry_time,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:expiry waitable_timer_service::expiry]
-
-[indexterm2 expiry..waitable_timer_service] 
-Get the expiry time for the timer as an absolute time. 
-
-
-  time_point expiry(
-      const implementation_type & impl) const;
-
-
-
-[endsect]
-
-
-
-[section:get_io_context waitable_timer_service::get_io_context]
-
-
-['Inherited from io_context.]
-
-[indexterm2 get_io_context..waitable_timer_service] 
-Get the [link asio.reference.io_context `io_context`] object that owns the service. 
-
-
-  asio::io_context & get_io_context();
-
-
-
-[endsect]
-
-
-
-[section:get_io_service waitable_timer_service::get_io_service]
-
-
-['Inherited from io_context.]
-
-[indexterm2 get_io_service..waitable_timer_service] 
-Get the [link asio.reference.io_context `io_context`] object that owns the service. 
-
-
-  asio::io_context & get_io_service();
-
-
-
-[endsect]
-
-
-
-[section:id waitable_timer_service::id]
-
-[indexterm2 id..waitable_timer_service] 
-The unique service identifier. 
-
-
-  static asio::io_context::id id;
-
-
-
-[endsect]
-
-
-
-[section:implementation_type waitable_timer_service::implementation_type]
-
-[indexterm2 implementation_type..waitable_timer_service] 
-The implementation type of the waitable timer. 
-
-
-  typedef implementation_defined implementation_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/waitable_timer_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:move_assign waitable_timer_service::move_assign]
-
-[indexterm2 move_assign..waitable_timer_service] 
-Move-assign from another timer implementation. 
-
-
-  void move_assign(
-      implementation_type & impl,
-      waitable_timer_service & other_service,
-      implementation_type & other_impl);
-
-
-
-[endsect]
-
-
-
-[section:move_construct waitable_timer_service::move_construct]
-
-[indexterm2 move_construct..waitable_timer_service] 
-Move-construct a new timer implementation. 
-
-
-  void move_construct(
-      implementation_type & impl,
-      implementation_type & other_impl);
-
-
-
-[endsect]
-
-
-
-[section:time_point waitable_timer_service::time_point]
-
-[indexterm2 time_point..waitable_timer_service] 
-The time point type of the clock. 
-
-
-  typedef clock_type::time_point time_point;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/waitable_timer_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:traits_type waitable_timer_service::traits_type]
-
-[indexterm2 traits_type..waitable_timer_service] 
-The wait traits type. 
-
-
-  typedef WaitTraits traits_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/waitable_timer_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:wait waitable_timer_service::wait]
-
-[indexterm2 wait..waitable_timer_service] 
-
-  void wait(
-      implementation_type & impl,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:waitable_timer_service waitable_timer_service::waitable_timer_service]
-
-[indexterm2 waitable_timer_service..waitable_timer_service] 
-Construct a new timer service for the specified [link asio.reference.io_context `io_context`]. 
-
-
-  waitable_timer_service(
-      asio::io_context & io_context);
-
-
-
-[endsect]
-
-
-
-[endsect]
-
-[section:windows__basic_handle windows::basic_handle]
-
-
-Provides Windows handle functionality. 
-
-
-  template<
-      typename ``[link asio.reference.HandleService HandleService]``>
-  class basic_handle :
-    public basic_io_object< HandleService >
-
-
-[heading Types]
-[table
-  [[Name][Description]]
-
-  [
-
-    [[link asio.reference.windows__basic_handle.executor_type [*executor_type]]]
+    [[link asio.reference.windows__object_handle.executor_type [*executor_type]]]
     [The type of the executor associated with the object. ]
   
   ]
 
   [
 
-    [[link asio.reference.windows__basic_handle.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
+    [[link asio.reference.windows__object_handle.lowest_layer_type [*lowest_layer_type]]]
+    [An object_handle is always the lowest layer. ]
   
   ]
 
   [
 
-    [[link asio.reference.windows__basic_handle.lowest_layer_type [*lowest_layer_type]]]
-    [A basic_handle is always the lowest layer. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.windows__basic_handle.native_handle_type [*native_handle_type]]]
+    [[link asio.reference.windows__object_handle.native_handle_type [*native_handle_type]]]
     [The native representation of a handle. ]
   
   ]
 
-  [
-
-    [[link asio.reference.windows__basic_handle.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
 ]
 
 [heading Member Functions]
@@ -122808,90 +111681,79 @@
   [[Name][Description]]
 
   [
-    [[link asio.reference.windows__basic_handle.assign [*assign]]]
+    [[link asio.reference.windows__object_handle.assign [*assign]]]
     [Assign an existing native handle to the handle. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_handle.basic_handle [*basic_handle]]]
-    [Construct a basic_handle without opening it. 
-
-     Construct a basic_handle on an existing native handle. 
-
-     Move-construct a basic_handle from another. ]
+    [[link asio.reference.windows__object_handle.async_wait [*async_wait]]]
+    [Start an asynchronous wait on the object handle. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_handle.cancel [*cancel]]]
+    [[link asio.reference.windows__object_handle.cancel [*cancel]]]
     [Cancel all asynchronous operations associated with the handle. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_handle.close [*close]]]
+    [[link asio.reference.windows__object_handle.close [*close]]]
     [Close the handle. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_handle.get_executor [*get_executor]]]
+    [[link asio.reference.windows__object_handle.get_executor [*get_executor]]]
     [Get the executor associated with the object. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_handle.get_io_context [*get_io_context]]]
+    [[link asio.reference.windows__object_handle.get_io_context [*get_io_context]]]
     [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_handle.get_io_service [*get_io_service]]]
+    [[link asio.reference.windows__object_handle.get_io_service [*get_io_service]]]
     [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_handle.is_open [*is_open]]]
+    [[link asio.reference.windows__object_handle.is_open [*is_open]]]
     [Determine whether the handle is open. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_handle.lowest_layer [*lowest_layer]]]
+    [[link asio.reference.windows__object_handle.lowest_layer [*lowest_layer]]]
     [Get a reference to the lowest layer. 
 
      Get a const reference to the lowest layer. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_handle.native_handle [*native_handle]]]
+    [[link asio.reference.windows__object_handle.native_handle [*native_handle]]]
     [Get the native handle representation. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_handle.operator_eq_ [*operator=]]]
-    [Move-assign a basic_handle from another. ]
+    [[link asio.reference.windows__object_handle.object_handle [*object_handle]]]
+    [Construct an object_handle without opening it. 
+
+     Construct an object_handle on an existing native handle. 
+
+     Move-construct an object_handle from another. ]
+  ]
+  
+  [
+    [[link asio.reference.windows__object_handle.operator_eq_ [*operator=]]]
+    [Move-assign an object_handle from another. ]
+  ]
+  
+  [
+    [[link asio.reference.windows__object_handle.wait [*wait]]]
+    [Perform a blocking wait on the object handle. ]
   ]
   
 ]
 
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.windows__basic_handle.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_handle.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_handle._basic_handle [*~basic_handle]]]
-    [Protected destructor to prevent deletion through this type. ]
-  ]
-  
-]
-
-The [link asio.reference.windows__basic_handle `windows::basic_handle`] class template provides the ability to wrap a Windows handle.
+The [link asio.reference.windows__object_handle `windows::object_handle`] class provides asynchronous and blocking object-oriented handle functionality.
 
 
 [heading Thread Safety]
@@ -122904,27 +111766,27 @@
 
 [heading Requirements]
 
-['Header: ][^asio/windows/basic_handle.hpp]
+['Header: ][^asio/windows/object_handle.hpp]
 
 ['Convenience header: ][^asio.hpp]
 
-[section:assign windows::basic_handle::assign]
+[section:assign windows::object_handle::assign]
 
-[indexterm2 assign..windows::basic_handle] 
+[indexterm2 assign..windows::object_handle] 
 Assign an existing native handle to the handle. 
 
 
-  void ``[link asio.reference.windows__basic_handle.assign.overload1 assign]``(
+  void ``[link asio.reference.windows__object_handle.assign.overload1 assign]``(
       const native_handle_type & handle);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_handle.assign.overload1 more...]]``
+  ``  [''''&raquo;''' [link asio.reference.windows__object_handle.assign.overload1 more...]]``
 
-  asio::error_code ``[link asio.reference.windows__basic_handle.assign.overload2 assign]``(
+  asio::error_code ``[link asio.reference.windows__object_handle.assign.overload2 assign]``(
       const native_handle_type & handle,
       asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_handle.assign.overload2 more...]]``
+  ``  [''''&raquo;''' [link asio.reference.windows__object_handle.assign.overload2 more...]]``
 
 
-[section:overload1 windows::basic_handle::assign (1 of 2 overloads)]
+[section:overload1 windows::object_handle::assign (1 of 2 overloads)]
 
 
 Assign an existing native handle to the handle. 
@@ -122939,7 +111801,7 @@
 
 
 
-[section:overload2 windows::basic_handle::assign (2 of 2 overloads)]
+[section:overload2 windows::object_handle::assign (2 of 2 overloads)]
 
 
 Assign an existing native handle to the handle. 
@@ -122956,45 +111818,20 @@
 
 [endsect]
 
-[section:basic_handle windows::basic_handle::basic_handle]
 
-[indexterm2 basic_handle..windows::basic_handle] 
-Construct a [link asio.reference.windows__basic_handle `windows::basic_handle`] without opening it. 
+[section:async_wait windows::object_handle::async_wait]
+
+[indexterm2 async_wait..windows::object_handle] 
+Start an asynchronous wait on the object handle. 
 
 
-  explicit ``[link asio.reference.windows__basic_handle.basic_handle.overload1 basic_handle]``(
-      asio::io_context & io_context);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_handle.basic_handle.overload1 more...]]``
+  template<
+      typename ``[link asio.reference.WaitHandler WaitHandler]``>
+  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
+      WaitHandler && handler);
 
 
-Construct a [link asio.reference.windows__basic_handle `windows::basic_handle`] on an existing native handle. 
-
-
-  ``[link asio.reference.windows__basic_handle.basic_handle.overload2 basic_handle]``(
-      asio::io_context & io_context,
-      const native_handle_type & handle);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_handle.basic_handle.overload2 more...]]``
-
-
-Move-construct a [link asio.reference.windows__basic_handle `windows::basic_handle`] from another. 
-
-
-  ``[link asio.reference.windows__basic_handle.basic_handle.overload3 basic_handle]``(
-      basic_handle && other);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_handle.basic_handle.overload3 more...]]``
-
-
-[section:overload1 windows::basic_handle::basic_handle (1 of 3 overloads)]
-
-
-Construct a [link asio.reference.windows__basic_handle `windows::basic_handle`] without opening it. 
-
-
-  basic_handle(
-      asio::io_context & io_context);
-
-
-This constructor creates a handle without opening it.
+This function is be used to initiate an asynchronous wait against the object handle. It always returns immediately.
 
 
 [heading Parameters]
@@ -123002,7 +111839,13 @@
 
 [variablelist
   
-[[io_context][The [link asio.reference.io_context `io_context`] object that the handle will use to dispatch handlers for any asynchronous operations performed on the handle. ]]
+[[handler][The handler to be called when the object handle is set to the signalled state. Copies will be made of the handler as required. The function signature of the handler must be: 
+``
+   void handler(
+     const asio::error_code& error // Result of operation.
+   ); 
+``
+Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using `asio::io_context::post()`. ]]
 
 ]
 
@@ -123012,99 +111855,21 @@
 [endsect]
 
 
+[section:cancel windows::object_handle::cancel]
 
-[section:overload2 windows::basic_handle::basic_handle (2 of 3 overloads)]
-
-
-Construct a [link asio.reference.windows__basic_handle `windows::basic_handle`] on an existing native handle. 
-
-
-  basic_handle(
-      asio::io_context & io_context,
-      const native_handle_type & handle);
-
-
-This constructor creates a handle object to hold an existing native handle.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[io_context][The [link asio.reference.io_context `io_context`] object that the handle will use to dispatch handlers for any asynchronous operations performed on the handle.]]
-
-[[handle][A native handle.]]
-
-]
-
-
-[heading Exceptions]
-    
-
-[variablelist
-  
-[[asio::system_error][Thrown on failure. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-
-[section:overload3 windows::basic_handle::basic_handle (3 of 3 overloads)]
-
-
-Move-construct a [link asio.reference.windows__basic_handle `windows::basic_handle`] from another. 
-
-
-  basic_handle(
-      basic_handle && other);
-
-
-This constructor moves a handle from one object to another.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[other][The other [link asio.reference.windows__basic_handle `windows::basic_handle`] object from which the move will occur.]]
-
-]
-
-
-[heading Remarks]
-      
-Following the move, the moved-from object is in the same state as if constructed using the `basic_handle(io_context&) constructor`. 
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-[section:cancel windows::basic_handle::cancel]
-
-[indexterm2 cancel..windows::basic_handle] 
+[indexterm2 cancel..windows::object_handle] 
 Cancel all asynchronous operations associated with the handle. 
 
 
-  void ``[link asio.reference.windows__basic_handle.cancel.overload1 cancel]``();
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_handle.cancel.overload1 more...]]``
+  void ``[link asio.reference.windows__object_handle.cancel.overload1 cancel]``();
+  ``  [''''&raquo;''' [link asio.reference.windows__object_handle.cancel.overload1 more...]]``
 
-  asio::error_code ``[link asio.reference.windows__basic_handle.cancel.overload2 cancel]``(
+  asio::error_code ``[link asio.reference.windows__object_handle.cancel.overload2 cancel]``(
       asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_handle.cancel.overload2 more...]]``
+  ``  [''''&raquo;''' [link asio.reference.windows__object_handle.cancel.overload2 more...]]``
 
 
-[section:overload1 windows::basic_handle::cancel (1 of 2 overloads)]
+[section:overload1 windows::object_handle::cancel (1 of 2 overloads)]
 
 
 Cancel all asynchronous operations associated with the handle. 
@@ -123132,7 +111897,7 @@
 
 
 
-[section:overload2 windows::basic_handle::cancel (2 of 2 overloads)]
+[section:overload2 windows::object_handle::cancel (2 of 2 overloads)]
 
 
 Cancel all asynchronous operations associated with the handle. 
@@ -123162,21 +111927,21 @@
 
 [endsect]
 
-[section:close windows::basic_handle::close]
+[section:close windows::object_handle::close]
 
-[indexterm2 close..windows::basic_handle] 
+[indexterm2 close..windows::object_handle] 
 Close the handle. 
 
 
-  void ``[link asio.reference.windows__basic_handle.close.overload1 close]``();
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_handle.close.overload1 more...]]``
+  void ``[link asio.reference.windows__object_handle.close.overload1 close]``();
+  ``  [''''&raquo;''' [link asio.reference.windows__object_handle.close.overload1 more...]]``
 
-  asio::error_code ``[link asio.reference.windows__basic_handle.close.overload2 close]``(
+  asio::error_code ``[link asio.reference.windows__object_handle.close.overload2 close]``(
       asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_handle.close.overload2 more...]]``
+  ``  [''''&raquo;''' [link asio.reference.windows__object_handle.close.overload2 more...]]``
 
 
-[section:overload1 windows::basic_handle::close (1 of 2 overloads)]
+[section:overload1 windows::object_handle::close (1 of 2 overloads)]
 
 
 Close the handle. 
@@ -123204,7 +111969,7 @@
 
 
 
-[section:overload2 windows::basic_handle::close (2 of 2 overloads)]
+[section:overload2 windows::object_handle::close (2 of 2 overloads)]
 
 
 Close the handle. 
@@ -123235,16 +112000,13 @@
 [endsect]
 
 
-[section:executor_type windows::basic_handle::executor_type]
+[section:executor_type windows::object_handle::executor_type]
 
-
-['Inherited from basic_io_object.]
-
-[indexterm2 executor_type..windows::basic_handle] 
+[indexterm2 executor_type..windows::object_handle] 
 The type of the executor associated with the object. 
 
 
-  typedef asio::io_context::executor_type executor_type;
+  typedef io_context::executor_type executor_type;
 
 
 [heading Member Functions]
@@ -123307,7 +112069,7 @@
 
 [heading Requirements]
 
-['Header: ][^asio/windows/basic_handle.hpp]
+['Header: ][^asio/windows/object_handle.hpp]
 
 ['Convenience header: ][^asio.hpp]
 
@@ -123316,12 +112078,9 @@
 
 
 
-[section:get_executor windows::basic_handle::get_executor]
+[section:get_executor windows::object_handle::get_executor]
 
-
-['Inherited from basic_io_object.]
-
-[indexterm2 get_executor..windows::basic_handle] 
+[indexterm2 get_executor..windows::object_handle] 
 Get the executor associated with the object. 
 
 
@@ -123332,61 +112091,10 @@
 [endsect]
 
 
-[section:get_implementation windows::basic_handle::get_implementation]
 
-[indexterm2 get_implementation..windows::basic_handle] 
-Get the underlying implementation of the I/O object. 
+[section:get_io_context windows::object_handle::get_io_context]
 
-
-  implementation_type & ``[link asio.reference.windows__basic_handle.get_implementation.overload1 get_implementation]``();
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_handle.get_implementation.overload1 more...]]``
-
-  const implementation_type & ``[link asio.reference.windows__basic_handle.get_implementation.overload2 get_implementation]``() const;
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_handle.get_implementation.overload2 more...]]``
-
-
-[section:overload1 windows::basic_handle::get_implementation (1 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the underlying implementation of the I/O object. 
-
-
-  implementation_type & get_implementation();
-
-
-
-[endsect]
-
-
-
-[section:overload2 windows::basic_handle::get_implementation (2 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the underlying implementation of the I/O object. 
-
-
-  const implementation_type & get_implementation() const;
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:get_io_context windows::basic_handle::get_io_context]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 get_io_context..windows::basic_handle] 
+[indexterm2 get_io_context..windows::object_handle] 
 (Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
 
 
@@ -123407,12 +112115,9 @@
 
 
 
-[section:get_io_service windows::basic_handle::get_io_service]
+[section:get_io_service windows::object_handle::get_io_service]
 
-
-['Inherited from basic_io_object.]
-
-[indexterm2 get_io_service..windows::basic_handle] 
+[indexterm2 get_io_service..windows::object_handle] 
 (Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
 
 
@@ -123432,82 +112137,10 @@
 [endsect]
 
 
-[section:get_service windows::basic_handle::get_service]
 
-[indexterm2 get_service..windows::basic_handle] 
-Get the service associated with the I/O object. 
+[section:is_open windows::object_handle::is_open]
 
-
-  service_type & ``[link asio.reference.windows__basic_handle.get_service.overload1 get_service]``();
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_handle.get_service.overload1 more...]]``
-
-  const service_type & ``[link asio.reference.windows__basic_handle.get_service.overload2 get_service]``() const;
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_handle.get_service.overload2 more...]]``
-
-
-[section:overload1 windows::basic_handle::get_service (1 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the service associated with the I/O object. 
-
-
-  service_type & get_service();
-
-
-
-[endsect]
-
-
-
-[section:overload2 windows::basic_handle::get_service (2 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the service associated with the I/O object. 
-
-
-  const service_type & get_service() const;
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:implementation_type windows::basic_handle::implementation_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 implementation_type..windows::basic_handle] 
-The underlying implementation type of I/O object. 
-
-
-  typedef service_type::implementation_type implementation_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/windows/basic_handle.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:is_open windows::basic_handle::is_open]
-
-[indexterm2 is_open..windows::basic_handle] 
+[indexterm2 is_open..windows::object_handle] 
 Determine whether the handle is open. 
 
 
@@ -123518,24 +112151,24 @@
 [endsect]
 
 
-[section:lowest_layer windows::basic_handle::lowest_layer]
+[section:lowest_layer windows::object_handle::lowest_layer]
 
-[indexterm2 lowest_layer..windows::basic_handle] 
+[indexterm2 lowest_layer..windows::object_handle] 
 Get a reference to the lowest layer. 
 
 
-  lowest_layer_type & ``[link asio.reference.windows__basic_handle.lowest_layer.overload1 lowest_layer]``();
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_handle.lowest_layer.overload1 more...]]``
+  lowest_layer_type & ``[link asio.reference.windows__object_handle.lowest_layer.overload1 lowest_layer]``();
+  ``  [''''&raquo;''' [link asio.reference.windows__object_handle.lowest_layer.overload1 more...]]``
 
 
 Get a const reference to the lowest layer. 
 
 
-  const lowest_layer_type & ``[link asio.reference.windows__basic_handle.lowest_layer.overload2 lowest_layer]``() const;
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_handle.lowest_layer.overload2 more...]]``
+  const lowest_layer_type & ``[link asio.reference.windows__object_handle.lowest_layer.overload2 lowest_layer]``() const;
+  ``  [''''&raquo;''' [link asio.reference.windows__object_handle.lowest_layer.overload2 more...]]``
 
 
-[section:overload1 windows::basic_handle::lowest_layer (1 of 2 overloads)]
+[section:overload1 windows::object_handle::lowest_layer (1 of 2 overloads)]
 
 
 Get a reference to the lowest layer. 
@@ -123544,7 +112177,7 @@
   lowest_layer_type & lowest_layer();
 
 
-This function returns a reference to the lowest layer in a stack of layers. Since a [link asio.reference.windows__basic_handle `windows::basic_handle`] cannot contain any further layers, it simply returns a reference to itself.
+This function returns a reference to the lowest layer in a stack of layers. Since an [link asio.reference.windows__object_handle `windows::object_handle`] cannot contain any further layers, it simply returns a reference to itself.
 
 
 [heading Return Value]
@@ -123558,7 +112191,7 @@
 
 
 
-[section:overload2 windows::basic_handle::lowest_layer (2 of 2 overloads)]
+[section:overload2 windows::object_handle::lowest_layer (2 of 2 overloads)]
 
 
 Get a const reference to the lowest layer. 
@@ -123567,7 +112200,7 @@
   const lowest_layer_type & lowest_layer() const;
 
 
-This function returns a const reference to the lowest layer in a stack of layers. Since a [link asio.reference.windows__basic_handle `windows::basic_handle`] cannot contain any further layers, it simply returns a reference to itself.
+This function returns a const reference to the lowest layer in a stack of layers. Since an [link asio.reference.windows__object_handle `windows::object_handle`] cannot contain any further layers, it simply returns a reference to itself.
 
 
 [heading Return Value]
@@ -123583,13 +112216,13 @@
 [endsect]
 
 
-[section:lowest_layer_type windows::basic_handle::lowest_layer_type]
+[section:lowest_layer_type windows::object_handle::lowest_layer_type]
 
-[indexterm2 lowest_layer_type..windows::basic_handle] 
-A [link asio.reference.windows__basic_handle `windows::basic_handle`] is always the lowest layer. 
+[indexterm2 lowest_layer_type..windows::object_handle] 
+An [link asio.reference.windows__object_handle `windows::object_handle`] is always the lowest layer. 
 
 
-  typedef basic_handle< HandleService > lowest_layer_type;
+  typedef object_handle lowest_layer_type;
 
 
 [heading Types]
@@ -123598,39 +112231,25 @@
 
   [
 
-    [[link asio.reference.windows__basic_handle.executor_type [*executor_type]]]
+    [[link asio.reference.windows__object_handle.executor_type [*executor_type]]]
     [The type of the executor associated with the object. ]
   
   ]
 
   [
 
-    [[link asio.reference.windows__basic_handle.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
+    [[link asio.reference.windows__object_handle.lowest_layer_type [*lowest_layer_type]]]
+    [An object_handle is always the lowest layer. ]
   
   ]
 
   [
 
-    [[link asio.reference.windows__basic_handle.lowest_layer_type [*lowest_layer_type]]]
-    [A basic_handle is always the lowest layer. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.windows__basic_handle.native_handle_type [*native_handle_type]]]
+    [[link asio.reference.windows__object_handle.native_handle_type [*native_handle_type]]]
     [The native representation of a handle. ]
   
   ]
 
-  [
-
-    [[link asio.reference.windows__basic_handle.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
 ]
 
 [heading Member Functions]
@@ -123638,90 +112257,79 @@
   [[Name][Description]]
 
   [
-    [[link asio.reference.windows__basic_handle.assign [*assign]]]
+    [[link asio.reference.windows__object_handle.assign [*assign]]]
     [Assign an existing native handle to the handle. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_handle.basic_handle [*basic_handle]]]
-    [Construct a basic_handle without opening it. 
-
-     Construct a basic_handle on an existing native handle. 
-
-     Move-construct a basic_handle from another. ]
+    [[link asio.reference.windows__object_handle.async_wait [*async_wait]]]
+    [Start an asynchronous wait on the object handle. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_handle.cancel [*cancel]]]
+    [[link asio.reference.windows__object_handle.cancel [*cancel]]]
     [Cancel all asynchronous operations associated with the handle. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_handle.close [*close]]]
+    [[link asio.reference.windows__object_handle.close [*close]]]
     [Close the handle. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_handle.get_executor [*get_executor]]]
+    [[link asio.reference.windows__object_handle.get_executor [*get_executor]]]
     [Get the executor associated with the object. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_handle.get_io_context [*get_io_context]]]
+    [[link asio.reference.windows__object_handle.get_io_context [*get_io_context]]]
     [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_handle.get_io_service [*get_io_service]]]
+    [[link asio.reference.windows__object_handle.get_io_service [*get_io_service]]]
     [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_handle.is_open [*is_open]]]
+    [[link asio.reference.windows__object_handle.is_open [*is_open]]]
     [Determine whether the handle is open. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_handle.lowest_layer [*lowest_layer]]]
+    [[link asio.reference.windows__object_handle.lowest_layer [*lowest_layer]]]
     [Get a reference to the lowest layer. 
 
      Get a const reference to the lowest layer. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_handle.native_handle [*native_handle]]]
+    [[link asio.reference.windows__object_handle.native_handle [*native_handle]]]
     [Get the native handle representation. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_handle.operator_eq_ [*operator=]]]
-    [Move-assign a basic_handle from another. ]
+    [[link asio.reference.windows__object_handle.object_handle [*object_handle]]]
+    [Construct an object_handle without opening it. 
+
+     Construct an object_handle on an existing native handle. 
+
+     Move-construct an object_handle from another. ]
+  ]
+  
+  [
+    [[link asio.reference.windows__object_handle.operator_eq_ [*operator=]]]
+    [Move-assign an object_handle from another. ]
+  ]
+  
+  [
+    [[link asio.reference.windows__object_handle.wait [*wait]]]
+    [Perform a blocking wait on the object handle. ]
   ]
   
 ]
 
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.windows__basic_handle.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_handle.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_handle._basic_handle [*~basic_handle]]]
-    [Protected destructor to prevent deletion through this type. ]
-  ]
-  
-]
-
-The [link asio.reference.windows__basic_handle `windows::basic_handle`] class template provides the ability to wrap a Windows handle.
+The [link asio.reference.windows__object_handle `windows::object_handle`] class provides asynchronous and blocking object-oriented handle functionality.
 
 
 [heading Thread Safety]
@@ -123735,7 +112343,7 @@
 
 [heading Requirements]
 
-['Header: ][^asio/windows/basic_handle.hpp]
+['Header: ][^asio/windows/object_handle.hpp]
 
 ['Convenience header: ][^asio.hpp]
 
@@ -123744,9 +112352,9 @@
 
 
 
-[section:native_handle windows::basic_handle::native_handle]
+[section:native_handle windows::object_handle::native_handle]
 
-[indexterm2 native_handle..windows::basic_handle] 
+[indexterm2 native_handle..windows::object_handle] 
 Get the native handle representation. 
 
 
@@ -123760,19 +112368,19 @@
 
 
 
-[section:native_handle_type windows::basic_handle::native_handle_type]
+[section:native_handle_type windows::object_handle::native_handle_type]
 
-[indexterm2 native_handle_type..windows::basic_handle] 
+[indexterm2 native_handle_type..windows::object_handle] 
 The native representation of a handle. 
 
 
-  typedef HandleService::native_handle_type native_handle_type;
+  typedef implementation_defined native_handle_type;
 
 
 
 [heading Requirements]
 
-['Header: ][^asio/windows/basic_handle.hpp]
+['Header: ][^asio/windows/object_handle.hpp]
 
 ['Convenience header: ][^asio.hpp]
 
@@ -123780,370 +112388,41 @@
 [endsect]
 
 
+[section:object_handle windows::object_handle::object_handle]
 
-[section:operator_eq_ windows::basic_handle::operator=]
+[indexterm2 object_handle..windows::object_handle] 
+Construct an [link asio.reference.windows__object_handle `windows::object_handle`] without opening it. 
 
-[indexterm2 operator=..windows::basic_handle] 
-Move-assign a [link asio.reference.windows__basic_handle `windows::basic_handle`] from another. 
 
-
-  basic_handle & operator=(
-      basic_handle && other);
-
-
-This assignment operator moves a handle from one object to another.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[other][The other [link asio.reference.windows__basic_handle `windows::basic_handle`] object from which the move will occur.]]
-
-]
-
-
-[heading Remarks]
-      
-Following the move, the moved-from object is in the same state as if constructed using the `basic_handle(io_context&) constructor`. 
-
-
-
-
-[endsect]
-
-
-
-[section:service_type windows::basic_handle::service_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 service_type..windows::basic_handle] 
-The type of the service that will be used to provide I/O operations. 
-
-
-  typedef HandleService service_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/windows/basic_handle.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:_basic_handle windows::basic_handle::~basic_handle]
-
-[indexterm2 ~basic_handle..windows::basic_handle] 
-Protected destructor to prevent deletion through this type. 
-
-
-  ~basic_handle();
-
-
-
-[endsect]
-
-
-
-[endsect]
-
-[section:windows__basic_object_handle windows::basic_object_handle]
-
-
-Provides object-oriented handle functionality. 
-
-
-  template<
-      typename ``[link asio.reference.ObjectHandleService ObjectHandleService]`` = object_handle_service>
-  class basic_object_handle :
-    public windows::basic_handle< ObjectHandleService >
-
-
-[heading Types]
-[table
-  [[Name][Description]]
-
-  [
-
-    [[link asio.reference.windows__basic_object_handle.executor_type [*executor_type]]]
-    [The type of the executor associated with the object. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.windows__basic_object_handle.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.windows__basic_object_handle.lowest_layer_type [*lowest_layer_type]]]
-    [A basic_handle is always the lowest layer. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.windows__basic_object_handle.native_handle_type [*native_handle_type]]]
-    [The native representation of a handle. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.windows__basic_object_handle.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-]
-
-[heading Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.windows__basic_object_handle.assign [*assign]]]
-    [Assign an existing native handle to the handle. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_object_handle.async_wait [*async_wait]]]
-    [Start an asynchronous wait on the object handle. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_object_handle.basic_object_handle [*basic_object_handle]]]
-    [Construct a basic_object_handle without opening it. 
-
-     Construct a basic_object_handle on an existing native handle. 
-
-     Move-construct a basic_object_handle from another. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_object_handle.cancel [*cancel]]]
-    [Cancel all asynchronous operations associated with the handle. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_object_handle.close [*close]]]
-    [Close the handle. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_object_handle.get_executor [*get_executor]]]
-    [Get the executor associated with the object. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_object_handle.get_io_context [*get_io_context]]]
-    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_object_handle.get_io_service [*get_io_service]]]
-    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_object_handle.is_open [*is_open]]]
-    [Determine whether the handle is open. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_object_handle.lowest_layer [*lowest_layer]]]
-    [Get a reference to the lowest layer. 
-
-     Get a const reference to the lowest layer. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_object_handle.native_handle [*native_handle]]]
-    [Get the native handle representation. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_object_handle.operator_eq_ [*operator=]]]
-    [Move-assign a basic_object_handle from another. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_object_handle.wait [*wait]]]
-    [Perform a blocking wait on the object handle. ]
-  ]
-  
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.windows__basic_object_handle.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_object_handle.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
-  ]
-  
-]
-
-The [link asio.reference.windows__basic_object_handle `windows::basic_object_handle`] class template provides asynchronous and blocking object-oriented handle functionality.
-
-
-[heading Thread Safety]
-  
-['Distinct] ['objects:] Safe.
-
-['Shared] ['objects:] Unsafe. 
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/windows/basic_object_handle.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-[section:assign windows::basic_object_handle::assign]
-
-[indexterm2 assign..windows::basic_object_handle] 
-Assign an existing native handle to the handle. 
-
-
-  void ``[link asio.reference.windows__basic_object_handle.assign.overload1 assign]``(
-      const native_handle_type & handle);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.assign.overload1 more...]]``
-
-  asio::error_code ``[link asio.reference.windows__basic_object_handle.assign.overload2 assign]``(
-      const native_handle_type & handle,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.assign.overload2 more...]]``
-
-
-[section:overload1 windows::basic_object_handle::assign (1 of 2 overloads)]
-
-
-['Inherited from windows::basic_handle.]
-
-
-Assign an existing native handle to the handle. 
-
-
-  void assign(
-      const native_handle_type & handle);
-
-
-
-[endsect]
-
-
-
-[section:overload2 windows::basic_object_handle::assign (2 of 2 overloads)]
-
-
-['Inherited from windows::basic_handle.]
-
-
-Assign an existing native handle to the handle. 
-
-
-  asio::error_code assign(
-      const native_handle_type & handle,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:async_wait windows::basic_object_handle::async_wait]
-
-[indexterm2 async_wait..windows::basic_object_handle] 
-Start an asynchronous wait on the object handle. 
-
-
-  template<
-      typename ``[link asio.reference.WaitHandler WaitHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
-      WaitHandler && handler);
-
-
-This function is be used to initiate an asynchronous wait against the object handle. It always returns immediately.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[handler][The handler to be called when the object handle is set to the signalled state. Copies will be made of the handler as required. The function signature of the handler must be: 
-``
-   void handler(
-     const asio::error_code& error // Result of operation.
-   ); 
-``
-Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using `asio::io_context::post()`. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-[section:basic_object_handle windows::basic_object_handle::basic_object_handle]
-
-[indexterm2 basic_object_handle..windows::basic_object_handle] 
-Construct a [link asio.reference.windows__basic_object_handle `windows::basic_object_handle`] without opening it. 
-
-
-  explicit ``[link asio.reference.windows__basic_object_handle.basic_object_handle.overload1 basic_object_handle]``(
+  explicit ``[link asio.reference.windows__object_handle.object_handle.overload1 object_handle]``(
       asio::io_context & io_context);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.basic_object_handle.overload1 more...]]``
+  ``  [''''&raquo;''' [link asio.reference.windows__object_handle.object_handle.overload1 more...]]``
 
 
-Construct a [link asio.reference.windows__basic_object_handle `windows::basic_object_handle`] on an existing native handle. 
+Construct an [link asio.reference.windows__object_handle `windows::object_handle`] on an existing native handle. 
 
 
-  ``[link asio.reference.windows__basic_object_handle.basic_object_handle.overload2 basic_object_handle]``(
+  ``[link asio.reference.windows__object_handle.object_handle.overload2 object_handle]``(
       asio::io_context & io_context,
       const native_handle_type & native_handle);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.basic_object_handle.overload2 more...]]``
+  ``  [''''&raquo;''' [link asio.reference.windows__object_handle.object_handle.overload2 more...]]``
 
 
-Move-construct a [link asio.reference.windows__basic_object_handle `windows::basic_object_handle`] from another. 
+Move-construct an [link asio.reference.windows__object_handle `windows::object_handle`] from another. 
 
 
-  ``[link asio.reference.windows__basic_object_handle.basic_object_handle.overload3 basic_object_handle]``(
-      basic_object_handle && other);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.basic_object_handle.overload3 more...]]``
+  ``[link asio.reference.windows__object_handle.object_handle.overload3 object_handle]``(
+      object_handle && other);
+  ``  [''''&raquo;''' [link asio.reference.windows__object_handle.object_handle.overload3 more...]]``
 
 
-[section:overload1 windows::basic_object_handle::basic_object_handle (1 of 3 overloads)]
+[section:overload1 windows::object_handle::object_handle (1 of 3 overloads)]
 
 
-Construct a [link asio.reference.windows__basic_object_handle `windows::basic_object_handle`] without opening it. 
+Construct an [link asio.reference.windows__object_handle `windows::object_handle`] without opening it. 
 
 
-  basic_object_handle(
+  object_handle(
       asio::io_context & io_context);
 
 
@@ -124166,13 +112445,13 @@
 
 
 
-[section:overload2 windows::basic_object_handle::basic_object_handle (2 of 3 overloads)]
+[section:overload2 windows::object_handle::object_handle (2 of 3 overloads)]
 
 
-Construct a [link asio.reference.windows__basic_object_handle `windows::basic_object_handle`] on an existing native handle. 
+Construct an [link asio.reference.windows__object_handle `windows::object_handle`] on an existing native handle. 
 
 
-  basic_object_handle(
+  object_handle(
       asio::io_context & io_context,
       const native_handle_type & native_handle);
 
@@ -124208,14 +112487,14 @@
 
 
 
-[section:overload3 windows::basic_object_handle::basic_object_handle (3 of 3 overloads)]
+[section:overload3 windows::object_handle::object_handle (3 of 3 overloads)]
 
 
-Move-construct a [link asio.reference.windows__basic_object_handle `windows::basic_object_handle`] from another. 
+Move-construct an [link asio.reference.windows__object_handle `windows::object_handle`] from another. 
 
 
-  basic_object_handle(
-      basic_object_handle && other);
+  object_handle(
+      object_handle && other);
 
 
 This constructor moves an object handle from one object to another.
@@ -124226,170 +112505,14 @@
 
 [variablelist
   
-[[other][The other [link asio.reference.windows__basic_object_handle `windows::basic_object_handle`] object from which the move will occur.]]
+[[other][The other [link asio.reference.windows__object_handle `windows::object_handle`] object from which the move will occur.]]
 
 ]
 
 
 [heading Remarks]
       
-Following the move, the moved-from object is in the same state as if constructed using the `basic_object_handle(io_context&) constructor`. 
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-[section:cancel windows::basic_object_handle::cancel]
-
-[indexterm2 cancel..windows::basic_object_handle] 
-Cancel all asynchronous operations associated with the handle. 
-
-
-  void ``[link asio.reference.windows__basic_object_handle.cancel.overload1 cancel]``();
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.cancel.overload1 more...]]``
-
-  asio::error_code ``[link asio.reference.windows__basic_object_handle.cancel.overload2 cancel]``(
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.cancel.overload2 more...]]``
-
-
-[section:overload1 windows::basic_object_handle::cancel (1 of 2 overloads)]
-
-
-['Inherited from windows::basic_handle.]
-
-
-Cancel all asynchronous operations associated with the handle. 
-
-
-  void cancel();
-
-
-This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.
-
-
-[heading Exceptions]
-    
-
-[variablelist
-  
-[[asio::system_error][Thrown on failure. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 windows::basic_object_handle::cancel (2 of 2 overloads)]
-
-
-['Inherited from windows::basic_handle.]
-
-
-Cancel all asynchronous operations associated with the handle. 
-
-
-  asio::error_code cancel(
-      asio::error_code & ec);
-
-
-This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[ec][Set to indicate what error occurred, if any. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-[section:close windows::basic_object_handle::close]
-
-[indexterm2 close..windows::basic_object_handle] 
-Close the handle. 
-
-
-  void ``[link asio.reference.windows__basic_object_handle.close.overload1 close]``();
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.close.overload1 more...]]``
-
-  asio::error_code ``[link asio.reference.windows__basic_object_handle.close.overload2 close]``(
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.close.overload2 more...]]``
-
-
-[section:overload1 windows::basic_object_handle::close (1 of 2 overloads)]
-
-
-['Inherited from windows::basic_handle.]
-
-
-Close the handle. 
-
-
-  void close();
-
-
-This function is used to close the handle. Any asynchronous read or write operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.
-
-
-[heading Exceptions]
-    
-
-[variablelist
-  
-[[asio::system_error][Thrown on failure. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 windows::basic_object_handle::close (2 of 2 overloads)]
-
-
-['Inherited from windows::basic_handle.]
-
-
-Close the handle. 
-
-
-  asio::error_code close(
-      asio::error_code & ec);
-
-
-This function is used to close the handle. Any asynchronous read or write operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[ec][Set to indicate what error occurred, if any. ]]
-
-]
+Following the move, the moved-from object is in the same state as if constructed using the `object_handle(io_context&) constructor`. 
 
 
 
@@ -124400,575 +112523,14 @@
 [endsect]
 
 
-[section:executor_type windows::basic_object_handle::executor_type]
+[section:operator_eq_ windows::object_handle::operator=]
 
+[indexterm2 operator=..windows::object_handle] 
+Move-assign an [link asio.reference.windows__object_handle `windows::object_handle`] from another. 
 
-['Inherited from basic_io_object.]
 
-[indexterm2 executor_type..windows::basic_object_handle] 
-The type of the executor associated with the object. 
-
-
-  typedef asio::io_context::executor_type executor_type;
-
-
-[heading Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.io_context__executor_type.context [*context]]]
-    [Obtain the underlying execution context. ]
-  ]
-  
-  [
-    [[link asio.reference.io_context__executor_type.defer [*defer]]]
-    [Request the io_context to invoke the given function object. ]
-  ]
-  
-  [
-    [[link asio.reference.io_context__executor_type.dispatch [*dispatch]]]
-    [Request the io_context to invoke the given function object. ]
-  ]
-  
-  [
-    [[link asio.reference.io_context__executor_type.on_work_finished [*on_work_finished]]]
-    [Inform the io_context that some work is no longer outstanding. ]
-  ]
-  
-  [
-    [[link asio.reference.io_context__executor_type.on_work_started [*on_work_started]]]
-    [Inform the io_context that it has some outstanding work to do. ]
-  ]
-  
-  [
-    [[link asio.reference.io_context__executor_type.post [*post]]]
-    [Request the io_context to invoke the given function object. ]
-  ]
-  
-  [
-    [[link asio.reference.io_context__executor_type.running_in_this_thread [*running_in_this_thread]]]
-    [Determine whether the io_context is running in the current thread. ]
-  ]
-  
-]
-
-[heading Friends]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.io_context__executor_type.operator_not__eq_ [*operator!=]]]
-    [Compare two executors for inequality. ]
-  ]
-  
-  [
-    [[link asio.reference.io_context__executor_type.operator_eq__eq_ [*operator==]]]
-    [Compare two executors for equality. ]
-  ]
-  
-]
-
-
-[heading Requirements]
-
-['Header: ][^asio/windows/basic_object_handle.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:get_executor windows::basic_object_handle::get_executor]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 get_executor..windows::basic_object_handle] 
-Get the executor associated with the object. 
-
-
-  executor_type get_executor();
-
-
-
-[endsect]
-
-
-[section:get_implementation windows::basic_object_handle::get_implementation]
-
-[indexterm2 get_implementation..windows::basic_object_handle] 
-Get the underlying implementation of the I/O object. 
-
-
-  implementation_type & ``[link asio.reference.windows__basic_object_handle.get_implementation.overload1 get_implementation]``();
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.get_implementation.overload1 more...]]``
-
-  const implementation_type & ``[link asio.reference.windows__basic_object_handle.get_implementation.overload2 get_implementation]``() const;
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.get_implementation.overload2 more...]]``
-
-
-[section:overload1 windows::basic_object_handle::get_implementation (1 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the underlying implementation of the I/O object. 
-
-
-  implementation_type & get_implementation();
-
-
-
-[endsect]
-
-
-
-[section:overload2 windows::basic_object_handle::get_implementation (2 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the underlying implementation of the I/O object. 
-
-
-  const implementation_type & get_implementation() const;
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:get_io_context windows::basic_object_handle::get_io_context]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 get_io_context..windows::basic_object_handle] 
-(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
-
-
-  asio::io_context & get_io_context();
-
-
-This function may be used to obtain the [link asio.reference.io_context `io_context`] object that the I/O object uses to dispatch handlers for asynchronous operations.
-
-
-[heading Return Value]
-      
-A reference to the [link asio.reference.io_context `io_context`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 
-
-
-
-
-[endsect]
-
-
-
-[section:get_io_service windows::basic_object_handle::get_io_service]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 get_io_service..windows::basic_object_handle] 
-(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
-
-
-  asio::io_context & get_io_service();
-
-
-This function may be used to obtain the [link asio.reference.io_context `io_context`] object that the I/O object uses to dispatch handlers for asynchronous operations.
-
-
-[heading Return Value]
-      
-A reference to the [link asio.reference.io_context `io_context`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 
-
-
-
-
-[endsect]
-
-
-[section:get_service windows::basic_object_handle::get_service]
-
-[indexterm2 get_service..windows::basic_object_handle] 
-Get the service associated with the I/O object. 
-
-
-  service_type & ``[link asio.reference.windows__basic_object_handle.get_service.overload1 get_service]``();
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.get_service.overload1 more...]]``
-
-  const service_type & ``[link asio.reference.windows__basic_object_handle.get_service.overload2 get_service]``() const;
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.get_service.overload2 more...]]``
-
-
-[section:overload1 windows::basic_object_handle::get_service (1 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the service associated with the I/O object. 
-
-
-  service_type & get_service();
-
-
-
-[endsect]
-
-
-
-[section:overload2 windows::basic_object_handle::get_service (2 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the service associated with the I/O object. 
-
-
-  const service_type & get_service() const;
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:implementation_type windows::basic_object_handle::implementation_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 implementation_type..windows::basic_object_handle] 
-The underlying implementation type of I/O object. 
-
-
-  typedef service_type::implementation_type implementation_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/windows/basic_object_handle.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:is_open windows::basic_object_handle::is_open]
-
-
-['Inherited from windows::basic_handle.]
-
-[indexterm2 is_open..windows::basic_object_handle] 
-Determine whether the handle is open. 
-
-
-  bool is_open() const;
-
-
-
-[endsect]
-
-
-[section:lowest_layer windows::basic_object_handle::lowest_layer]
-
-[indexterm2 lowest_layer..windows::basic_object_handle] 
-Get a reference to the lowest layer. 
-
-
-  lowest_layer_type & ``[link asio.reference.windows__basic_object_handle.lowest_layer.overload1 lowest_layer]``();
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.lowest_layer.overload1 more...]]``
-
-
-Get a const reference to the lowest layer. 
-
-
-  const lowest_layer_type & ``[link asio.reference.windows__basic_object_handle.lowest_layer.overload2 lowest_layer]``() const;
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.lowest_layer.overload2 more...]]``
-
-
-[section:overload1 windows::basic_object_handle::lowest_layer (1 of 2 overloads)]
-
-
-['Inherited from windows::basic_handle.]
-
-
-Get a reference to the lowest layer. 
-
-
-  lowest_layer_type & lowest_layer();
-
-
-This function returns a reference to the lowest layer in a stack of layers. Since a [link asio.reference.windows__basic_handle `windows::basic_handle`] cannot contain any further layers, it simply returns a reference to itself.
-
-
-[heading Return Value]
-      
-A reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 windows::basic_object_handle::lowest_layer (2 of 2 overloads)]
-
-
-['Inherited from windows::basic_handle.]
-
-
-Get a const reference to the lowest layer. 
-
-
-  const lowest_layer_type & lowest_layer() const;
-
-
-This function returns a const reference to the lowest layer in a stack of layers. Since a [link asio.reference.windows__basic_handle `windows::basic_handle`] cannot contain any further layers, it simply returns a reference to itself.
-
-
-[heading Return Value]
-      
-A const reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:lowest_layer_type windows::basic_object_handle::lowest_layer_type]
-
-
-['Inherited from windows::basic_handle.]
-
-[indexterm2 lowest_layer_type..windows::basic_object_handle] 
-A [link asio.reference.windows__basic_handle `windows::basic_handle`] is always the lowest layer. 
-
-
-  typedef basic_handle< ObjectHandleService > lowest_layer_type;
-
-
-[heading Types]
-[table
-  [[Name][Description]]
-
-  [
-
-    [[link asio.reference.windows__basic_handle.executor_type [*executor_type]]]
-    [The type of the executor associated with the object. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.windows__basic_handle.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.windows__basic_handle.lowest_layer_type [*lowest_layer_type]]]
-    [A basic_handle is always the lowest layer. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.windows__basic_handle.native_handle_type [*native_handle_type]]]
-    [The native representation of a handle. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.windows__basic_handle.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-]
-
-[heading Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.windows__basic_handle.assign [*assign]]]
-    [Assign an existing native handle to the handle. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_handle.basic_handle [*basic_handle]]]
-    [Construct a basic_handle without opening it. 
-
-     Construct a basic_handle on an existing native handle. 
-
-     Move-construct a basic_handle from another. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_handle.cancel [*cancel]]]
-    [Cancel all asynchronous operations associated with the handle. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_handle.close [*close]]]
-    [Close the handle. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_handle.get_executor [*get_executor]]]
-    [Get the executor associated with the object. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_handle.get_io_context [*get_io_context]]]
-    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_handle.get_io_service [*get_io_service]]]
-    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_handle.is_open [*is_open]]]
-    [Determine whether the handle is open. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_handle.lowest_layer [*lowest_layer]]]
-    [Get a reference to the lowest layer. 
-
-     Get a const reference to the lowest layer. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_handle.native_handle [*native_handle]]]
-    [Get the native handle representation. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_handle.operator_eq_ [*operator=]]]
-    [Move-assign a basic_handle from another. ]
-  ]
-  
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.windows__basic_handle.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_handle.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_handle._basic_handle [*~basic_handle]]]
-    [Protected destructor to prevent deletion through this type. ]
-  ]
-  
-]
-
-The [link asio.reference.windows__basic_handle `windows::basic_handle`] class template provides the ability to wrap a Windows handle.
-
-
-[heading Thread Safety]
-  
-['Distinct] ['objects:] Safe.
-
-['Shared] ['objects:] Unsafe. 
-
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/windows/basic_object_handle.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:native_handle windows::basic_object_handle::native_handle]
-
-
-['Inherited from windows::basic_handle.]
-
-[indexterm2 native_handle..windows::basic_object_handle] 
-Get the native handle representation. 
-
-
-  native_handle_type native_handle();
-
-
-This function may be used to obtain the underlying representation of the handle. This is intended to allow access to native handle functionality that is not otherwise provided. 
-
-
-[endsect]
-
-
-
-[section:native_handle_type windows::basic_object_handle::native_handle_type]
-
-[indexterm2 native_handle_type..windows::basic_object_handle] 
-The native representation of a handle. 
-
-
-  typedef ObjectHandleService::native_handle_type native_handle_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/windows/basic_object_handle.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:operator_eq_ windows::basic_object_handle::operator=]
-
-[indexterm2 operator=..windows::basic_object_handle] 
-Move-assign a [link asio.reference.windows__basic_object_handle `windows::basic_object_handle`] from another. 
-
-
-  basic_object_handle & operator=(
-      basic_object_handle && other);
+  object_handle & operator=(
+      object_handle && other);
 
 
 This assignment operator moves an object handle from one object to another.
@@ -124979,14 +112541,14 @@
 
 [variablelist
   
-[[other][The other [link asio.reference.windows__basic_object_handle `windows::basic_object_handle`] object from which the move will occur.]]
+[[other][The other [link asio.reference.windows__object_handle `windows::object_handle`] object from which the move will occur.]]
 
 ]
 
 
 [heading Remarks]
       
-Following the move, the moved-from object is in the same state as if constructed using the `basic_object_handle(io_context&) constructor`. 
+Following the move, the moved-from object is in the same state as if constructed using the `object_handle(io_context&) constructor`. 
 
 
 
@@ -124994,45 +112556,21 @@
 [endsect]
 
 
+[section:wait windows::object_handle::wait]
 
-[section:service_type windows::basic_object_handle::service_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 service_type..windows::basic_object_handle] 
-The type of the service that will be used to provide I/O operations. 
-
-
-  typedef ObjectHandleService service_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/windows/basic_object_handle.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-[section:wait windows::basic_object_handle::wait]
-
-[indexterm2 wait..windows::basic_object_handle] 
+[indexterm2 wait..windows::object_handle] 
 Perform a blocking wait on the object handle. 
 
 
-  void ``[link asio.reference.windows__basic_object_handle.wait.overload1 wait]``();
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.wait.overload1 more...]]``
+  void ``[link asio.reference.windows__object_handle.wait.overload1 wait]``();
+  ``  [''''&raquo;''' [link asio.reference.windows__object_handle.wait.overload1 more...]]``
 
-  void ``[link asio.reference.windows__basic_object_handle.wait.overload2 wait]``(
+  void ``[link asio.reference.windows__object_handle.wait.overload2 wait]``(
       asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_object_handle.wait.overload2 more...]]``
+  ``  [''''&raquo;''' [link asio.reference.windows__object_handle.wait.overload2 more...]]``
 
 
-[section:overload1 windows::basic_object_handle::wait (1 of 2 overloads)]
+[section:overload1 windows::object_handle::wait (1 of 2 overloads)]
 
 
 Perform a blocking wait on the object handle. 
@@ -125060,7 +112598,7 @@
 
 
 
-[section:overload2 windows::basic_object_handle::wait (2 of 2 overloads)]
+[section:overload2 windows::object_handle::wait (2 of 2 overloads)]
 
 
 Perform a blocking wait on the object handle. 
@@ -125093,16 +112631,13 @@
 
 [endsect]
 
-[section:windows__basic_random_access_handle windows::basic_random_access_handle]
+[section:windows__overlapped_handle windows::overlapped_handle]
 
 
-Provides random-access handle functionality. 
+Provides Windows handle functionality for objects that support overlapped I/O. 
 
 
-  template<
-      typename ``[link asio.reference.RandomAccessHandleService RandomAccessHandleService]`` = random_access_handle_service>
-  class basic_random_access_handle :
-    public windows::basic_handle< RandomAccessHandleService >
+  class overlapped_handle
 
 
 [heading Types]
@@ -125111,39 +112646,25 @@
 
   [
 
-    [[link asio.reference.windows__basic_random_access_handle.executor_type [*executor_type]]]
+    [[link asio.reference.windows__overlapped_handle.executor_type [*executor_type]]]
     [The type of the executor associated with the object. ]
   
   ]
 
   [
 
-    [[link asio.reference.windows__basic_random_access_handle.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
+    [[link asio.reference.windows__overlapped_handle.lowest_layer_type [*lowest_layer_type]]]
+    [An overlapped_handle is always the lowest layer. ]
   
   ]
 
   [
 
-    [[link asio.reference.windows__basic_random_access_handle.lowest_layer_type [*lowest_layer_type]]]
-    [A basic_handle is always the lowest layer. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.windows__basic_random_access_handle.native_handle_type [*native_handle_type]]]
+    [[link asio.reference.windows__overlapped_handle.native_handle_type [*native_handle_type]]]
     [The native representation of a handle. ]
   
   ]
 
-  [
-
-    [[link asio.reference.windows__basic_random_access_handle.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
 ]
 
 [heading Member Functions]
@@ -125151,84 +112672,64 @@
   [[Name][Description]]
 
   [
-    [[link asio.reference.windows__basic_random_access_handle.assign [*assign]]]
+    [[link asio.reference.windows__overlapped_handle.assign [*assign]]]
     [Assign an existing native handle to the handle. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_random_access_handle.async_read_some_at [*async_read_some_at]]]
-    [Start an asynchronous read at the specified offset. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_random_access_handle.async_write_some_at [*async_write_some_at]]]
-    [Start an asynchronous write at the specified offset. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_random_access_handle.basic_random_access_handle [*basic_random_access_handle]]]
-    [Construct a basic_random_access_handle without opening it. 
-
-     Construct a basic_random_access_handle on an existing native handle. 
-
-     Move-construct a basic_random_access_handle from another. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_random_access_handle.cancel [*cancel]]]
+    [[link asio.reference.windows__overlapped_handle.cancel [*cancel]]]
     [Cancel all asynchronous operations associated with the handle. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_random_access_handle.close [*close]]]
+    [[link asio.reference.windows__overlapped_handle.close [*close]]]
     [Close the handle. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_random_access_handle.get_executor [*get_executor]]]
+    [[link asio.reference.windows__overlapped_handle.get_executor [*get_executor]]]
     [Get the executor associated with the object. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_random_access_handle.get_io_context [*get_io_context]]]
+    [[link asio.reference.windows__overlapped_handle.get_io_context [*get_io_context]]]
     [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_random_access_handle.get_io_service [*get_io_service]]]
+    [[link asio.reference.windows__overlapped_handle.get_io_service [*get_io_service]]]
     [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_random_access_handle.is_open [*is_open]]]
+    [[link asio.reference.windows__overlapped_handle.is_open [*is_open]]]
     [Determine whether the handle is open. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_random_access_handle.lowest_layer [*lowest_layer]]]
+    [[link asio.reference.windows__overlapped_handle.lowest_layer [*lowest_layer]]]
     [Get a reference to the lowest layer. 
 
      Get a const reference to the lowest layer. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_random_access_handle.native_handle [*native_handle]]]
+    [[link asio.reference.windows__overlapped_handle.native_handle [*native_handle]]]
     [Get the native handle representation. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_random_access_handle.operator_eq_ [*operator=]]]
-    [Move-assign a basic_random_access_handle from another. ]
+    [[link asio.reference.windows__overlapped_handle.operator_eq_ [*operator=]]]
+    [Move-assign an overlapped_handle from another. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_random_access_handle.read_some_at [*read_some_at]]]
-    [Read some data from the handle at the specified offset. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_random_access_handle.write_some_at [*write_some_at]]]
-    [Write some data to the handle at the specified offset. ]
+    [[link asio.reference.windows__overlapped_handle.overlapped_handle [*overlapped_handle]]]
+    [Construct an overlapped_handle without opening it. 
+
+     Construct an overlapped_handle on an existing native handle. 
+
+     Move-construct an overlapped_handle from another. ]
   ]
   
 ]
@@ -125238,18 +112739,23 @@
   [[Name][Description]]
 
   [
-    [[link asio.reference.windows__basic_random_access_handle.get_implementation [*get_implementation]]]
+    [[link asio.reference.windows__overlapped_handle.get_implementation [*get_implementation]]]
     [Get the underlying implementation of the I/O object. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_random_access_handle.get_service [*get_service]]]
+    [[link asio.reference.windows__overlapped_handle.get_service [*get_service]]]
     [Get the service associated with the I/O object. ]
   ]
   
+  [
+    [[link asio.reference.windows__overlapped_handle._overlapped_handle [*~overlapped_handle]]]
+    [Protected destructor to prevent deletion through this type. ]
+  ]
+  
 ]
 
-The [link asio.reference.windows__basic_random_access_handle `windows::basic_random_access_handle`] class template provides asynchronous and blocking random-access handle functionality.
+The [link asio.reference.windows__overlapped_handle `windows::overlapped_handle`] class provides the ability to wrap a Windows handle. The underlying object referred to by the handle must support overlapped I/O.
 
 
 [heading Thread Safety]
@@ -125262,30 +112768,27 @@
 
 [heading Requirements]
 
-['Header: ][^asio/windows/basic_random_access_handle.hpp]
+['Header: ][^asio/windows/overlapped_handle.hpp]
 
 ['Convenience header: ][^asio.hpp]
 
-[section:assign windows::basic_random_access_handle::assign]
+[section:assign windows::overlapped_handle::assign]
 
-[indexterm2 assign..windows::basic_random_access_handle] 
+[indexterm2 assign..windows::overlapped_handle] 
 Assign an existing native handle to the handle. 
 
 
-  void ``[link asio.reference.windows__basic_random_access_handle.assign.overload1 assign]``(
+  void ``[link asio.reference.windows__overlapped_handle.assign.overload1 assign]``(
       const native_handle_type & handle);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.assign.overload1 more...]]``
+  ``  [''''&raquo;''' [link asio.reference.windows__overlapped_handle.assign.overload1 more...]]``
 
-  asio::error_code ``[link asio.reference.windows__basic_random_access_handle.assign.overload2 assign]``(
+  asio::error_code ``[link asio.reference.windows__overlapped_handle.assign.overload2 assign]``(
       const native_handle_type & handle,
       asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.assign.overload2 more...]]``
+  ``  [''''&raquo;''' [link asio.reference.windows__overlapped_handle.assign.overload2 more...]]``
 
 
-[section:overload1 windows::basic_random_access_handle::assign (1 of 2 overloads)]
-
-
-['Inherited from windows::basic_handle.]
+[section:overload1 windows::overlapped_handle::assign (1 of 2 overloads)]
 
 
 Assign an existing native handle to the handle. 
@@ -125300,10 +112803,7 @@
 
 
 
-[section:overload2 windows::basic_random_access_handle::assign (2 of 2 overloads)]
-
-
-['Inherited from windows::basic_handle.]
+[section:overload2 windows::overlapped_handle::assign (2 of 2 overloads)]
 
 
 Assign an existing native handle to the handle. 
@@ -125320,278 +112820,21 @@
 
 [endsect]
 
+[section:cancel windows::overlapped_handle::cancel]
 
-[section:async_read_some_at windows::basic_random_access_handle::async_read_some_at]
-
-[indexterm2 async_read_some_at..windows::basic_random_access_handle] 
-Start an asynchronous read at the specified offset. 
-
-
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
-      typename ``[link asio.reference.ReadHandler ReadHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_some_at(
-      uint64_t offset,
-      const MutableBufferSequence & buffers,
-      ReadHandler && handler);
-
-
-This function is used to asynchronously read data from the random-access handle. The function call always returns immediately.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[offset][The offset at which the data will be read.]]
-
-[[buffers][One or more buffers into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]
-
-[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
-``
-   void handler(
-     const asio::error_code& error, // Result of operation.
-     std::size_t bytes_transferred           // Number of bytes read.
-   ); 
-``
-Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using `asio::io_context::post()`.]]
-
-]
-
-
-[heading Remarks]
-      
-The read operation may not read all of the requested number of bytes. Consider using the [link asio.reference.async_read_at `async_read_at`]  function if you need to ensure that the requested amount of data is read before the asynchronous operation completes.
-
-
-[heading Example]
-  
-To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 
-
-   handle.async_read_some_at(42, asio::buffer(data, size), handler);
-
-
-See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 
-
-
-
-
-[endsect]
-
-
-
-[section:async_write_some_at windows::basic_random_access_handle::async_write_some_at]
-
-[indexterm2 async_write_some_at..windows::basic_random_access_handle] 
-Start an asynchronous write at the specified offset. 
-
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
-      typename ``[link asio.reference.WriteHandler WriteHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_write_some_at(
-      uint64_t offset,
-      const ConstBufferSequence & buffers,
-      WriteHandler && handler);
-
-
-This function is used to asynchronously write data to the random-access handle. The function call always returns immediately.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[offset][The offset at which the data will be written.]]
-
-[[buffers][One or more data buffers to be written to the handle. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]
-
-[[handler][The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
-``
-   void handler(
-     const asio::error_code& error, // Result of operation.
-     std::size_t bytes_transferred           // Number of bytes written.
-   ); 
-``
-Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using `asio::io_context::post()`.]]
-
-]
-
-
-[heading Remarks]
-      
-The write operation may not transmit all of the data to the peer. Consider using the [link asio.reference.async_write_at `async_write_at`]  function if you need to ensure that all data is written before the asynchronous operation completes.
-
-
-[heading Example]
-  
-To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 
-
-   handle.async_write_some_at(42, asio::buffer(data, size), handler);
-
-
-See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 
-
-
-
-
-[endsect]
-
-
-[section:basic_random_access_handle windows::basic_random_access_handle::basic_random_access_handle]
-
-[indexterm2 basic_random_access_handle..windows::basic_random_access_handle] 
-Construct a [link asio.reference.windows__basic_random_access_handle `windows::basic_random_access_handle`] without opening it. 
-
-
-  explicit ``[link asio.reference.windows__basic_random_access_handle.basic_random_access_handle.overload1 basic_random_access_handle]``(
-      asio::io_context & io_context);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.basic_random_access_handle.overload1 more...]]``
-
-
-Construct a [link asio.reference.windows__basic_random_access_handle `windows::basic_random_access_handle`] on an existing native handle. 
-
-
-  ``[link asio.reference.windows__basic_random_access_handle.basic_random_access_handle.overload2 basic_random_access_handle]``(
-      asio::io_context & io_context,
-      const native_handle_type & handle);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.basic_random_access_handle.overload2 more...]]``
-
-
-Move-construct a [link asio.reference.windows__basic_random_access_handle `windows::basic_random_access_handle`] from another. 
-
-
-  ``[link asio.reference.windows__basic_random_access_handle.basic_random_access_handle.overload3 basic_random_access_handle]``(
-      basic_random_access_handle && other);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.basic_random_access_handle.overload3 more...]]``
-
-
-[section:overload1 windows::basic_random_access_handle::basic_random_access_handle (1 of 3 overloads)]
-
-
-Construct a [link asio.reference.windows__basic_random_access_handle `windows::basic_random_access_handle`] without opening it. 
-
-
-  basic_random_access_handle(
-      asio::io_context & io_context);
-
-
-This constructor creates a random-access handle without opening it. The handle needs to be opened before data can be written to or read from it.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[io_context][The [link asio.reference.io_context `io_context`] object that the random-access handle will use to dispatch handlers for any asynchronous operations performed on the handle. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 windows::basic_random_access_handle::basic_random_access_handle (2 of 3 overloads)]
-
-
-Construct a [link asio.reference.windows__basic_random_access_handle `windows::basic_random_access_handle`] on an existing native handle. 
-
-
-  basic_random_access_handle(
-      asio::io_context & io_context,
-      const native_handle_type & handle);
-
-
-This constructor creates a random-access handle object to hold an existing native handle.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[io_context][The [link asio.reference.io_context `io_context`] object that the random-access handle will use to dispatch handlers for any asynchronous operations performed on the handle.]]
-
-[[handle][The new underlying handle implementation.]]
-
-]
-
-
-[heading Exceptions]
-    
-
-[variablelist
-  
-[[asio::system_error][Thrown on failure. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-
-[section:overload3 windows::basic_random_access_handle::basic_random_access_handle (3 of 3 overloads)]
-
-
-Move-construct a [link asio.reference.windows__basic_random_access_handle `windows::basic_random_access_handle`] from another. 
-
-
-  basic_random_access_handle(
-      basic_random_access_handle && other);
-
-
-This constructor moves a random-access handle from one object to another.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[other][The other [link asio.reference.windows__basic_random_access_handle `windows::basic_random_access_handle`] object from which the move will occur.]]
-
-]
-
-
-[heading Remarks]
-      
-Following the move, the moved-from object is in the same state as if constructed using the `basic_random_access_handle(io_context&)` constructor. 
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-[section:cancel windows::basic_random_access_handle::cancel]
-
-[indexterm2 cancel..windows::basic_random_access_handle] 
+[indexterm2 cancel..windows::overlapped_handle] 
 Cancel all asynchronous operations associated with the handle. 
 
 
-  void ``[link asio.reference.windows__basic_random_access_handle.cancel.overload1 cancel]``();
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.cancel.overload1 more...]]``
+  void ``[link asio.reference.windows__overlapped_handle.cancel.overload1 cancel]``();
+  ``  [''''&raquo;''' [link asio.reference.windows__overlapped_handle.cancel.overload1 more...]]``
 
-  asio::error_code ``[link asio.reference.windows__basic_random_access_handle.cancel.overload2 cancel]``(
+  asio::error_code ``[link asio.reference.windows__overlapped_handle.cancel.overload2 cancel]``(
       asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.cancel.overload2 more...]]``
+  ``  [''''&raquo;''' [link asio.reference.windows__overlapped_handle.cancel.overload2 more...]]``
 
 
-[section:overload1 windows::basic_random_access_handle::cancel (1 of 2 overloads)]
-
-
-['Inherited from windows::basic_handle.]
+[section:overload1 windows::overlapped_handle::cancel (1 of 2 overloads)]
 
 
 Cancel all asynchronous operations associated with the handle. 
@@ -125619,10 +112862,7 @@
 
 
 
-[section:overload2 windows::basic_random_access_handle::cancel (2 of 2 overloads)]
-
-
-['Inherited from windows::basic_handle.]
+[section:overload2 windows::overlapped_handle::cancel (2 of 2 overloads)]
 
 
 Cancel all asynchronous operations associated with the handle. 
@@ -125652,24 +112892,21 @@
 
 [endsect]
 
-[section:close windows::basic_random_access_handle::close]
+[section:close windows::overlapped_handle::close]
 
-[indexterm2 close..windows::basic_random_access_handle] 
+[indexterm2 close..windows::overlapped_handle] 
 Close the handle. 
 
 
-  void ``[link asio.reference.windows__basic_random_access_handle.close.overload1 close]``();
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.close.overload1 more...]]``
+  void ``[link asio.reference.windows__overlapped_handle.close.overload1 close]``();
+  ``  [''''&raquo;''' [link asio.reference.windows__overlapped_handle.close.overload1 more...]]``
 
-  asio::error_code ``[link asio.reference.windows__basic_random_access_handle.close.overload2 close]``(
+  asio::error_code ``[link asio.reference.windows__overlapped_handle.close.overload2 close]``(
       asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.close.overload2 more...]]``
+  ``  [''''&raquo;''' [link asio.reference.windows__overlapped_handle.close.overload2 more...]]``
 
 
-[section:overload1 windows::basic_random_access_handle::close (1 of 2 overloads)]
-
-
-['Inherited from windows::basic_handle.]
+[section:overload1 windows::overlapped_handle::close (1 of 2 overloads)]
 
 
 Close the handle. 
@@ -125697,10 +112934,7 @@
 
 
 
-[section:overload2 windows::basic_random_access_handle::close (2 of 2 overloads)]
-
-
-['Inherited from windows::basic_handle.]
+[section:overload2 windows::overlapped_handle::close (2 of 2 overloads)]
 
 
 Close the handle. 
@@ -125731,16 +112965,13 @@
 [endsect]
 
 
-[section:executor_type windows::basic_random_access_handle::executor_type]
+[section:executor_type windows::overlapped_handle::executor_type]
 
-
-['Inherited from basic_io_object.]
-
-[indexterm2 executor_type..windows::basic_random_access_handle] 
+[indexterm2 executor_type..windows::overlapped_handle] 
 The type of the executor associated with the object. 
 
 
-  typedef asio::io_context::executor_type executor_type;
+  typedef io_context::executor_type executor_type;
 
 
 [heading Member Functions]
@@ -125803,7 +113034,7 @@
 
 [heading Requirements]
 
-['Header: ][^asio/windows/basic_random_access_handle.hpp]
+['Header: ][^asio/windows/overlapped_handle.hpp]
 
 ['Convenience header: ][^asio.hpp]
 
@@ -125812,12 +113043,9 @@
 
 
 
-[section:get_executor windows::basic_random_access_handle::get_executor]
+[section:get_executor windows::overlapped_handle::get_executor]
 
-
-['Inherited from basic_io_object.]
-
-[indexterm2 get_executor..windows::basic_random_access_handle] 
+[indexterm2 get_executor..windows::overlapped_handle] 
 Get the executor associated with the object. 
 
 
@@ -125828,20 +113056,20 @@
 [endsect]
 
 
-[section:get_implementation windows::basic_random_access_handle::get_implementation]
+[section:get_implementation windows::overlapped_handle::get_implementation]
 
-[indexterm2 get_implementation..windows::basic_random_access_handle] 
+[indexterm2 get_implementation..windows::overlapped_handle] 
 Get the underlying implementation of the I/O object. 
 
 
-  implementation_type & ``[link asio.reference.windows__basic_random_access_handle.get_implementation.overload1 get_implementation]``();
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.get_implementation.overload1 more...]]``
+  implementation_type & ``[link asio.reference.windows__overlapped_handle.get_implementation.overload1 get_implementation]``();
+  ``  [''''&raquo;''' [link asio.reference.windows__overlapped_handle.get_implementation.overload1 more...]]``
 
-  const implementation_type & ``[link asio.reference.windows__basic_random_access_handle.get_implementation.overload2 get_implementation]``() const;
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.get_implementation.overload2 more...]]``
+  const implementation_type & ``[link asio.reference.windows__overlapped_handle.get_implementation.overload2 get_implementation]``() const;
+  ``  [''''&raquo;''' [link asio.reference.windows__overlapped_handle.get_implementation.overload2 more...]]``
 
 
-[section:overload1 windows::basic_random_access_handle::get_implementation (1 of 2 overloads)]
+[section:overload1 windows::overlapped_handle::get_implementation (1 of 2 overloads)]
 
 
 ['Inherited from basic_io_object.]
@@ -125858,7 +113086,7 @@
 
 
 
-[section:overload2 windows::basic_random_access_handle::get_implementation (2 of 2 overloads)]
+[section:overload2 windows::overlapped_handle::get_implementation (2 of 2 overloads)]
 
 
 ['Inherited from basic_io_object.]
@@ -125877,12 +113105,9 @@
 [endsect]
 
 
-[section:get_io_context windows::basic_random_access_handle::get_io_context]
+[section:get_io_context windows::overlapped_handle::get_io_context]
 
-
-['Inherited from basic_io_object.]
-
-[indexterm2 get_io_context..windows::basic_random_access_handle] 
+[indexterm2 get_io_context..windows::overlapped_handle] 
 (Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
 
 
@@ -125903,12 +113128,9 @@
 
 
 
-[section:get_io_service windows::basic_random_access_handle::get_io_service]
+[section:get_io_service windows::overlapped_handle::get_io_service]
 
-
-['Inherited from basic_io_object.]
-
-[indexterm2 get_io_service..windows::basic_random_access_handle] 
+[indexterm2 get_io_service..windows::overlapped_handle] 
 (Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
 
 
@@ -125928,20 +113150,20 @@
 [endsect]
 
 
-[section:get_service windows::basic_random_access_handle::get_service]
+[section:get_service windows::overlapped_handle::get_service]
 
-[indexterm2 get_service..windows::basic_random_access_handle] 
+[indexterm2 get_service..windows::overlapped_handle] 
 Get the service associated with the I/O object. 
 
 
-  service_type & ``[link asio.reference.windows__basic_random_access_handle.get_service.overload1 get_service]``();
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.get_service.overload1 more...]]``
+  service_type & ``[link asio.reference.windows__overlapped_handle.get_service.overload1 get_service]``();
+  ``  [''''&raquo;''' [link asio.reference.windows__overlapped_handle.get_service.overload1 more...]]``
 
-  const service_type & ``[link asio.reference.windows__basic_random_access_handle.get_service.overload2 get_service]``() const;
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.get_service.overload2 more...]]``
+  const service_type & ``[link asio.reference.windows__overlapped_handle.get_service.overload2 get_service]``() const;
+  ``  [''''&raquo;''' [link asio.reference.windows__overlapped_handle.get_service.overload2 more...]]``
 
 
-[section:overload1 windows::basic_random_access_handle::get_service (1 of 2 overloads)]
+[section:overload1 windows::overlapped_handle::get_service (1 of 2 overloads)]
 
 
 ['Inherited from basic_io_object.]
@@ -125958,7 +113180,7 @@
 
 
 
-[section:overload2 windows::basic_random_access_handle::get_service (2 of 2 overloads)]
+[section:overload2 windows::overlapped_handle::get_service (2 of 2 overloads)]
 
 
 ['Inherited from basic_io_object.]
@@ -125977,36 +113199,9 @@
 [endsect]
 
 
-[section:implementation_type windows::basic_random_access_handle::implementation_type]
+[section:is_open windows::overlapped_handle::is_open]
 
-
-['Inherited from basic_io_object.]
-
-[indexterm2 implementation_type..windows::basic_random_access_handle] 
-The underlying implementation type of I/O object. 
-
-
-  typedef service_type::implementation_type implementation_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/windows/basic_random_access_handle.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:is_open windows::basic_random_access_handle::is_open]
-
-
-['Inherited from windows::basic_handle.]
-
-[indexterm2 is_open..windows::basic_random_access_handle] 
+[indexterm2 is_open..windows::overlapped_handle] 
 Determine whether the handle is open. 
 
 
@@ -126017,27 +113212,24 @@
 [endsect]
 
 
-[section:lowest_layer windows::basic_random_access_handle::lowest_layer]
+[section:lowest_layer windows::overlapped_handle::lowest_layer]
 
-[indexterm2 lowest_layer..windows::basic_random_access_handle] 
+[indexterm2 lowest_layer..windows::overlapped_handle] 
 Get a reference to the lowest layer. 
 
 
-  lowest_layer_type & ``[link asio.reference.windows__basic_random_access_handle.lowest_layer.overload1 lowest_layer]``();
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.lowest_layer.overload1 more...]]``
+  lowest_layer_type & ``[link asio.reference.windows__overlapped_handle.lowest_layer.overload1 lowest_layer]``();
+  ``  [''''&raquo;''' [link asio.reference.windows__overlapped_handle.lowest_layer.overload1 more...]]``
 
 
 Get a const reference to the lowest layer. 
 
 
-  const lowest_layer_type & ``[link asio.reference.windows__basic_random_access_handle.lowest_layer.overload2 lowest_layer]``() const;
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.lowest_layer.overload2 more...]]``
+  const lowest_layer_type & ``[link asio.reference.windows__overlapped_handle.lowest_layer.overload2 lowest_layer]``() const;
+  ``  [''''&raquo;''' [link asio.reference.windows__overlapped_handle.lowest_layer.overload2 more...]]``
 
 
-[section:overload1 windows::basic_random_access_handle::lowest_layer (1 of 2 overloads)]
-
-
-['Inherited from windows::basic_handle.]
+[section:overload1 windows::overlapped_handle::lowest_layer (1 of 2 overloads)]
 
 
 Get a reference to the lowest layer. 
@@ -126046,7 +113238,7 @@
   lowest_layer_type & lowest_layer();
 
 
-This function returns a reference to the lowest layer in a stack of layers. Since a [link asio.reference.windows__basic_handle `windows::basic_handle`] cannot contain any further layers, it simply returns a reference to itself.
+This function returns a reference to the lowest layer in a stack of layers. Since an [link asio.reference.windows__overlapped_handle `windows::overlapped_handle`] cannot contain any further layers, it simply returns a reference to itself.
 
 
 [heading Return Value]
@@ -126060,10 +113252,7 @@
 
 
 
-[section:overload2 windows::basic_random_access_handle::lowest_layer (2 of 2 overloads)]
-
-
-['Inherited from windows::basic_handle.]
+[section:overload2 windows::overlapped_handle::lowest_layer (2 of 2 overloads)]
 
 
 Get a const reference to the lowest layer. 
@@ -126072,7 +113261,7 @@
   const lowest_layer_type & lowest_layer() const;
 
 
-This function returns a const reference to the lowest layer in a stack of layers. Since a [link asio.reference.windows__basic_handle `windows::basic_handle`] cannot contain any further layers, it simply returns a reference to itself.
+This function returns a const reference to the lowest layer in a stack of layers. Since an [link asio.reference.windows__overlapped_handle `windows::overlapped_handle`] cannot contain any further layers, it simply returns a reference to itself.
 
 
 [heading Return Value]
@@ -126088,16 +113277,13 @@
 [endsect]
 
 
-[section:lowest_layer_type windows::basic_random_access_handle::lowest_layer_type]
+[section:lowest_layer_type windows::overlapped_handle::lowest_layer_type]
+
+[indexterm2 lowest_layer_type..windows::overlapped_handle] 
+An [link asio.reference.windows__overlapped_handle `windows::overlapped_handle`] is always the lowest layer. 
 
 
-['Inherited from windows::basic_handle.]
-
-[indexterm2 lowest_layer_type..windows::basic_random_access_handle] 
-A [link asio.reference.windows__basic_handle `windows::basic_handle`] is always the lowest layer. 
-
-
-  typedef basic_handle< RandomAccessHandleService > lowest_layer_type;
+  typedef overlapped_handle lowest_layer_type;
 
 
 [heading Types]
@@ -126106,39 +113292,25 @@
 
   [
 
-    [[link asio.reference.windows__basic_handle.executor_type [*executor_type]]]
+    [[link asio.reference.windows__overlapped_handle.executor_type [*executor_type]]]
     [The type of the executor associated with the object. ]
   
   ]
 
   [
 
-    [[link asio.reference.windows__basic_handle.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
+    [[link asio.reference.windows__overlapped_handle.lowest_layer_type [*lowest_layer_type]]]
+    [An overlapped_handle is always the lowest layer. ]
   
   ]
 
   [
 
-    [[link asio.reference.windows__basic_handle.lowest_layer_type [*lowest_layer_type]]]
-    [A basic_handle is always the lowest layer. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.windows__basic_handle.native_handle_type [*native_handle_type]]]
+    [[link asio.reference.windows__overlapped_handle.native_handle_type [*native_handle_type]]]
     [The native representation of a handle. ]
   
   ]
 
-  [
-
-    [[link asio.reference.windows__basic_handle.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
 ]
 
 [heading Member Functions]
@@ -126146,64 +113318,64 @@
   [[Name][Description]]
 
   [
-    [[link asio.reference.windows__basic_handle.assign [*assign]]]
+    [[link asio.reference.windows__overlapped_handle.assign [*assign]]]
     [Assign an existing native handle to the handle. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_handle.basic_handle [*basic_handle]]]
-    [Construct a basic_handle without opening it. 
-
-     Construct a basic_handle on an existing native handle. 
-
-     Move-construct a basic_handle from another. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_handle.cancel [*cancel]]]
+    [[link asio.reference.windows__overlapped_handle.cancel [*cancel]]]
     [Cancel all asynchronous operations associated with the handle. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_handle.close [*close]]]
+    [[link asio.reference.windows__overlapped_handle.close [*close]]]
     [Close the handle. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_handle.get_executor [*get_executor]]]
+    [[link asio.reference.windows__overlapped_handle.get_executor [*get_executor]]]
     [Get the executor associated with the object. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_handle.get_io_context [*get_io_context]]]
+    [[link asio.reference.windows__overlapped_handle.get_io_context [*get_io_context]]]
     [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_handle.get_io_service [*get_io_service]]]
+    [[link asio.reference.windows__overlapped_handle.get_io_service [*get_io_service]]]
     [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_handle.is_open [*is_open]]]
+    [[link asio.reference.windows__overlapped_handle.is_open [*is_open]]]
     [Determine whether the handle is open. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_handle.lowest_layer [*lowest_layer]]]
+    [[link asio.reference.windows__overlapped_handle.lowest_layer [*lowest_layer]]]
     [Get a reference to the lowest layer. 
 
      Get a const reference to the lowest layer. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_handle.native_handle [*native_handle]]]
+    [[link asio.reference.windows__overlapped_handle.native_handle [*native_handle]]]
     [Get the native handle representation. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_handle.operator_eq_ [*operator=]]]
-    [Move-assign a basic_handle from another. ]
+    [[link asio.reference.windows__overlapped_handle.operator_eq_ [*operator=]]]
+    [Move-assign an overlapped_handle from another. ]
+  ]
+  
+  [
+    [[link asio.reference.windows__overlapped_handle.overlapped_handle [*overlapped_handle]]]
+    [Construct an overlapped_handle without opening it. 
+
+     Construct an overlapped_handle on an existing native handle. 
+
+     Move-construct an overlapped_handle from another. ]
   ]
   
 ]
@@ -126213,23 +113385,23 @@
   [[Name][Description]]
 
   [
-    [[link asio.reference.windows__basic_handle.get_implementation [*get_implementation]]]
+    [[link asio.reference.windows__overlapped_handle.get_implementation [*get_implementation]]]
     [Get the underlying implementation of the I/O object. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_handle.get_service [*get_service]]]
+    [[link asio.reference.windows__overlapped_handle.get_service [*get_service]]]
     [Get the service associated with the I/O object. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_handle._basic_handle [*~basic_handle]]]
+    [[link asio.reference.windows__overlapped_handle._overlapped_handle [*~overlapped_handle]]]
     [Protected destructor to prevent deletion through this type. ]
   ]
   
 ]
 
-The [link asio.reference.windows__basic_handle `windows::basic_handle`] class template provides the ability to wrap a Windows handle.
+The [link asio.reference.windows__overlapped_handle `windows::overlapped_handle`] class provides the ability to wrap a Windows handle. The underlying object referred to by the handle must support overlapped I/O.
 
 
 [heading Thread Safety]
@@ -126243,7 +113415,7 @@
 
 [heading Requirements]
 
-['Header: ][^asio/windows/basic_random_access_handle.hpp]
+['Header: ][^asio/windows/overlapped_handle.hpp]
 
 ['Convenience header: ][^asio.hpp]
 
@@ -126252,12 +113424,9 @@
 
 
 
-[section:native_handle windows::basic_random_access_handle::native_handle]
+[section:native_handle windows::overlapped_handle::native_handle]
 
-
-['Inherited from windows::basic_handle.]
-
-[indexterm2 native_handle..windows::basic_random_access_handle] 
+[indexterm2 native_handle..windows::overlapped_handle] 
 Get the native handle representation. 
 
 
@@ -126271,2393 +113440,19 @@
 
 
 
-[section:native_handle_type windows::basic_random_access_handle::native_handle_type]
+[section:native_handle_type windows::overlapped_handle::native_handle_type]
 
-[indexterm2 native_handle_type..windows::basic_random_access_handle] 
+[indexterm2 native_handle_type..windows::overlapped_handle] 
 The native representation of a handle. 
 
 
-  typedef RandomAccessHandleService::native_handle_type native_handle_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/windows/basic_random_access_handle.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:operator_eq_ windows::basic_random_access_handle::operator=]
-
-[indexterm2 operator=..windows::basic_random_access_handle] 
-Move-assign a [link asio.reference.windows__basic_random_access_handle `windows::basic_random_access_handle`] from another. 
-
-
-  basic_random_access_handle & operator=(
-      basic_random_access_handle && other);
-
-
-This assignment operator moves a random-access handle from one object to another.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[other][The other [link asio.reference.windows__basic_random_access_handle `windows::basic_random_access_handle`] object from which the move will occur.]]
-
-]
-
-
-[heading Remarks]
-      
-Following the move, the moved-from object is in the same state as if constructed using the `basic_random_access_handle(io_context&)` constructor. 
-
-
-
-
-[endsect]
-
-
-[section:read_some_at windows::basic_random_access_handle::read_some_at]
-
-[indexterm2 read_some_at..windows::basic_random_access_handle] 
-Read some data from the handle at the specified offset. 
-
-
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
-  std::size_t ``[link asio.reference.windows__basic_random_access_handle.read_some_at.overload1 read_some_at]``(
-      uint64_t offset,
-      const MutableBufferSequence & buffers);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.read_some_at.overload1 more...]]``
-
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
-  std::size_t ``[link asio.reference.windows__basic_random_access_handle.read_some_at.overload2 read_some_at]``(
-      uint64_t offset,
-      const MutableBufferSequence & buffers,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.read_some_at.overload2 more...]]``
-
-
-[section:overload1 windows::basic_random_access_handle::read_some_at (1 of 2 overloads)]
-
-
-Read some data from the handle at the specified offset. 
-
-
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
-  std::size_t read_some_at(
-      uint64_t offset,
-      const MutableBufferSequence & buffers);
-
-
-This function is used to read data from the random-access handle. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[offset][The offset at which the data will be read.]]
-
-[[buffers][One or more buffers into which the data will be read.]]
-
-]
-
-
-[heading Return Value]
-      
-The number of bytes read.
-
-
-[heading Exceptions]
-    
-
-[variablelist
-  
-[[asio::system_error][Thrown on failure. An error code of `asio::error::eof` indicates that the connection was closed by the peer.]]
-
-]
-
-
-[heading Remarks]
-      
-The read\_some operation may not read all of the requested number of bytes. Consider using the [link asio.reference.read_at `read_at`]  function if you need to ensure that the requested amount of data is read before the blocking operation completes.
-
-
-[heading Example]
-  
-To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 
-
-   handle.read_some_at(42, asio::buffer(data, size));
-
-
-See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 windows::basic_random_access_handle::read_some_at (2 of 2 overloads)]
-
-
-Read some data from the handle at the specified offset. 
-
-
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
-  std::size_t read_some_at(
-      uint64_t offset,
-      const MutableBufferSequence & buffers,
-      asio::error_code & ec);
-
-
-This function is used to read data from the random-access handle. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[offset][The offset at which the data will be read.]]
-
-[[buffers][One or more buffers into which the data will be read.]]
-
-[[ec][Set to indicate what error occurred, if any.]]
-
-]
-
-
-[heading Return Value]
-      
-The number of bytes read. Returns 0 if an error occurred.
-
-
-[heading Remarks]
-      
-The read\_some operation may not read all of the requested number of bytes. Consider using the [link asio.reference.read_at `read_at`]  function if you need to ensure that the requested amount of data is read before the blocking operation completes. 
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:service_type windows::basic_random_access_handle::service_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 service_type..windows::basic_random_access_handle] 
-The type of the service that will be used to provide I/O operations. 
-
-
-  typedef RandomAccessHandleService service_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/windows/basic_random_access_handle.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-[section:write_some_at windows::basic_random_access_handle::write_some_at]
-
-[indexterm2 write_some_at..windows::basic_random_access_handle] 
-Write some data to the handle at the specified offset. 
-
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
-  std::size_t ``[link asio.reference.windows__basic_random_access_handle.write_some_at.overload1 write_some_at]``(
-      uint64_t offset,
-      const ConstBufferSequence & buffers);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.write_some_at.overload1 more...]]``
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
-  std::size_t ``[link asio.reference.windows__basic_random_access_handle.write_some_at.overload2 write_some_at]``(
-      uint64_t offset,
-      const ConstBufferSequence & buffers,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_random_access_handle.write_some_at.overload2 more...]]``
-
-
-[section:overload1 windows::basic_random_access_handle::write_some_at (1 of 2 overloads)]
-
-
-Write some data to the handle at the specified offset. 
-
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
-  std::size_t write_some_at(
-      uint64_t offset,
-      const ConstBufferSequence & buffers);
-
-
-This function is used to write data to the random-access handle. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[offset][The offset at which the data will be written.]]
-
-[[buffers][One or more data buffers to be written to the handle.]]
-
-]
-
-
-[heading Return Value]
-      
-The number of bytes written.
-
-
-[heading Exceptions]
-    
-
-[variablelist
-  
-[[asio::system_error][Thrown on failure. An error code of `asio::error::eof` indicates that the connection was closed by the peer.]]
-
-]
-
-
-[heading Remarks]
-      
-The write\_some\_at operation may not write all of the data. Consider using the [link asio.reference.write_at `write_at`]  function if you need to ensure that all data is written before the blocking operation completes.
-
-
-[heading Example]
-  
-To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 
-
-   handle.write_some_at(42, asio::buffer(data, size));
-
-
-See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 windows::basic_random_access_handle::write_some_at (2 of 2 overloads)]
-
-
-Write some data to the handle at the specified offset. 
-
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
-  std::size_t write_some_at(
-      uint64_t offset,
-      const ConstBufferSequence & buffers,
-      asio::error_code & ec);
-
-
-This function is used to write data to the random-access handle. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[offset][The offset at which the data will be written.]]
-
-[[buffers][One or more data buffers to be written to the handle.]]
-
-[[ec][Set to indicate what error occurred, if any.]]
-
-]
-
-
-[heading Return Value]
-      
-The number of bytes written. Returns 0 if an error occurred.
-
-
-[heading Remarks]
-      
-The write\_some operation may not transmit all of the data to the peer. Consider using the [link asio.reference.write_at `write_at`]  function if you need to ensure that all data is written before the blocking operation completes. 
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[endsect]
-
-[section:windows__basic_stream_handle windows::basic_stream_handle]
-
-
-Provides stream-oriented handle functionality. 
-
-
-  template<
-      typename ``[link asio.reference.StreamHandleService StreamHandleService]`` = stream_handle_service>
-  class basic_stream_handle :
-    public windows::basic_handle< StreamHandleService >
-
-
-[heading Types]
-[table
-  [[Name][Description]]
-
-  [
-
-    [[link asio.reference.windows__basic_stream_handle.executor_type [*executor_type]]]
-    [The type of the executor associated with the object. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.windows__basic_stream_handle.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.windows__basic_stream_handle.lowest_layer_type [*lowest_layer_type]]]
-    [A basic_handle is always the lowest layer. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.windows__basic_stream_handle.native_handle_type [*native_handle_type]]]
-    [The native representation of a handle. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.windows__basic_stream_handle.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-]
-
-[heading Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.windows__basic_stream_handle.assign [*assign]]]
-    [Assign an existing native handle to the handle. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_stream_handle.async_read_some [*async_read_some]]]
-    [Start an asynchronous read. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_stream_handle.async_write_some [*async_write_some]]]
-    [Start an asynchronous write. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_stream_handle.basic_stream_handle [*basic_stream_handle]]]
-    [Construct a basic_stream_handle without opening it. 
-
-     Construct a basic_stream_handle on an existing native handle. 
-
-     Move-construct a basic_stream_handle from another. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_stream_handle.cancel [*cancel]]]
-    [Cancel all asynchronous operations associated with the handle. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_stream_handle.close [*close]]]
-    [Close the handle. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_stream_handle.get_executor [*get_executor]]]
-    [Get the executor associated with the object. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_stream_handle.get_io_context [*get_io_context]]]
-    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_stream_handle.get_io_service [*get_io_service]]]
-    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_stream_handle.is_open [*is_open]]]
-    [Determine whether the handle is open. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_stream_handle.lowest_layer [*lowest_layer]]]
-    [Get a reference to the lowest layer. 
-
-     Get a const reference to the lowest layer. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_stream_handle.native_handle [*native_handle]]]
-    [Get the native handle representation. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_stream_handle.operator_eq_ [*operator=]]]
-    [Move-assign a basic_stream_handle from another. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_stream_handle.read_some [*read_some]]]
-    [Read some data from the handle. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_stream_handle.write_some [*write_some]]]
-    [Write some data to the handle. ]
-  ]
-  
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.windows__basic_stream_handle.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_stream_handle.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
-  ]
-  
-]
-
-The [link asio.reference.windows__basic_stream_handle `windows::basic_stream_handle`] class template provides asynchronous and blocking stream-oriented handle functionality.
-
-
-[heading Thread Safety]
-  
-['Distinct] ['objects:] Safe.
-
-['Shared] ['objects:] Unsafe.
-
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/windows/basic_stream_handle.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-[section:assign windows::basic_stream_handle::assign]
-
-[indexterm2 assign..windows::basic_stream_handle] 
-Assign an existing native handle to the handle. 
-
-
-  void ``[link asio.reference.windows__basic_stream_handle.assign.overload1 assign]``(
-      const native_handle_type & handle);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.assign.overload1 more...]]``
-
-  asio::error_code ``[link asio.reference.windows__basic_stream_handle.assign.overload2 assign]``(
-      const native_handle_type & handle,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.assign.overload2 more...]]``
-
-
-[section:overload1 windows::basic_stream_handle::assign (1 of 2 overloads)]
-
-
-['Inherited from windows::basic_handle.]
-
-
-Assign an existing native handle to the handle. 
-
-
-  void assign(
-      const native_handle_type & handle);
-
-
-
-[endsect]
-
-
-
-[section:overload2 windows::basic_stream_handle::assign (2 of 2 overloads)]
-
-
-['Inherited from windows::basic_handle.]
-
-
-Assign an existing native handle to the handle. 
-
-
-  asio::error_code assign(
-      const native_handle_type & handle,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:async_read_some windows::basic_stream_handle::async_read_some]
-
-[indexterm2 async_read_some..windows::basic_stream_handle] 
-Start an asynchronous read. 
-
-
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
-      typename ``[link asio.reference.ReadHandler ReadHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_some(
-      const MutableBufferSequence & buffers,
-      ReadHandler && handler);
-
-
-This function is used to asynchronously read data from the stream handle. The function call always returns immediately.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[buffers][One or more buffers into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]
-
-[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
-``
-   void handler(
-     const asio::error_code& error, // Result of operation.
-     std::size_t bytes_transferred           // Number of bytes read.
-   ); 
-``
-Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using `asio::io_context::post()`.]]
-
-]
-
-
-[heading Remarks]
-      
-The read operation may not read all of the requested number of bytes. Consider using the [link asio.reference.async_read `async_read`]  function if you need to ensure that the requested amount of data is read before the asynchronous operation completes.
-
-
-[heading Example]
-  
-To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 
-
-   handle.async_read_some(asio::buffer(data, size), handler);
-
-
-See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 
-
-
-
-
-[endsect]
-
-
-
-[section:async_write_some windows::basic_stream_handle::async_write_some]
-
-[indexterm2 async_write_some..windows::basic_stream_handle] 
-Start an asynchronous write. 
-
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
-      typename ``[link asio.reference.WriteHandler WriteHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_write_some(
-      const ConstBufferSequence & buffers,
-      WriteHandler && handler);
-
-
-This function is used to asynchronously write data to the stream handle. The function call always returns immediately.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[buffers][One or more data buffers to be written to the handle. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]
-
-[[handler][The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
-``
-   void handler(
-     const asio::error_code& error, // Result of operation.
-     std::size_t bytes_transferred           // Number of bytes written.
-   ); 
-``
-Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using `asio::io_context::post()`.]]
-
-]
-
-
-[heading Remarks]
-      
-The write operation may not transmit all of the data to the peer. Consider using the [link asio.reference.async_write `async_write`]  function if you need to ensure that all data is written before the asynchronous operation completes.
-
-
-[heading Example]
-  
-To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 
-
-   handle.async_write_some(asio::buffer(data, size), handler);
-
-
-See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 
-
-
-
-
-[endsect]
-
-
-[section:basic_stream_handle windows::basic_stream_handle::basic_stream_handle]
-
-[indexterm2 basic_stream_handle..windows::basic_stream_handle] 
-Construct a [link asio.reference.windows__basic_stream_handle `windows::basic_stream_handle`] without opening it. 
-
-
-  explicit ``[link asio.reference.windows__basic_stream_handle.basic_stream_handle.overload1 basic_stream_handle]``(
-      asio::io_context & io_context);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.basic_stream_handle.overload1 more...]]``
-
-
-Construct a [link asio.reference.windows__basic_stream_handle `windows::basic_stream_handle`] on an existing native handle. 
-
-
-  ``[link asio.reference.windows__basic_stream_handle.basic_stream_handle.overload2 basic_stream_handle]``(
-      asio::io_context & io_context,
-      const native_handle_type & handle);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.basic_stream_handle.overload2 more...]]``
-
-
-Move-construct a [link asio.reference.windows__basic_stream_handle `windows::basic_stream_handle`] from another. 
-
-
-  ``[link asio.reference.windows__basic_stream_handle.basic_stream_handle.overload3 basic_stream_handle]``(
-      basic_stream_handle && other);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.basic_stream_handle.overload3 more...]]``
-
-
-[section:overload1 windows::basic_stream_handle::basic_stream_handle (1 of 3 overloads)]
-
-
-Construct a [link asio.reference.windows__basic_stream_handle `windows::basic_stream_handle`] without opening it. 
-
-
-  basic_stream_handle(
-      asio::io_context & io_context);
-
-
-This constructor creates a stream handle without opening it. The handle needs to be opened and then connected or accepted before data can be sent or received on it.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[io_context][The [link asio.reference.io_context `io_context`] object that the stream handle will use to dispatch handlers for any asynchronous operations performed on the handle. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 windows::basic_stream_handle::basic_stream_handle (2 of 3 overloads)]
-
-
-Construct a [link asio.reference.windows__basic_stream_handle `windows::basic_stream_handle`] on an existing native handle. 
-
-
-  basic_stream_handle(
-      asio::io_context & io_context,
-      const native_handle_type & handle);
-
-
-This constructor creates a stream handle object to hold an existing native handle.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[io_context][The [link asio.reference.io_context `io_context`] object that the stream handle will use to dispatch handlers for any asynchronous operations performed on the handle.]]
-
-[[handle][The new underlying handle implementation.]]
-
-]
-
-
-[heading Exceptions]
-    
-
-[variablelist
-  
-[[asio::system_error][Thrown on failure. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-
-[section:overload3 windows::basic_stream_handle::basic_stream_handle (3 of 3 overloads)]
-
-
-Move-construct a [link asio.reference.windows__basic_stream_handle `windows::basic_stream_handle`] from another. 
-
-
-  basic_stream_handle(
-      basic_stream_handle && other);
-
-
-This constructor moves a stream handle from one object to another.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[other][The other [link asio.reference.windows__basic_stream_handle `windows::basic_stream_handle`] object from which the move will occur.]]
-
-]
-
-
-[heading Remarks]
-      
-Following the move, the moved-from object is in the same state as if constructed using the `basic_stream_handle(io_context&) constructor`. 
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-[section:cancel windows::basic_stream_handle::cancel]
-
-[indexterm2 cancel..windows::basic_stream_handle] 
-Cancel all asynchronous operations associated with the handle. 
-
-
-  void ``[link asio.reference.windows__basic_stream_handle.cancel.overload1 cancel]``();
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.cancel.overload1 more...]]``
-
-  asio::error_code ``[link asio.reference.windows__basic_stream_handle.cancel.overload2 cancel]``(
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.cancel.overload2 more...]]``
-
-
-[section:overload1 windows::basic_stream_handle::cancel (1 of 2 overloads)]
-
-
-['Inherited from windows::basic_handle.]
-
-
-Cancel all asynchronous operations associated with the handle. 
-
-
-  void cancel();
-
-
-This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.
-
-
-[heading Exceptions]
-    
-
-[variablelist
-  
-[[asio::system_error][Thrown on failure. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 windows::basic_stream_handle::cancel (2 of 2 overloads)]
-
-
-['Inherited from windows::basic_handle.]
-
-
-Cancel all asynchronous operations associated with the handle. 
-
-
-  asio::error_code cancel(
-      asio::error_code & ec);
-
-
-This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[ec][Set to indicate what error occurred, if any. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-[section:close windows::basic_stream_handle::close]
-
-[indexterm2 close..windows::basic_stream_handle] 
-Close the handle. 
-
-
-  void ``[link asio.reference.windows__basic_stream_handle.close.overload1 close]``();
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.close.overload1 more...]]``
-
-  asio::error_code ``[link asio.reference.windows__basic_stream_handle.close.overload2 close]``(
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.close.overload2 more...]]``
-
-
-[section:overload1 windows::basic_stream_handle::close (1 of 2 overloads)]
-
-
-['Inherited from windows::basic_handle.]
-
-
-Close the handle. 
-
-
-  void close();
-
-
-This function is used to close the handle. Any asynchronous read or write operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.
-
-
-[heading Exceptions]
-    
-
-[variablelist
-  
-[[asio::system_error][Thrown on failure. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 windows::basic_stream_handle::close (2 of 2 overloads)]
-
-
-['Inherited from windows::basic_handle.]
-
-
-Close the handle. 
-
-
-  asio::error_code close(
-      asio::error_code & ec);
-
-
-This function is used to close the handle. Any asynchronous read or write operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[ec][Set to indicate what error occurred, if any. ]]
-
-]
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:executor_type windows::basic_stream_handle::executor_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 executor_type..windows::basic_stream_handle] 
-The type of the executor associated with the object. 
-
-
-  typedef asio::io_context::executor_type executor_type;
-
-
-[heading Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.io_context__executor_type.context [*context]]]
-    [Obtain the underlying execution context. ]
-  ]
-  
-  [
-    [[link asio.reference.io_context__executor_type.defer [*defer]]]
-    [Request the io_context to invoke the given function object. ]
-  ]
-  
-  [
-    [[link asio.reference.io_context__executor_type.dispatch [*dispatch]]]
-    [Request the io_context to invoke the given function object. ]
-  ]
-  
-  [
-    [[link asio.reference.io_context__executor_type.on_work_finished [*on_work_finished]]]
-    [Inform the io_context that some work is no longer outstanding. ]
-  ]
-  
-  [
-    [[link asio.reference.io_context__executor_type.on_work_started [*on_work_started]]]
-    [Inform the io_context that it has some outstanding work to do. ]
-  ]
-  
-  [
-    [[link asio.reference.io_context__executor_type.post [*post]]]
-    [Request the io_context to invoke the given function object. ]
-  ]
-  
-  [
-    [[link asio.reference.io_context__executor_type.running_in_this_thread [*running_in_this_thread]]]
-    [Determine whether the io_context is running in the current thread. ]
-  ]
-  
-]
-
-[heading Friends]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.io_context__executor_type.operator_not__eq_ [*operator!=]]]
-    [Compare two executors for inequality. ]
-  ]
-  
-  [
-    [[link asio.reference.io_context__executor_type.operator_eq__eq_ [*operator==]]]
-    [Compare two executors for equality. ]
-  ]
-  
-]
-
-
-[heading Requirements]
-
-['Header: ][^asio/windows/basic_stream_handle.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:get_executor windows::basic_stream_handle::get_executor]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 get_executor..windows::basic_stream_handle] 
-Get the executor associated with the object. 
-
-
-  executor_type get_executor();
-
-
-
-[endsect]
-
-
-[section:get_implementation windows::basic_stream_handle::get_implementation]
-
-[indexterm2 get_implementation..windows::basic_stream_handle] 
-Get the underlying implementation of the I/O object. 
-
-
-  implementation_type & ``[link asio.reference.windows__basic_stream_handle.get_implementation.overload1 get_implementation]``();
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.get_implementation.overload1 more...]]``
-
-  const implementation_type & ``[link asio.reference.windows__basic_stream_handle.get_implementation.overload2 get_implementation]``() const;
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.get_implementation.overload2 more...]]``
-
-
-[section:overload1 windows::basic_stream_handle::get_implementation (1 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the underlying implementation of the I/O object. 
-
-
-  implementation_type & get_implementation();
-
-
-
-[endsect]
-
-
-
-[section:overload2 windows::basic_stream_handle::get_implementation (2 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the underlying implementation of the I/O object. 
-
-
-  const implementation_type & get_implementation() const;
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:get_io_context windows::basic_stream_handle::get_io_context]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 get_io_context..windows::basic_stream_handle] 
-(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
-
-
-  asio::io_context & get_io_context();
-
-
-This function may be used to obtain the [link asio.reference.io_context `io_context`] object that the I/O object uses to dispatch handlers for asynchronous operations.
-
-
-[heading Return Value]
-      
-A reference to the [link asio.reference.io_context `io_context`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 
-
-
-
-
-[endsect]
-
-
-
-[section:get_io_service windows::basic_stream_handle::get_io_service]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 get_io_service..windows::basic_stream_handle] 
-(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
-
-
-  asio::io_context & get_io_service();
-
-
-This function may be used to obtain the [link asio.reference.io_context `io_context`] object that the I/O object uses to dispatch handlers for asynchronous operations.
-
-
-[heading Return Value]
-      
-A reference to the [link asio.reference.io_context `io_context`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 
-
-
-
-
-[endsect]
-
-
-[section:get_service windows::basic_stream_handle::get_service]
-
-[indexterm2 get_service..windows::basic_stream_handle] 
-Get the service associated with the I/O object. 
-
-
-  service_type & ``[link asio.reference.windows__basic_stream_handle.get_service.overload1 get_service]``();
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.get_service.overload1 more...]]``
-
-  const service_type & ``[link asio.reference.windows__basic_stream_handle.get_service.overload2 get_service]``() const;
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.get_service.overload2 more...]]``
-
-
-[section:overload1 windows::basic_stream_handle::get_service (1 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the service associated with the I/O object. 
-
-
-  service_type & get_service();
-
-
-
-[endsect]
-
-
-
-[section:overload2 windows::basic_stream_handle::get_service (2 of 2 overloads)]
-
-
-['Inherited from basic_io_object.]
-
-
-Get the service associated with the I/O object. 
-
-
-  const service_type & get_service() const;
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:implementation_type windows::basic_stream_handle::implementation_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 implementation_type..windows::basic_stream_handle] 
-The underlying implementation type of I/O object. 
-
-
-  typedef service_type::implementation_type implementation_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/windows/basic_stream_handle.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:is_open windows::basic_stream_handle::is_open]
-
-
-['Inherited from windows::basic_handle.]
-
-[indexterm2 is_open..windows::basic_stream_handle] 
-Determine whether the handle is open. 
-
-
-  bool is_open() const;
-
-
-
-[endsect]
-
-
-[section:lowest_layer windows::basic_stream_handle::lowest_layer]
-
-[indexterm2 lowest_layer..windows::basic_stream_handle] 
-Get a reference to the lowest layer. 
-
-
-  lowest_layer_type & ``[link asio.reference.windows__basic_stream_handle.lowest_layer.overload1 lowest_layer]``();
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.lowest_layer.overload1 more...]]``
-
-
-Get a const reference to the lowest layer. 
-
-
-  const lowest_layer_type & ``[link asio.reference.windows__basic_stream_handle.lowest_layer.overload2 lowest_layer]``() const;
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.lowest_layer.overload2 more...]]``
-
-
-[section:overload1 windows::basic_stream_handle::lowest_layer (1 of 2 overloads)]
-
-
-['Inherited from windows::basic_handle.]
-
-
-Get a reference to the lowest layer. 
-
-
-  lowest_layer_type & lowest_layer();
-
-
-This function returns a reference to the lowest layer in a stack of layers. Since a [link asio.reference.windows__basic_handle `windows::basic_handle`] cannot contain any further layers, it simply returns a reference to itself.
-
-
-[heading Return Value]
-      
-A reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 windows::basic_stream_handle::lowest_layer (2 of 2 overloads)]
-
-
-['Inherited from windows::basic_handle.]
-
-
-Get a const reference to the lowest layer. 
-
-
-  const lowest_layer_type & lowest_layer() const;
-
-
-This function returns a const reference to the lowest layer in a stack of layers. Since a [link asio.reference.windows__basic_handle `windows::basic_handle`] cannot contain any further layers, it simply returns a reference to itself.
-
-
-[heading Return Value]
-      
-A const reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:lowest_layer_type windows::basic_stream_handle::lowest_layer_type]
-
-
-['Inherited from windows::basic_handle.]
-
-[indexterm2 lowest_layer_type..windows::basic_stream_handle] 
-A [link asio.reference.windows__basic_handle `windows::basic_handle`] is always the lowest layer. 
-
-
-  typedef basic_handle< StreamHandleService > lowest_layer_type;
-
-
-[heading Types]
-[table
-  [[Name][Description]]
-
-  [
-
-    [[link asio.reference.windows__basic_handle.executor_type [*executor_type]]]
-    [The type of the executor associated with the object. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.windows__basic_handle.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.windows__basic_handle.lowest_layer_type [*lowest_layer_type]]]
-    [A basic_handle is always the lowest layer. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.windows__basic_handle.native_handle_type [*native_handle_type]]]
-    [The native representation of a handle. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.windows__basic_handle.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-]
-
-[heading Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.windows__basic_handle.assign [*assign]]]
-    [Assign an existing native handle to the handle. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_handle.basic_handle [*basic_handle]]]
-    [Construct a basic_handle without opening it. 
-
-     Construct a basic_handle on an existing native handle. 
-
-     Move-construct a basic_handle from another. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_handle.cancel [*cancel]]]
-    [Cancel all asynchronous operations associated with the handle. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_handle.close [*close]]]
-    [Close the handle. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_handle.get_executor [*get_executor]]]
-    [Get the executor associated with the object. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_handle.get_io_context [*get_io_context]]]
-    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_handle.get_io_service [*get_io_service]]]
-    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_handle.is_open [*is_open]]]
-    [Determine whether the handle is open. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_handle.lowest_layer [*lowest_layer]]]
-    [Get a reference to the lowest layer. 
-
-     Get a const reference to the lowest layer. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_handle.native_handle [*native_handle]]]
-    [Get the native handle representation. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_handle.operator_eq_ [*operator=]]]
-    [Move-assign a basic_handle from another. ]
-  ]
-  
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.windows__basic_handle.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_handle.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_handle._basic_handle [*~basic_handle]]]
-    [Protected destructor to prevent deletion through this type. ]
-  ]
-  
-]
-
-The [link asio.reference.windows__basic_handle `windows::basic_handle`] class template provides the ability to wrap a Windows handle.
-
-
-[heading Thread Safety]
-  
-['Distinct] ['objects:] Safe.
-
-['Shared] ['objects:] Unsafe. 
-
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/windows/basic_stream_handle.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:native_handle windows::basic_stream_handle::native_handle]
-
-
-['Inherited from windows::basic_handle.]
-
-[indexterm2 native_handle..windows::basic_stream_handle] 
-Get the native handle representation. 
-
-
-  native_handle_type native_handle();
-
-
-This function may be used to obtain the underlying representation of the handle. This is intended to allow access to native handle functionality that is not otherwise provided. 
-
-
-[endsect]
-
-
-
-[section:native_handle_type windows::basic_stream_handle::native_handle_type]
-
-[indexterm2 native_handle_type..windows::basic_stream_handle] 
-The native representation of a handle. 
-
-
-  typedef StreamHandleService::native_handle_type native_handle_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/windows/basic_stream_handle.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:operator_eq_ windows::basic_stream_handle::operator=]
-
-[indexterm2 operator=..windows::basic_stream_handle] 
-Move-assign a [link asio.reference.windows__basic_stream_handle `windows::basic_stream_handle`] from another. 
-
-
-  basic_stream_handle & operator=(
-      basic_stream_handle && other);
-
-
-This assignment operator moves a stream handle from one object to another.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[other][The other [link asio.reference.windows__basic_stream_handle `windows::basic_stream_handle`] object from which the move will occur.]]
-
-]
-
-
-[heading Remarks]
-      
-Following the move, the moved-from object is in the same state as if constructed using the `basic_stream_handle(io_context&) constructor`. 
-
-
-
-
-[endsect]
-
-
-[section:read_some windows::basic_stream_handle::read_some]
-
-[indexterm2 read_some..windows::basic_stream_handle] 
-Read some data from the handle. 
-
-
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
-  std::size_t ``[link asio.reference.windows__basic_stream_handle.read_some.overload1 read_some]``(
-      const MutableBufferSequence & buffers);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.read_some.overload1 more...]]``
-
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
-  std::size_t ``[link asio.reference.windows__basic_stream_handle.read_some.overload2 read_some]``(
-      const MutableBufferSequence & buffers,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.read_some.overload2 more...]]``
-
-
-[section:overload1 windows::basic_stream_handle::read_some (1 of 2 overloads)]
-
-
-Read some data from the handle. 
-
-
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
-  std::size_t read_some(
-      const MutableBufferSequence & buffers);
-
-
-This function is used to read data from the stream handle. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[buffers][One or more buffers into which the data will be read.]]
-
-]
-
-
-[heading Return Value]
-      
-The number of bytes read.
-
-
-[heading Exceptions]
-    
-
-[variablelist
-  
-[[asio::system_error][Thrown on failure. An error code of `asio::error::eof` indicates that the connection was closed by the peer.]]
-
-]
-
-
-[heading Remarks]
-      
-The read\_some operation may not read all of the requested number of bytes. Consider using the [link asio.reference.read `read`]  function if you need to ensure that the requested amount of data is read before the blocking operation completes.
-
-
-[heading Example]
-  
-To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 
-
-   handle.read_some(asio::buffer(data, size));
-
-
-See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 windows::basic_stream_handle::read_some (2 of 2 overloads)]
-
-
-Read some data from the handle. 
-
-
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
-  std::size_t read_some(
-      const MutableBufferSequence & buffers,
-      asio::error_code & ec);
-
-
-This function is used to read data from the stream handle. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[buffers][One or more buffers into which the data will be read.]]
-
-[[ec][Set to indicate what error occurred, if any.]]
-
-]
-
-
-[heading Return Value]
-      
-The number of bytes read. Returns 0 if an error occurred.
-
-
-[heading Remarks]
-      
-The read\_some operation may not read all of the requested number of bytes. Consider using the [link asio.reference.read `read`]  function if you need to ensure that the requested amount of data is read before the blocking operation completes. 
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:service_type windows::basic_stream_handle::service_type]
-
-
-['Inherited from basic_io_object.]
-
-[indexterm2 service_type..windows::basic_stream_handle] 
-The type of the service that will be used to provide I/O operations. 
-
-
-  typedef StreamHandleService service_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/windows/basic_stream_handle.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-[section:write_some windows::basic_stream_handle::write_some]
-
-[indexterm2 write_some..windows::basic_stream_handle] 
-Write some data to the handle. 
-
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
-  std::size_t ``[link asio.reference.windows__basic_stream_handle.write_some.overload1 write_some]``(
-      const ConstBufferSequence & buffers);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.write_some.overload1 more...]]``
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
-  std::size_t ``[link asio.reference.windows__basic_stream_handle.write_some.overload2 write_some]``(
-      const ConstBufferSequence & buffers,
-      asio::error_code & ec);
-  ``  [''''&raquo;''' [link asio.reference.windows__basic_stream_handle.write_some.overload2 more...]]``
-
-
-[section:overload1 windows::basic_stream_handle::write_some (1 of 2 overloads)]
-
-
-Write some data to the handle. 
-
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
-  std::size_t write_some(
-      const ConstBufferSequence & buffers);
-
-
-This function is used to write data to the stream handle. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[buffers][One or more data buffers to be written to the handle.]]
-
-]
-
-
-[heading Return Value]
-      
-The number of bytes written.
-
-
-[heading Exceptions]
-    
-
-[variablelist
-  
-[[asio::system_error][Thrown on failure. An error code of `asio::error::eof` indicates that the connection was closed by the peer.]]
-
-]
-
-
-[heading Remarks]
-      
-The write\_some operation may not transmit all of the data to the peer. Consider using the [link asio.reference.write `write`]  function if you need to ensure that all data is written before the blocking operation completes.
-
-
-[heading Example]
-  
-To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 
-
-   handle.write_some(asio::buffer(data, size));
-
-
-See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 
-
-
-
-
-[endsect]
-
-
-
-[section:overload2 windows::basic_stream_handle::write_some (2 of 2 overloads)]
-
-
-Write some data to the handle. 
-
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
-  std::size_t write_some(
-      const ConstBufferSequence & buffers,
-      asio::error_code & ec);
-
-
-This function is used to write data to the stream handle. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.
-
-
-[heading Parameters]
-    
-
-[variablelist
-  
-[[buffers][One or more data buffers to be written to the handle.]]
-
-[[ec][Set to indicate what error occurred, if any.]]
-
-]
-
-
-[heading Return Value]
-      
-The number of bytes written. Returns 0 if an error occurred.
-
-
-[heading Remarks]
-      
-The write\_some operation may not transmit all of the data to the peer. Consider using the [link asio.reference.write `write`]  function if you need to ensure that all data is written before the blocking operation completes. 
-
-
-
-
-[endsect]
-
-
-[endsect]
-
-
-[endsect]
-
-
-[section:windows__object_handle windows::object_handle]
-
-[indexterm1 windows::object_handle] 
-Typedef for the typical usage of an object handle. 
-
-
-  typedef basic_object_handle object_handle;
-
-
-[heading Types]
-[table
-  [[Name][Description]]
-
-  [
-
-    [[link asio.reference.windows__basic_object_handle.executor_type [*executor_type]]]
-    [The type of the executor associated with the object. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.windows__basic_object_handle.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.windows__basic_object_handle.lowest_layer_type [*lowest_layer_type]]]
-    [A basic_handle is always the lowest layer. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.windows__basic_object_handle.native_handle_type [*native_handle_type]]]
-    [The native representation of a handle. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.windows__basic_object_handle.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
-]
-
-[heading Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.windows__basic_object_handle.assign [*assign]]]
-    [Assign an existing native handle to the handle. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_object_handle.async_wait [*async_wait]]]
-    [Start an asynchronous wait on the object handle. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_object_handle.basic_object_handle [*basic_object_handle]]]
-    [Construct a basic_object_handle without opening it. 
-
-     Construct a basic_object_handle on an existing native handle. 
-
-     Move-construct a basic_object_handle from another. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_object_handle.cancel [*cancel]]]
-    [Cancel all asynchronous operations associated with the handle. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_object_handle.close [*close]]]
-    [Close the handle. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_object_handle.get_executor [*get_executor]]]
-    [Get the executor associated with the object. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_object_handle.get_io_context [*get_io_context]]]
-    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_object_handle.get_io_service [*get_io_service]]]
-    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_object_handle.is_open [*is_open]]]
-    [Determine whether the handle is open. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_object_handle.lowest_layer [*lowest_layer]]]
-    [Get a reference to the lowest layer. 
-
-     Get a const reference to the lowest layer. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_object_handle.native_handle [*native_handle]]]
-    [Get the native handle representation. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_object_handle.operator_eq_ [*operator=]]]
-    [Move-assign a basic_object_handle from another. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_object_handle.wait [*wait]]]
-    [Perform a blocking wait on the object handle. ]
-  ]
-  
-]
-
-[heading Protected Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.windows__basic_object_handle.get_implementation [*get_implementation]]]
-    [Get the underlying implementation of the I/O object. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_object_handle.get_service [*get_service]]]
-    [Get the service associated with the I/O object. ]
-  ]
-  
-]
-
-The [link asio.reference.windows__basic_object_handle `windows::basic_object_handle`] class template provides asynchronous and blocking object-oriented handle functionality.
-
-
-[heading Thread Safety]
-  
-['Distinct] ['objects:] Safe.
-
-['Shared] ['objects:] Unsafe. 
-
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/windows/object_handle.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-[section:windows__object_handle_service windows::object_handle_service]
-
-
-Default service implementation for an object handle. 
-
-
-  class object_handle_service :
-    public io_context::service
-
-
-[heading Types]
-[table
-  [[Name][Description]]
-
-  [
-
-    [[link asio.reference.windows__object_handle_service.implementation_type [*implementation_type]]]
-    [The type of an object handle implementation. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.windows__object_handle_service.native_handle_type [*native_handle_type]]]
-    [The native handle type. ]
-  
-  ]
-
-]
-
-[heading Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.windows__object_handle_service.assign [*assign]]]
-    [Assign an existing native handle to an object handle. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__object_handle_service.async_wait [*async_wait]]]
-    [Start an asynchronous wait. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__object_handle_service.cancel [*cancel]]]
-    [Cancel all asynchronous operations associated with the handle. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__object_handle_service.close [*close]]]
-    [Close an object handle implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__object_handle_service.construct [*construct]]]
-    [Construct a new object handle implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__object_handle_service.destroy [*destroy]]]
-    [Destroy an object handle implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__object_handle_service.get_io_context [*get_io_context]]]
-    [Get the io_context object that owns the service. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__object_handle_service.get_io_service [*get_io_service]]]
-    [Get the io_context object that owns the service. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__object_handle_service.is_open [*is_open]]]
-    [Determine whether the handle is open. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__object_handle_service.move_assign [*move_assign]]]
-    [Move-assign from another object handle implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__object_handle_service.move_construct [*move_construct]]]
-    [Move-construct a new object handle implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__object_handle_service.native_handle [*native_handle]]]
-    [Get the native handle implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__object_handle_service.object_handle_service [*object_handle_service]]]
-    [Construct a new object handle service for the specified io_context. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__object_handle_service.wait [*wait]]]
-    []
-  ]
-  
-]
-
-[heading Data Members]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.windows__object_handle_service.id [*id]]]
-    [The unique service identifier. ]
-  ]
-
-]
-
-[heading Requirements]
-
-['Header: ][^asio/windows/object_handle_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[section:assign windows::object_handle_service::assign]
-
-[indexterm2 assign..windows::object_handle_service] 
-Assign an existing native handle to an object handle. 
-
-
-  asio::error_code assign(
-      implementation_type & impl,
-      const native_handle_type & handle,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:async_wait windows::object_handle_service::async_wait]
-
-[indexterm2 async_wait..windows::object_handle_service] 
-Start an asynchronous wait. 
-
-
-  template<
-      typename ``[link asio.reference.WaitHandler WaitHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_wait(
-      implementation_type & impl,
-      WaitHandler && handler);
-
-
-
-[endsect]
-
-
-
-[section:cancel windows::object_handle_service::cancel]
-
-[indexterm2 cancel..windows::object_handle_service] 
-Cancel all asynchronous operations associated with the handle. 
-
-
-  asio::error_code cancel(
-      implementation_type & impl,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:close windows::object_handle_service::close]
-
-[indexterm2 close..windows::object_handle_service] 
-Close an object handle implementation. 
-
-
-  asio::error_code close(
-      implementation_type & impl,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:construct windows::object_handle_service::construct]
-
-[indexterm2 construct..windows::object_handle_service] 
-Construct a new object handle implementation. 
-
-
-  void construct(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:destroy windows::object_handle_service::destroy]
-
-[indexterm2 destroy..windows::object_handle_service] 
-Destroy an object handle implementation. 
-
-
-  void destroy(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:get_io_context windows::object_handle_service::get_io_context]
-
-
-['Inherited from io_context.]
-
-[indexterm2 get_io_context..windows::object_handle_service] 
-Get the [link asio.reference.io_context `io_context`] object that owns the service. 
-
-
-  asio::io_context & get_io_context();
-
-
-
-[endsect]
-
-
-
-[section:get_io_service windows::object_handle_service::get_io_service]
-
-
-['Inherited from io_context.]
-
-[indexterm2 get_io_service..windows::object_handle_service] 
-Get the [link asio.reference.io_context `io_context`] object that owns the service. 
-
-
-  asio::io_context & get_io_service();
-
-
-
-[endsect]
-
-
-
-[section:id windows::object_handle_service::id]
-
-[indexterm2 id..windows::object_handle_service] 
-The unique service identifier. 
-
-
-  static asio::io_context::id id;
-
-
-
-[endsect]
-
-
-
-[section:implementation_type windows::object_handle_service::implementation_type]
-
-[indexterm2 implementation_type..windows::object_handle_service] 
-The type of an object handle implementation. 
-
-
-  typedef implementation_defined implementation_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/windows/object_handle_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:is_open windows::object_handle_service::is_open]
-
-[indexterm2 is_open..windows::object_handle_service] 
-Determine whether the handle is open. 
-
-
-  bool is_open(
-      const implementation_type & impl) const;
-
-
-
-[endsect]
-
-
-
-[section:move_assign windows::object_handle_service::move_assign]
-
-[indexterm2 move_assign..windows::object_handle_service] 
-Move-assign from another object handle implementation. 
-
-
-  void move_assign(
-      implementation_type & impl,
-      object_handle_service & other_service,
-      implementation_type & other_impl);
-
-
-
-[endsect]
-
-
-
-[section:move_construct windows::object_handle_service::move_construct]
-
-[indexterm2 move_construct..windows::object_handle_service] 
-Move-construct a new object handle implementation. 
-
-
-  void move_construct(
-      implementation_type & impl,
-      implementation_type & other_impl);
-
-
-
-[endsect]
-
-
-
-[section:native_handle windows::object_handle_service::native_handle]
-
-[indexterm2 native_handle..windows::object_handle_service] 
-Get the native handle implementation. 
-
-
-  native_handle_type native_handle(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:native_handle_type windows::object_handle_service::native_handle_type]
-
-[indexterm2 native_handle_type..windows::object_handle_service] 
-The native handle type. 
-
-
   typedef implementation_defined native_handle_type;
 
 
 
 [heading Requirements]
 
-['Header: ][^asio/windows/object_handle_service.hpp]
+['Header: ][^asio/windows/overlapped_handle.hpp]
 
 ['Convenience header: ][^asio.hpp]
 
@@ -128666,14 +113461,89 @@
 
 
 
-[section:object_handle_service windows::object_handle_service::object_handle_service]
+[section:operator_eq_ windows::overlapped_handle::operator=]
 
-[indexterm2 object_handle_service..windows::object_handle_service] 
-Construct a new object handle service for the specified [link asio.reference.io_context `io_context`]. 
+[indexterm2 operator=..windows::overlapped_handle] 
+Move-assign an [link asio.reference.windows__overlapped_handle `windows::overlapped_handle`] from another. 
 
 
-  object_handle_service(
+  overlapped_handle & operator=(
+      overlapped_handle && other);
+
+
+This assignment operator moves a handle from one object to another.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[other][The other [link asio.reference.windows__overlapped_handle `windows::overlapped_handle`] object from which the move will occur.]]
+
+]
+
+
+[heading Remarks]
+      
+Following the move, the moved-from object is in the same state as if constructed using the `overlapped_handle(io_context&) constructor`. 
+
+
+
+
+[endsect]
+
+
+[section:overlapped_handle windows::overlapped_handle::overlapped_handle]
+
+[indexterm2 overlapped_handle..windows::overlapped_handle] 
+Construct an [link asio.reference.windows__overlapped_handle `windows::overlapped_handle`] without opening it. 
+
+
+  explicit ``[link asio.reference.windows__overlapped_handle.overlapped_handle.overload1 overlapped_handle]``(
       asio::io_context & io_context);
+  ``  [''''&raquo;''' [link asio.reference.windows__overlapped_handle.overlapped_handle.overload1 more...]]``
+
+
+Construct an [link asio.reference.windows__overlapped_handle `windows::overlapped_handle`] on an existing native handle. 
+
+
+  ``[link asio.reference.windows__overlapped_handle.overlapped_handle.overload2 overlapped_handle]``(
+      asio::io_context & io_context,
+      const native_handle_type & handle);
+  ``  [''''&raquo;''' [link asio.reference.windows__overlapped_handle.overlapped_handle.overload2 more...]]``
+
+
+Move-construct an [link asio.reference.windows__overlapped_handle `windows::overlapped_handle`] from another. 
+
+
+  ``[link asio.reference.windows__overlapped_handle.overlapped_handle.overload3 overlapped_handle]``(
+      overlapped_handle && other);
+  ``  [''''&raquo;''' [link asio.reference.windows__overlapped_handle.overlapped_handle.overload3 more...]]``
+
+
+[section:overload1 windows::overlapped_handle::overlapped_handle (1 of 3 overloads)]
+
+
+Construct an [link asio.reference.windows__overlapped_handle `windows::overlapped_handle`] without opening it. 
+
+
+  overlapped_handle(
+      asio::io_context & io_context);
+
+
+This constructor creates a handle without opening it.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[io_context][The [link asio.reference.io_context `io_context`] object that the handle will use to dispatch handlers for any asynchronous operations performed on the handle. ]]
+
+]
+
 
 
 
@@ -128681,15 +113551,95 @@
 
 
 
-[section:wait windows::object_handle_service::wait]
+[section:overload2 windows::overlapped_handle::overlapped_handle (2 of 3 overloads)]
 
-[indexterm2 wait..windows::object_handle_service] 
 
-  void wait(
-      implementation_type & impl,
-      asio::error_code & ec);
+Construct an [link asio.reference.windows__overlapped_handle `windows::overlapped_handle`] on an existing native handle. 
 
 
+  overlapped_handle(
+      asio::io_context & io_context,
+      const native_handle_type & handle);
+
+
+This constructor creates a handle object to hold an existing native handle.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[io_context][The [link asio.reference.io_context `io_context`] object that the handle will use to dispatch handlers for any asynchronous operations performed on the handle.]]
+
+[[handle][A native handle.]]
+
+]
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[asio::system_error][Thrown on failure. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+
+[section:overload3 windows::overlapped_handle::overlapped_handle (3 of 3 overloads)]
+
+
+Move-construct an [link asio.reference.windows__overlapped_handle `windows::overlapped_handle`] from another. 
+
+
+  overlapped_handle(
+      overlapped_handle && other);
+
+
+This constructor moves a handle from one object to another.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[other][The other [link asio.reference.windows__overlapped_handle `windows::overlapped_handle`] object from which the move will occur.]]
+
+]
+
+
+[heading Remarks]
+      
+Following the move, the moved-from object is in the same state as if constructed using the `overlapped_handle(io_context&) constructor`. 
+
+
+
+
+[endsect]
+
+
+[endsect]
+
+
+[section:_overlapped_handle windows::overlapped_handle::~overlapped_handle]
+
+[indexterm2 ~overlapped_handle..windows::overlapped_handle] 
+Protected destructor to prevent deletion through this type. 
+
+
+  ~overlapped_handle();
+
+
+This function destroys the handle, cancelling any outstanding asynchronous wait operations associated with the handle as if by calling `cancel`. 
+
 
 [endsect]
 
@@ -128961,14 +113911,14 @@
 
 [endsect]
 
-
 [section:windows__random_access_handle windows::random_access_handle]
 
-[indexterm1 windows::random_access_handle] 
-Typedef for the typical usage of a random-access handle. 
+
+Provides random-access handle functionality. 
 
 
-  typedef basic_random_access_handle random_access_handle;
+  class random_access_handle :
+    public windows::overlapped_handle
 
 
 [heading Types]
@@ -128977,39 +113927,25 @@
 
   [
 
-    [[link asio.reference.windows__basic_random_access_handle.executor_type [*executor_type]]]
+    [[link asio.reference.windows__random_access_handle.executor_type [*executor_type]]]
     [The type of the executor associated with the object. ]
   
   ]
 
   [
 
-    [[link asio.reference.windows__basic_random_access_handle.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
+    [[link asio.reference.windows__random_access_handle.lowest_layer_type [*lowest_layer_type]]]
+    [An overlapped_handle is always the lowest layer. ]
   
   ]
 
   [
 
-    [[link asio.reference.windows__basic_random_access_handle.lowest_layer_type [*lowest_layer_type]]]
-    [A basic_handle is always the lowest layer. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.windows__basic_random_access_handle.native_handle_type [*native_handle_type]]]
+    [[link asio.reference.windows__random_access_handle.native_handle_type [*native_handle_type]]]
     [The native representation of a handle. ]
   
   ]
 
-  [
-
-    [[link asio.reference.windows__basic_random_access_handle.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
 ]
 
 [heading Member Functions]
@@ -129017,83 +113953,83 @@
   [[Name][Description]]
 
   [
-    [[link asio.reference.windows__basic_random_access_handle.assign [*assign]]]
+    [[link asio.reference.windows__random_access_handle.assign [*assign]]]
     [Assign an existing native handle to the handle. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_random_access_handle.async_read_some_at [*async_read_some_at]]]
+    [[link asio.reference.windows__random_access_handle.async_read_some_at [*async_read_some_at]]]
     [Start an asynchronous read at the specified offset. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_random_access_handle.async_write_some_at [*async_write_some_at]]]
+    [[link asio.reference.windows__random_access_handle.async_write_some_at [*async_write_some_at]]]
     [Start an asynchronous write at the specified offset. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_random_access_handle.basic_random_access_handle [*basic_random_access_handle]]]
-    [Construct a basic_random_access_handle without opening it. 
-
-     Construct a basic_random_access_handle on an existing native handle. 
-
-     Move-construct a basic_random_access_handle from another. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_random_access_handle.cancel [*cancel]]]
+    [[link asio.reference.windows__random_access_handle.cancel [*cancel]]]
     [Cancel all asynchronous operations associated with the handle. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_random_access_handle.close [*close]]]
+    [[link asio.reference.windows__random_access_handle.close [*close]]]
     [Close the handle. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_random_access_handle.get_executor [*get_executor]]]
+    [[link asio.reference.windows__random_access_handle.get_executor [*get_executor]]]
     [Get the executor associated with the object. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_random_access_handle.get_io_context [*get_io_context]]]
+    [[link asio.reference.windows__random_access_handle.get_io_context [*get_io_context]]]
     [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_random_access_handle.get_io_service [*get_io_service]]]
+    [[link asio.reference.windows__random_access_handle.get_io_service [*get_io_service]]]
     [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_random_access_handle.is_open [*is_open]]]
+    [[link asio.reference.windows__random_access_handle.is_open [*is_open]]]
     [Determine whether the handle is open. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_random_access_handle.lowest_layer [*lowest_layer]]]
+    [[link asio.reference.windows__random_access_handle.lowest_layer [*lowest_layer]]]
     [Get a reference to the lowest layer. 
 
      Get a const reference to the lowest layer. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_random_access_handle.native_handle [*native_handle]]]
+    [[link asio.reference.windows__random_access_handle.native_handle [*native_handle]]]
     [Get the native handle representation. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_random_access_handle.operator_eq_ [*operator=]]]
-    [Move-assign a basic_random_access_handle from another. ]
+    [[link asio.reference.windows__random_access_handle.operator_eq_ [*operator=]]]
+    [Move-assign a random_access_handle from another. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_random_access_handle.read_some_at [*read_some_at]]]
+    [[link asio.reference.windows__random_access_handle.random_access_handle [*random_access_handle]]]
+    [Construct a random_access_handle without opening it. 
+
+     Construct a random_access_handle on an existing native handle. 
+
+     Move-construct a random_access_handle from another. ]
+  ]
+  
+  [
+    [[link asio.reference.windows__random_access_handle.read_some_at [*read_some_at]]]
     [Read some data from the handle at the specified offset. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_random_access_handle.write_some_at [*write_some_at]]]
+    [[link asio.reference.windows__random_access_handle.write_some_at [*write_some_at]]]
     [Write some data to the handle at the specified offset. ]
   ]
   
@@ -129104,18 +114040,826 @@
   [[Name][Description]]
 
   [
-    [[link asio.reference.windows__basic_random_access_handle.get_implementation [*get_implementation]]]
+    [[link asio.reference.windows__random_access_handle.get_implementation [*get_implementation]]]
     [Get the underlying implementation of the I/O object. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_random_access_handle.get_service [*get_service]]]
+    [[link asio.reference.windows__random_access_handle.get_service [*get_service]]]
     [Get the service associated with the I/O object. ]
   ]
   
 ]
 
-The [link asio.reference.windows__basic_random_access_handle `windows::basic_random_access_handle`] class template provides asynchronous and blocking random-access handle functionality.
+The [link asio.reference.windows__random_access_handle `windows::random_access_handle`] class provides asynchronous and blocking random-access handle functionality.
+
+
+[heading Thread Safety]
+  
+['Distinct] ['objects:] Safe.
+
+['Shared] ['objects:] Unsafe. 
+
+
+
+[heading Requirements]
+
+['Header: ][^asio/windows/random_access_handle.hpp]
+
+['Convenience header: ][^asio.hpp]
+
+[section:assign windows::random_access_handle::assign]
+
+[indexterm2 assign..windows::random_access_handle] 
+Assign an existing native handle to the handle. 
+
+
+  void ``[link asio.reference.windows__random_access_handle.assign.overload1 assign]``(
+      const native_handle_type & handle);
+  ``  [''''&raquo;''' [link asio.reference.windows__random_access_handle.assign.overload1 more...]]``
+
+  asio::error_code ``[link asio.reference.windows__random_access_handle.assign.overload2 assign]``(
+      const native_handle_type & handle,
+      asio::error_code & ec);
+  ``  [''''&raquo;''' [link asio.reference.windows__random_access_handle.assign.overload2 more...]]``
+
+
+[section:overload1 windows::random_access_handle::assign (1 of 2 overloads)]
+
+
+['Inherited from windows::overlapped_handle.]
+
+
+Assign an existing native handle to the handle. 
+
+
+  void assign(
+      const native_handle_type & handle);
+
+
+
+[endsect]
+
+
+
+[section:overload2 windows::random_access_handle::assign (2 of 2 overloads)]
+
+
+['Inherited from windows::overlapped_handle.]
+
+
+Assign an existing native handle to the handle. 
+
+
+  asio::error_code assign(
+      const native_handle_type & handle,
+      asio::error_code & ec);
+
+
+
+[endsect]
+
+
+[endsect]
+
+
+[section:async_read_some_at windows::random_access_handle::async_read_some_at]
+
+[indexterm2 async_read_some_at..windows::random_access_handle] 
+Start an asynchronous read at the specified offset. 
+
+
+  template<
+      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
+      typename ``[link asio.reference.ReadHandler ReadHandler]``>
+  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_some_at(
+      uint64_t offset,
+      const MutableBufferSequence & buffers,
+      ReadHandler && handler);
+
+
+This function is used to asynchronously read data from the random-access handle. The function call always returns immediately.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[offset][The offset at which the data will be read.]]
+
+[[buffers][One or more buffers into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]
+
+[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
+``
+   void handler(
+     const asio::error_code& error, // Result of operation.
+     std::size_t bytes_transferred           // Number of bytes read.
+   ); 
+``
+Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using `asio::io_context::post()`.]]
+
+]
+
+
+[heading Remarks]
+      
+The read operation may not read all of the requested number of bytes. Consider using the [link asio.reference.async_read_at `async_read_at`]  function if you need to ensure that the requested amount of data is read before the asynchronous operation completes.
+
+
+[heading Example]
+  
+To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 
+
+   handle.async_read_some_at(42, asio::buffer(data, size), handler);
+
+
+See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 
+
+
+
+
+[endsect]
+
+
+
+[section:async_write_some_at windows::random_access_handle::async_write_some_at]
+
+[indexterm2 async_write_some_at..windows::random_access_handle] 
+Start an asynchronous write at the specified offset. 
+
+
+  template<
+      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
+      typename ``[link asio.reference.WriteHandler WriteHandler]``>
+  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_write_some_at(
+      uint64_t offset,
+      const ConstBufferSequence & buffers,
+      WriteHandler && handler);
+
+
+This function is used to asynchronously write data to the random-access handle. The function call always returns immediately.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[offset][The offset at which the data will be written.]]
+
+[[buffers][One or more data buffers to be written to the handle. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]
+
+[[handler][The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
+``
+   void handler(
+     const asio::error_code& error, // Result of operation.
+     std::size_t bytes_transferred           // Number of bytes written.
+   ); 
+``
+Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using `asio::io_context::post()`.]]
+
+]
+
+
+[heading Remarks]
+      
+The write operation may not transmit all of the data to the peer. Consider using the [link asio.reference.async_write_at `async_write_at`]  function if you need to ensure that all data is written before the asynchronous operation completes.
+
+
+[heading Example]
+  
+To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 
+
+   handle.async_write_some_at(42, asio::buffer(data, size), handler);
+
+
+See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 
+
+
+
+
+[endsect]
+
+
+[section:cancel windows::random_access_handle::cancel]
+
+[indexterm2 cancel..windows::random_access_handle] 
+Cancel all asynchronous operations associated with the handle. 
+
+
+  void ``[link asio.reference.windows__random_access_handle.cancel.overload1 cancel]``();
+  ``  [''''&raquo;''' [link asio.reference.windows__random_access_handle.cancel.overload1 more...]]``
+
+  asio::error_code ``[link asio.reference.windows__random_access_handle.cancel.overload2 cancel]``(
+      asio::error_code & ec);
+  ``  [''''&raquo;''' [link asio.reference.windows__random_access_handle.cancel.overload2 more...]]``
+
+
+[section:overload1 windows::random_access_handle::cancel (1 of 2 overloads)]
+
+
+['Inherited from windows::overlapped_handle.]
+
+
+Cancel all asynchronous operations associated with the handle. 
+
+
+  void cancel();
+
+
+This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[asio::system_error][Thrown on failure. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+
+[section:overload2 windows::random_access_handle::cancel (2 of 2 overloads)]
+
+
+['Inherited from windows::overlapped_handle.]
+
+
+Cancel all asynchronous operations associated with the handle. 
+
+
+  asio::error_code cancel(
+      asio::error_code & ec);
+
+
+This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[ec][Set to indicate what error occurred, if any. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+[endsect]
+
+[section:close windows::random_access_handle::close]
+
+[indexterm2 close..windows::random_access_handle] 
+Close the handle. 
+
+
+  void ``[link asio.reference.windows__random_access_handle.close.overload1 close]``();
+  ``  [''''&raquo;''' [link asio.reference.windows__random_access_handle.close.overload1 more...]]``
+
+  asio::error_code ``[link asio.reference.windows__random_access_handle.close.overload2 close]``(
+      asio::error_code & ec);
+  ``  [''''&raquo;''' [link asio.reference.windows__random_access_handle.close.overload2 more...]]``
+
+
+[section:overload1 windows::random_access_handle::close (1 of 2 overloads)]
+
+
+['Inherited from windows::overlapped_handle.]
+
+
+Close the handle. 
+
+
+  void close();
+
+
+This function is used to close the handle. Any asynchronous read or write operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[asio::system_error][Thrown on failure. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+
+[section:overload2 windows::random_access_handle::close (2 of 2 overloads)]
+
+
+['Inherited from windows::overlapped_handle.]
+
+
+Close the handle. 
+
+
+  asio::error_code close(
+      asio::error_code & ec);
+
+
+This function is used to close the handle. Any asynchronous read or write operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[ec][Set to indicate what error occurred, if any. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+[endsect]
+
+
+[section:executor_type windows::random_access_handle::executor_type]
+
+
+['Inherited from windows::overlapped_handle.]
+
+[indexterm2 executor_type..windows::random_access_handle] 
+The type of the executor associated with the object. 
+
+
+  typedef io_context::executor_type executor_type;
+
+
+[heading Member Functions]
+[table
+  [[Name][Description]]
+
+  [
+    [[link asio.reference.io_context__executor_type.context [*context]]]
+    [Obtain the underlying execution context. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context__executor_type.defer [*defer]]]
+    [Request the io_context to invoke the given function object. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context__executor_type.dispatch [*dispatch]]]
+    [Request the io_context to invoke the given function object. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context__executor_type.on_work_finished [*on_work_finished]]]
+    [Inform the io_context that some work is no longer outstanding. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context__executor_type.on_work_started [*on_work_started]]]
+    [Inform the io_context that it has some outstanding work to do. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context__executor_type.post [*post]]]
+    [Request the io_context to invoke the given function object. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context__executor_type.running_in_this_thread [*running_in_this_thread]]]
+    [Determine whether the io_context is running in the current thread. ]
+  ]
+  
+]
+
+[heading Friends]
+[table
+  [[Name][Description]]
+
+  [
+    [[link asio.reference.io_context__executor_type.operator_not__eq_ [*operator!=]]]
+    [Compare two executors for inequality. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context__executor_type.operator_eq__eq_ [*operator==]]]
+    [Compare two executors for equality. ]
+  ]
+  
+]
+
+
+[heading Requirements]
+
+['Header: ][^asio/windows/random_access_handle.hpp]
+
+['Convenience header: ][^asio.hpp]
+
+
+[endsect]
+
+
+
+[section:get_executor windows::random_access_handle::get_executor]
+
+
+['Inherited from windows::overlapped_handle.]
+
+[indexterm2 get_executor..windows::random_access_handle] 
+Get the executor associated with the object. 
+
+
+  executor_type get_executor();
+
+
+
+[endsect]
+
+
+[section:get_implementation windows::random_access_handle::get_implementation]
+
+[indexterm2 get_implementation..windows::random_access_handle] 
+Get the underlying implementation of the I/O object. 
+
+
+  implementation_type & ``[link asio.reference.windows__random_access_handle.get_implementation.overload1 get_implementation]``();
+  ``  [''''&raquo;''' [link asio.reference.windows__random_access_handle.get_implementation.overload1 more...]]``
+
+  const implementation_type & ``[link asio.reference.windows__random_access_handle.get_implementation.overload2 get_implementation]``() const;
+  ``  [''''&raquo;''' [link asio.reference.windows__random_access_handle.get_implementation.overload2 more...]]``
+
+
+[section:overload1 windows::random_access_handle::get_implementation (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the underlying implementation of the I/O object. 
+
+
+  implementation_type & get_implementation();
+
+
+
+[endsect]
+
+
+
+[section:overload2 windows::random_access_handle::get_implementation (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the underlying implementation of the I/O object. 
+
+
+  const implementation_type & get_implementation() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
+
+[section:get_io_context windows::random_access_handle::get_io_context]
+
+
+['Inherited from windows::overlapped_handle.]
+
+[indexterm2 get_io_context..windows::random_access_handle] 
+(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
+
+
+  asio::io_context & get_io_context();
+
+
+This function may be used to obtain the [link asio.reference.io_context `io_context`] object that the I/O object uses to dispatch handlers for asynchronous operations.
+
+
+[heading Return Value]
+      
+A reference to the [link asio.reference.io_context `io_context`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 
+
+
+
+
+[endsect]
+
+
+
+[section:get_io_service windows::random_access_handle::get_io_service]
+
+
+['Inherited from windows::overlapped_handle.]
+
+[indexterm2 get_io_service..windows::random_access_handle] 
+(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
+
+
+  asio::io_context & get_io_service();
+
+
+This function may be used to obtain the [link asio.reference.io_context `io_context`] object that the I/O object uses to dispatch handlers for asynchronous operations.
+
+
+[heading Return Value]
+      
+A reference to the [link asio.reference.io_context `io_context`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 
+
+
+
+
+[endsect]
+
+
+[section:get_service windows::random_access_handle::get_service]
+
+[indexterm2 get_service..windows::random_access_handle] 
+Get the service associated with the I/O object. 
+
+
+  service_type & ``[link asio.reference.windows__random_access_handle.get_service.overload1 get_service]``();
+  ``  [''''&raquo;''' [link asio.reference.windows__random_access_handle.get_service.overload1 more...]]``
+
+  const service_type & ``[link asio.reference.windows__random_access_handle.get_service.overload2 get_service]``() const;
+  ``  [''''&raquo;''' [link asio.reference.windows__random_access_handle.get_service.overload2 more...]]``
+
+
+[section:overload1 windows::random_access_handle::get_service (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object. 
+
+
+  service_type & get_service();
+
+
+
+[endsect]
+
+
+
+[section:overload2 windows::random_access_handle::get_service (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object. 
+
+
+  const service_type & get_service() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
+
+[section:is_open windows::random_access_handle::is_open]
+
+
+['Inherited from windows::overlapped_handle.]
+
+[indexterm2 is_open..windows::random_access_handle] 
+Determine whether the handle is open. 
+
+
+  bool is_open() const;
+
+
+
+[endsect]
+
+
+[section:lowest_layer windows::random_access_handle::lowest_layer]
+
+[indexterm2 lowest_layer..windows::random_access_handle] 
+Get a reference to the lowest layer. 
+
+
+  lowest_layer_type & ``[link asio.reference.windows__random_access_handle.lowest_layer.overload1 lowest_layer]``();
+  ``  [''''&raquo;''' [link asio.reference.windows__random_access_handle.lowest_layer.overload1 more...]]``
+
+
+Get a const reference to the lowest layer. 
+
+
+  const lowest_layer_type & ``[link asio.reference.windows__random_access_handle.lowest_layer.overload2 lowest_layer]``() const;
+  ``  [''''&raquo;''' [link asio.reference.windows__random_access_handle.lowest_layer.overload2 more...]]``
+
+
+[section:overload1 windows::random_access_handle::lowest_layer (1 of 2 overloads)]
+
+
+['Inherited from windows::overlapped_handle.]
+
+
+Get a reference to the lowest layer. 
+
+
+  lowest_layer_type & lowest_layer();
+
+
+This function returns a reference to the lowest layer in a stack of layers. Since an [link asio.reference.windows__overlapped_handle `windows::overlapped_handle`] cannot contain any further layers, it simply returns a reference to itself.
+
+
+[heading Return Value]
+      
+A reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 
+
+
+
+
+[endsect]
+
+
+
+[section:overload2 windows::random_access_handle::lowest_layer (2 of 2 overloads)]
+
+
+['Inherited from windows::overlapped_handle.]
+
+
+Get a const reference to the lowest layer. 
+
+
+  const lowest_layer_type & lowest_layer() const;
+
+
+This function returns a const reference to the lowest layer in a stack of layers. Since an [link asio.reference.windows__overlapped_handle `windows::overlapped_handle`] cannot contain any further layers, it simply returns a reference to itself.
+
+
+[heading Return Value]
+      
+A const reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 
+
+
+
+
+[endsect]
+
+
+[endsect]
+
+
+[section:lowest_layer_type windows::random_access_handle::lowest_layer_type]
+
+
+['Inherited from windows::overlapped_handle.]
+
+[indexterm2 lowest_layer_type..windows::random_access_handle] 
+An [link asio.reference.windows__overlapped_handle `windows::overlapped_handle`] is always the lowest layer. 
+
+
+  typedef overlapped_handle lowest_layer_type;
+
+
+[heading Types]
+[table
+  [[Name][Description]]
+
+  [
+
+    [[link asio.reference.windows__overlapped_handle.executor_type [*executor_type]]]
+    [The type of the executor associated with the object. ]
+  
+  ]
+
+  [
+
+    [[link asio.reference.windows__overlapped_handle.lowest_layer_type [*lowest_layer_type]]]
+    [An overlapped_handle is always the lowest layer. ]
+  
+  ]
+
+  [
+
+    [[link asio.reference.windows__overlapped_handle.native_handle_type [*native_handle_type]]]
+    [The native representation of a handle. ]
+  
+  ]
+
+]
+
+[heading Member Functions]
+[table
+  [[Name][Description]]
+
+  [
+    [[link asio.reference.windows__overlapped_handle.assign [*assign]]]
+    [Assign an existing native handle to the handle. ]
+  ]
+  
+  [
+    [[link asio.reference.windows__overlapped_handle.cancel [*cancel]]]
+    [Cancel all asynchronous operations associated with the handle. ]
+  ]
+  
+  [
+    [[link asio.reference.windows__overlapped_handle.close [*close]]]
+    [Close the handle. ]
+  ]
+  
+  [
+    [[link asio.reference.windows__overlapped_handle.get_executor [*get_executor]]]
+    [Get the executor associated with the object. ]
+  ]
+  
+  [
+    [[link asio.reference.windows__overlapped_handle.get_io_context [*get_io_context]]]
+    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
+  ]
+  
+  [
+    [[link asio.reference.windows__overlapped_handle.get_io_service [*get_io_service]]]
+    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
+  ]
+  
+  [
+    [[link asio.reference.windows__overlapped_handle.is_open [*is_open]]]
+    [Determine whether the handle is open. ]
+  ]
+  
+  [
+    [[link asio.reference.windows__overlapped_handle.lowest_layer [*lowest_layer]]]
+    [Get a reference to the lowest layer. 
+
+     Get a const reference to the lowest layer. ]
+  ]
+  
+  [
+    [[link asio.reference.windows__overlapped_handle.native_handle [*native_handle]]]
+    [Get the native handle representation. ]
+  ]
+  
+  [
+    [[link asio.reference.windows__overlapped_handle.operator_eq_ [*operator=]]]
+    [Move-assign an overlapped_handle from another. ]
+  ]
+  
+  [
+    [[link asio.reference.windows__overlapped_handle.overlapped_handle [*overlapped_handle]]]
+    [Construct an overlapped_handle without opening it. 
+
+     Construct an overlapped_handle on an existing native handle. 
+
+     Move-construct an overlapped_handle from another. ]
+  ]
+  
+]
+
+[heading Protected Member Functions]
+[table
+  [[Name][Description]]
+
+  [
+    [[link asio.reference.windows__overlapped_handle.get_implementation [*get_implementation]]]
+    [Get the underlying implementation of the I/O object. ]
+  ]
+  
+  [
+    [[link asio.reference.windows__overlapped_handle.get_service [*get_service]]]
+    [Get the service associated with the I/O object. ]
+  ]
+  
+  [
+    [[link asio.reference.windows__overlapped_handle._overlapped_handle [*~overlapped_handle]]]
+    [Protected destructor to prevent deletion through this type. ]
+  ]
+  
+]
+
+The [link asio.reference.windows__overlapped_handle `windows::overlapped_handle`] class provides the ability to wrap a Windows handle. The underlying object referred to by the handle must support overlapped I/O.
 
 
 [heading Thread Safety]
@@ -129137,397 +114881,33 @@
 [endsect]
 
 
-[section:windows__random_access_handle_service windows::random_access_handle_service]
+
+[section:native_handle windows::random_access_handle::native_handle]
 
 
-Default service implementation for a random-access handle. 
+['Inherited from windows::overlapped_handle.]
+
+[indexterm2 native_handle..windows::random_access_handle] 
+Get the native handle representation. 
 
 
-  class random_access_handle_service :
-    public io_context::service
+  native_handle_type native_handle();
 
 
-[heading Types]
-[table
-  [[Name][Description]]
-
-  [
-
-    [[link asio.reference.windows__random_access_handle_service.implementation_type [*implementation_type]]]
-    [The type of a random-access handle implementation. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.windows__random_access_handle_service.native_handle_type [*native_handle_type]]]
-    [The native handle type. ]
-  
-  ]
-
-]
-
-[heading Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.windows__random_access_handle_service.assign [*assign]]]
-    [Assign an existing native handle to a random-access handle. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__random_access_handle_service.async_read_some_at [*async_read_some_at]]]
-    [Start an asynchronous read at the specified offset. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__random_access_handle_service.async_write_some_at [*async_write_some_at]]]
-    [Start an asynchronous write at the specified offset. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__random_access_handle_service.cancel [*cancel]]]
-    [Cancel all asynchronous operations associated with the handle. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__random_access_handle_service.close [*close]]]
-    [Close a random-access handle implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__random_access_handle_service.construct [*construct]]]
-    [Construct a new random-access handle implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__random_access_handle_service.destroy [*destroy]]]
-    [Destroy a random-access handle implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__random_access_handle_service.get_io_context [*get_io_context]]]
-    [Get the io_context object that owns the service. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__random_access_handle_service.get_io_service [*get_io_service]]]
-    [Get the io_context object that owns the service. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__random_access_handle_service.is_open [*is_open]]]
-    [Determine whether the handle is open. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__random_access_handle_service.move_assign [*move_assign]]]
-    [Move-assign from another random-access handle implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__random_access_handle_service.move_construct [*move_construct]]]
-    [Move-construct a new random-access handle implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__random_access_handle_service.native_handle [*native_handle]]]
-    [Get the native handle implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__random_access_handle_service.random_access_handle_service [*random_access_handle_service]]]
-    [Construct a new random-access handle service for the specified io_context. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__random_access_handle_service.read_some_at [*read_some_at]]]
-    [Read some data from the specified offset. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__random_access_handle_service.write_some_at [*write_some_at]]]
-    [Write the given data at the specified offset. ]
-  ]
-  
-]
-
-[heading Data Members]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.windows__random_access_handle_service.id [*id]]]
-    [The unique service identifier. ]
-  ]
-
-]
-
-[heading Requirements]
-
-['Header: ][^asio/windows/random_access_handle_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[section:assign windows::random_access_handle_service::assign]
-
-[indexterm2 assign..windows::random_access_handle_service] 
-Assign an existing native handle to a random-access handle. 
-
-
-  asio::error_code assign(
-      implementation_type & impl,
-      const native_handle_type & handle,
-      asio::error_code & ec);
-
+This function may be used to obtain the underlying representation of the handle. This is intended to allow access to native handle functionality that is not otherwise provided. 
 
 
 [endsect]
 
 
 
-[section:async_read_some_at windows::random_access_handle_service::async_read_some_at]
+[section:native_handle_type windows::random_access_handle::native_handle_type]
 
-[indexterm2 async_read_some_at..windows::random_access_handle_service] 
-Start an asynchronous read at the specified offset. 
 
+['Inherited from windows::overlapped_handle.]
 
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
-      typename ``[link asio.reference.ReadHandler ReadHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_some_at(
-      implementation_type & impl,
-      uint64_t offset,
-      const MutableBufferSequence & buffers,
-      ReadHandler && handler);
-
-
-
-[endsect]
-
-
-
-[section:async_write_some_at windows::random_access_handle_service::async_write_some_at]
-
-[indexterm2 async_write_some_at..windows::random_access_handle_service] 
-Start an asynchronous write at the specified offset. 
-
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
-      typename ``[link asio.reference.WriteHandler WriteHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_write_some_at(
-      implementation_type & impl,
-      uint64_t offset,
-      const ConstBufferSequence & buffers,
-      WriteHandler && handler);
-
-
-
-[endsect]
-
-
-
-[section:cancel windows::random_access_handle_service::cancel]
-
-[indexterm2 cancel..windows::random_access_handle_service] 
-Cancel all asynchronous operations associated with the handle. 
-
-
-  asio::error_code cancel(
-      implementation_type & impl,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:close windows::random_access_handle_service::close]
-
-[indexterm2 close..windows::random_access_handle_service] 
-Close a random-access handle implementation. 
-
-
-  asio::error_code close(
-      implementation_type & impl,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:construct windows::random_access_handle_service::construct]
-
-[indexterm2 construct..windows::random_access_handle_service] 
-Construct a new random-access handle implementation. 
-
-
-  void construct(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:destroy windows::random_access_handle_service::destroy]
-
-[indexterm2 destroy..windows::random_access_handle_service] 
-Destroy a random-access handle implementation. 
-
-
-  void destroy(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:get_io_context windows::random_access_handle_service::get_io_context]
-
-
-['Inherited from io_context.]
-
-[indexterm2 get_io_context..windows::random_access_handle_service] 
-Get the [link asio.reference.io_context `io_context`] object that owns the service. 
-
-
-  asio::io_context & get_io_context();
-
-
-
-[endsect]
-
-
-
-[section:get_io_service windows::random_access_handle_service::get_io_service]
-
-
-['Inherited from io_context.]
-
-[indexterm2 get_io_service..windows::random_access_handle_service] 
-Get the [link asio.reference.io_context `io_context`] object that owns the service. 
-
-
-  asio::io_context & get_io_service();
-
-
-
-[endsect]
-
-
-
-[section:id windows::random_access_handle_service::id]
-
-[indexterm2 id..windows::random_access_handle_service] 
-The unique service identifier. 
-
-
-  static asio::io_context::id id;
-
-
-
-[endsect]
-
-
-
-[section:implementation_type windows::random_access_handle_service::implementation_type]
-
-[indexterm2 implementation_type..windows::random_access_handle_service] 
-The type of a random-access handle implementation. 
-
-
-  typedef implementation_defined implementation_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/windows/random_access_handle_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:is_open windows::random_access_handle_service::is_open]
-
-[indexterm2 is_open..windows::random_access_handle_service] 
-Determine whether the handle is open. 
-
-
-  bool is_open(
-      const implementation_type & impl) const;
-
-
-
-[endsect]
-
-
-
-[section:move_assign windows::random_access_handle_service::move_assign]
-
-[indexterm2 move_assign..windows::random_access_handle_service] 
-Move-assign from another random-access handle implementation. 
-
-
-  void move_assign(
-      implementation_type & impl,
-      random_access_handle_service & other_service,
-      implementation_type & other_impl);
-
-
-
-[endsect]
-
-
-
-[section:move_construct windows::random_access_handle_service::move_construct]
-
-[indexterm2 move_construct..windows::random_access_handle_service] 
-Move-construct a new random-access handle implementation. 
-
-
-  void move_construct(
-      implementation_type & impl,
-      implementation_type & other_impl);
-
-
-
-[endsect]
-
-
-
-[section:native_handle windows::random_access_handle_service::native_handle]
-
-[indexterm2 native_handle..windows::random_access_handle_service] 
-Get the native handle implementation. 
-
-
-  native_handle_type native_handle(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:native_handle_type windows::random_access_handle_service::native_handle_type]
-
-[indexterm2 native_handle_type..windows::random_access_handle_service] 
-The native handle type. 
+[indexterm2 native_handle_type..windows::random_access_handle] 
+The native representation of a handle. 
 
 
   typedef implementation_defined native_handle_type;
@@ -129536,7 +114916,7 @@
 
 [heading Requirements]
 
-['Header: ][^asio/windows/random_access_handle_service.hpp]
+['Header: ][^asio/windows/random_access_handle.hpp]
 
 ['Convenience header: ][^asio.hpp]
 
@@ -129545,14 +114925,89 @@
 
 
 
-[section:random_access_handle_service windows::random_access_handle_service::random_access_handle_service]
+[section:operator_eq_ windows::random_access_handle::operator=]
 
-[indexterm2 random_access_handle_service..windows::random_access_handle_service] 
-Construct a new random-access handle service for the specified [link asio.reference.io_context `io_context`]. 
+[indexterm2 operator=..windows::random_access_handle] 
+Move-assign a [link asio.reference.windows__random_access_handle `windows::random_access_handle`] from another. 
 
 
-  random_access_handle_service(
+  random_access_handle & operator=(
+      random_access_handle && other);
+
+
+This assignment operator moves a random-access handle from one object to another.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[other][The other [link asio.reference.windows__random_access_handle `windows::random_access_handle`] object from which the move will occur.]]
+
+]
+
+
+[heading Remarks]
+      
+Following the move, the moved-from object is in the same state as if constructed using the `random_access_handle(io_context&)` constructor. 
+
+
+
+
+[endsect]
+
+
+[section:random_access_handle windows::random_access_handle::random_access_handle]
+
+[indexterm2 random_access_handle..windows::random_access_handle] 
+Construct a [link asio.reference.windows__random_access_handle `windows::random_access_handle`] without opening it. 
+
+
+  explicit ``[link asio.reference.windows__random_access_handle.random_access_handle.overload1 random_access_handle]``(
       asio::io_context & io_context);
+  ``  [''''&raquo;''' [link asio.reference.windows__random_access_handle.random_access_handle.overload1 more...]]``
+
+
+Construct a [link asio.reference.windows__random_access_handle `windows::random_access_handle`] on an existing native handle. 
+
+
+  ``[link asio.reference.windows__random_access_handle.random_access_handle.overload2 random_access_handle]``(
+      asio::io_context & io_context,
+      const native_handle_type & handle);
+  ``  [''''&raquo;''' [link asio.reference.windows__random_access_handle.random_access_handle.overload2 more...]]``
+
+
+Move-construct a [link asio.reference.windows__random_access_handle `windows::random_access_handle`] from another. 
+
+
+  ``[link asio.reference.windows__random_access_handle.random_access_handle.overload3 random_access_handle]``(
+      random_access_handle && other);
+  ``  [''''&raquo;''' [link asio.reference.windows__random_access_handle.random_access_handle.overload3 more...]]``
+
+
+[section:overload1 windows::random_access_handle::random_access_handle (1 of 3 overloads)]
+
+
+Construct a [link asio.reference.windows__random_access_handle `windows::random_access_handle`] without opening it. 
+
+
+  random_access_handle(
+      asio::io_context & io_context);
+
+
+This constructor creates a random-access handle without opening it. The handle needs to be opened before data can be written to or read from it.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[io_context][The [link asio.reference.io_context `io_context`] object that the random-access handle will use to dispatch handlers for any asynchronous operations performed on the handle. ]]
+
+]
+
 
 
 
@@ -129560,56 +115015,362 @@
 
 
 
-[section:read_some_at windows::random_access_handle_service::read_some_at]
+[section:overload2 windows::random_access_handle::random_access_handle (2 of 3 overloads)]
 
-[indexterm2 read_some_at..windows::random_access_handle_service] 
-Read some data from the specified offset. 
+
+Construct a [link asio.reference.windows__random_access_handle `windows::random_access_handle`] on an existing native handle. 
+
+
+  random_access_handle(
+      asio::io_context & io_context,
+      const native_handle_type & handle);
+
+
+This constructor creates a random-access handle object to hold an existing native handle.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[io_context][The [link asio.reference.io_context `io_context`] object that the random-access handle will use to dispatch handlers for any asynchronous operations performed on the handle.]]
+
+[[handle][The new underlying handle implementation.]]
+
+]
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[asio::system_error][Thrown on failure. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+
+[section:overload3 windows::random_access_handle::random_access_handle (3 of 3 overloads)]
+
+
+Move-construct a [link asio.reference.windows__random_access_handle `windows::random_access_handle`] from another. 
+
+
+  random_access_handle(
+      random_access_handle && other);
+
+
+This constructor moves a random-access handle from one object to another.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[other][The other [link asio.reference.windows__random_access_handle `windows::random_access_handle`] object from which the move will occur.]]
+
+]
+
+
+[heading Remarks]
+      
+Following the move, the moved-from object is in the same state as if constructed using the `random_access_handle(io_context&)` constructor. 
+
+
+
+
+[endsect]
+
+
+[endsect]
+
+[section:read_some_at windows::random_access_handle::read_some_at]
+
+[indexterm2 read_some_at..windows::random_access_handle] 
+Read some data from the handle at the specified offset. 
+
+
+  template<
+      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
+  std::size_t ``[link asio.reference.windows__random_access_handle.read_some_at.overload1 read_some_at]``(
+      uint64_t offset,
+      const MutableBufferSequence & buffers);
+  ``  [''''&raquo;''' [link asio.reference.windows__random_access_handle.read_some_at.overload1 more...]]``
+
+  template<
+      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
+  std::size_t ``[link asio.reference.windows__random_access_handle.read_some_at.overload2 read_some_at]``(
+      uint64_t offset,
+      const MutableBufferSequence & buffers,
+      asio::error_code & ec);
+  ``  [''''&raquo;''' [link asio.reference.windows__random_access_handle.read_some_at.overload2 more...]]``
+
+
+[section:overload1 windows::random_access_handle::read_some_at (1 of 2 overloads)]
+
+
+Read some data from the handle at the specified offset. 
 
 
   template<
       typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
   std::size_t read_some_at(
-      implementation_type & impl,
+      uint64_t offset,
+      const MutableBufferSequence & buffers);
+
+
+This function is used to read data from the random-access handle. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[offset][The offset at which the data will be read.]]
+
+[[buffers][One or more buffers into which the data will be read.]]
+
+]
+
+
+[heading Return Value]
+      
+The number of bytes read.
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[asio::system_error][Thrown on failure. An error code of `asio::error::eof` indicates that the connection was closed by the peer.]]
+
+]
+
+
+[heading Remarks]
+      
+The read\_some operation may not read all of the requested number of bytes. Consider using the [link asio.reference.read_at `read_at`]  function if you need to ensure that the requested amount of data is read before the blocking operation completes.
+
+
+[heading Example]
+  
+To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 
+
+   handle.read_some_at(42, asio::buffer(data, size));
+
+
+See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 
+
+
+
+
+[endsect]
+
+
+
+[section:overload2 windows::random_access_handle::read_some_at (2 of 2 overloads)]
+
+
+Read some data from the handle at the specified offset. 
+
+
+  template<
+      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
+  std::size_t read_some_at(
       uint64_t offset,
       const MutableBufferSequence & buffers,
       asio::error_code & ec);
 
 
+This function is used to read data from the random-access handle. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[offset][The offset at which the data will be read.]]
+
+[[buffers][One or more buffers into which the data will be read.]]
+
+[[ec][Set to indicate what error occurred, if any.]]
+
+]
+
+
+[heading Return Value]
+      
+The number of bytes read. Returns 0 if an error occurred.
+
+
+[heading Remarks]
+      
+The read\_some operation may not read all of the requested number of bytes. Consider using the [link asio.reference.read_at `read_at`]  function if you need to ensure that the requested amount of data is read before the blocking operation completes. 
+
+
+
 
 [endsect]
 
 
+[endsect]
 
-[section:write_some_at windows::random_access_handle_service::write_some_at]
+[section:write_some_at windows::random_access_handle::write_some_at]
 
-[indexterm2 write_some_at..windows::random_access_handle_service] 
-Write the given data at the specified offset. 
+[indexterm2 write_some_at..windows::random_access_handle] 
+Write some data to the handle at the specified offset. 
+
+
+  template<
+      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
+  std::size_t ``[link asio.reference.windows__random_access_handle.write_some_at.overload1 write_some_at]``(
+      uint64_t offset,
+      const ConstBufferSequence & buffers);
+  ``  [''''&raquo;''' [link asio.reference.windows__random_access_handle.write_some_at.overload1 more...]]``
+
+  template<
+      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
+  std::size_t ``[link asio.reference.windows__random_access_handle.write_some_at.overload2 write_some_at]``(
+      uint64_t offset,
+      const ConstBufferSequence & buffers,
+      asio::error_code & ec);
+  ``  [''''&raquo;''' [link asio.reference.windows__random_access_handle.write_some_at.overload2 more...]]``
+
+
+[section:overload1 windows::random_access_handle::write_some_at (1 of 2 overloads)]
+
+
+Write some data to the handle at the specified offset. 
 
 
   template<
       typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
   std::size_t write_some_at(
-      implementation_type & impl,
+      uint64_t offset,
+      const ConstBufferSequence & buffers);
+
+
+This function is used to write data to the random-access handle. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[offset][The offset at which the data will be written.]]
+
+[[buffers][One or more data buffers to be written to the handle.]]
+
+]
+
+
+[heading Return Value]
+      
+The number of bytes written.
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[asio::system_error][Thrown on failure. An error code of `asio::error::eof` indicates that the connection was closed by the peer.]]
+
+]
+
+
+[heading Remarks]
+      
+The write\_some\_at operation may not write all of the data. Consider using the [link asio.reference.write_at `write_at`]  function if you need to ensure that all data is written before the blocking operation completes.
+
+
+[heading Example]
+  
+To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 
+
+   handle.write_some_at(42, asio::buffer(data, size));
+
+
+See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 
+
+
+
+
+[endsect]
+
+
+
+[section:overload2 windows::random_access_handle::write_some_at (2 of 2 overloads)]
+
+
+Write some data to the handle at the specified offset. 
+
+
+  template<
+      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
+  std::size_t write_some_at(
       uint64_t offset,
       const ConstBufferSequence & buffers,
       asio::error_code & ec);
 
 
+This function is used to write data to the random-access handle. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.
 
-[endsect]
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[offset][The offset at which the data will be written.]]
+
+[[buffers][One or more data buffers to be written to the handle.]]
+
+[[ec][Set to indicate what error occurred, if any.]]
+
+]
+
+
+[heading Return Value]
+      
+The number of bytes written. Returns 0 if an error occurred.
+
+
+[heading Remarks]
+      
+The write\_some operation may not transmit all of the data to the peer. Consider using the [link asio.reference.write_at `write_at`]  function if you need to ensure that all data is written before the blocking operation completes. 
+
 
 
 
 [endsect]
 
 
+[endsect]
+
+
+[endsect]
+
 [section:windows__stream_handle windows::stream_handle]
 
-[indexterm1 windows::stream_handle] 
-Typedef for the typical usage of a stream-oriented handle. 
+
+Provides stream-oriented handle functionality. 
 
 
-  typedef basic_stream_handle stream_handle;
+  class stream_handle :
+    public windows::overlapped_handle
 
 
 [heading Types]
@@ -129618,39 +115379,25 @@
 
   [
 
-    [[link asio.reference.windows__basic_stream_handle.executor_type [*executor_type]]]
+    [[link asio.reference.windows__stream_handle.executor_type [*executor_type]]]
     [The type of the executor associated with the object. ]
   
   ]
 
   [
 
-    [[link asio.reference.windows__basic_stream_handle.implementation_type [*implementation_type]]]
-    [The underlying implementation type of I/O object. ]
+    [[link asio.reference.windows__stream_handle.lowest_layer_type [*lowest_layer_type]]]
+    [An overlapped_handle is always the lowest layer. ]
   
   ]
 
   [
 
-    [[link asio.reference.windows__basic_stream_handle.lowest_layer_type [*lowest_layer_type]]]
-    [A basic_handle is always the lowest layer. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.windows__basic_stream_handle.native_handle_type [*native_handle_type]]]
+    [[link asio.reference.windows__stream_handle.native_handle_type [*native_handle_type]]]
     [The native representation of a handle. ]
   
   ]
 
-  [
-
-    [[link asio.reference.windows__basic_stream_handle.service_type [*service_type]]]
-    [The type of the service that will be used to provide I/O operations. ]
-  
-  ]
-
 ]
 
 [heading Member Functions]
@@ -129658,83 +115405,83 @@
   [[Name][Description]]
 
   [
-    [[link asio.reference.windows__basic_stream_handle.assign [*assign]]]
+    [[link asio.reference.windows__stream_handle.assign [*assign]]]
     [Assign an existing native handle to the handle. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_stream_handle.async_read_some [*async_read_some]]]
+    [[link asio.reference.windows__stream_handle.async_read_some [*async_read_some]]]
     [Start an asynchronous read. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_stream_handle.async_write_some [*async_write_some]]]
+    [[link asio.reference.windows__stream_handle.async_write_some [*async_write_some]]]
     [Start an asynchronous write. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_stream_handle.basic_stream_handle [*basic_stream_handle]]]
-    [Construct a basic_stream_handle without opening it. 
-
-     Construct a basic_stream_handle on an existing native handle. 
-
-     Move-construct a basic_stream_handle from another. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__basic_stream_handle.cancel [*cancel]]]
+    [[link asio.reference.windows__stream_handle.cancel [*cancel]]]
     [Cancel all asynchronous operations associated with the handle. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_stream_handle.close [*close]]]
+    [[link asio.reference.windows__stream_handle.close [*close]]]
     [Close the handle. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_stream_handle.get_executor [*get_executor]]]
+    [[link asio.reference.windows__stream_handle.get_executor [*get_executor]]]
     [Get the executor associated with the object. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_stream_handle.get_io_context [*get_io_context]]]
+    [[link asio.reference.windows__stream_handle.get_io_context [*get_io_context]]]
     [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_stream_handle.get_io_service [*get_io_service]]]
+    [[link asio.reference.windows__stream_handle.get_io_service [*get_io_service]]]
     [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_stream_handle.is_open [*is_open]]]
+    [[link asio.reference.windows__stream_handle.is_open [*is_open]]]
     [Determine whether the handle is open. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_stream_handle.lowest_layer [*lowest_layer]]]
+    [[link asio.reference.windows__stream_handle.lowest_layer [*lowest_layer]]]
     [Get a reference to the lowest layer. 
 
      Get a const reference to the lowest layer. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_stream_handle.native_handle [*native_handle]]]
+    [[link asio.reference.windows__stream_handle.native_handle [*native_handle]]]
     [Get the native handle representation. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_stream_handle.operator_eq_ [*operator=]]]
-    [Move-assign a basic_stream_handle from another. ]
+    [[link asio.reference.windows__stream_handle.operator_eq_ [*operator=]]]
+    [Move-assign a stream_handle from another. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_stream_handle.read_some [*read_some]]]
+    [[link asio.reference.windows__stream_handle.read_some [*read_some]]]
     [Read some data from the handle. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_stream_handle.write_some [*write_some]]]
+    [[link asio.reference.windows__stream_handle.stream_handle [*stream_handle]]]
+    [Construct a stream_handle without opening it. 
+
+     Construct a stream_handle on an existing native handle. 
+
+     Move-construct a stream_handle from another. ]
+  ]
+  
+  [
+    [[link asio.reference.windows__stream_handle.write_some [*write_some]]]
     [Write some data to the handle. ]
   ]
   
@@ -129745,18 +115492,18 @@
   [[Name][Description]]
 
   [
-    [[link asio.reference.windows__basic_stream_handle.get_implementation [*get_implementation]]]
+    [[link asio.reference.windows__stream_handle.get_implementation [*get_implementation]]]
     [Get the underlying implementation of the I/O object. ]
   ]
   
   [
-    [[link asio.reference.windows__basic_stream_handle.get_service [*get_service]]]
+    [[link asio.reference.windows__stream_handle.get_service [*get_service]]]
     [Get the service associated with the I/O object. ]
   ]
   
 ]
 
-The [link asio.reference.windows__basic_stream_handle `windows::basic_stream_handle`] class template provides asynchronous and blocking stream-oriented handle functionality.
+The [link asio.reference.windows__stream_handle `windows::stream_handle`] class provides asynchronous and blocking stream-oriented handle functionality.
 
 
 [heading Thread Safety]
@@ -129768,6 +115515,808 @@
 
 
 
+[heading Requirements]
+
+['Header: ][^asio/windows/stream_handle.hpp]
+
+['Convenience header: ][^asio.hpp]
+
+[section:assign windows::stream_handle::assign]
+
+[indexterm2 assign..windows::stream_handle] 
+Assign an existing native handle to the handle. 
+
+
+  void ``[link asio.reference.windows__stream_handle.assign.overload1 assign]``(
+      const native_handle_type & handle);
+  ``  [''''&raquo;''' [link asio.reference.windows__stream_handle.assign.overload1 more...]]``
+
+  asio::error_code ``[link asio.reference.windows__stream_handle.assign.overload2 assign]``(
+      const native_handle_type & handle,
+      asio::error_code & ec);
+  ``  [''''&raquo;''' [link asio.reference.windows__stream_handle.assign.overload2 more...]]``
+
+
+[section:overload1 windows::stream_handle::assign (1 of 2 overloads)]
+
+
+['Inherited from windows::overlapped_handle.]
+
+
+Assign an existing native handle to the handle. 
+
+
+  void assign(
+      const native_handle_type & handle);
+
+
+
+[endsect]
+
+
+
+[section:overload2 windows::stream_handle::assign (2 of 2 overloads)]
+
+
+['Inherited from windows::overlapped_handle.]
+
+
+Assign an existing native handle to the handle. 
+
+
+  asio::error_code assign(
+      const native_handle_type & handle,
+      asio::error_code & ec);
+
+
+
+[endsect]
+
+
+[endsect]
+
+
+[section:async_read_some windows::stream_handle::async_read_some]
+
+[indexterm2 async_read_some..windows::stream_handle] 
+Start an asynchronous read. 
+
+
+  template<
+      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
+      typename ``[link asio.reference.ReadHandler ReadHandler]``>
+  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_some(
+      const MutableBufferSequence & buffers,
+      ReadHandler && handler);
+
+
+This function is used to asynchronously read data from the stream handle. The function call always returns immediately.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[buffers][One or more buffers into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]
+
+[[handler][The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
+``
+   void handler(
+     const asio::error_code& error, // Result of operation.
+     std::size_t bytes_transferred           // Number of bytes read.
+   ); 
+``
+Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using `asio::io_context::post()`.]]
+
+]
+
+
+[heading Remarks]
+      
+The read operation may not read all of the requested number of bytes. Consider using the [link asio.reference.async_read `async_read`]  function if you need to ensure that the requested amount of data is read before the asynchronous operation completes.
+
+
+[heading Example]
+  
+To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 
+
+   handle.async_read_some(asio::buffer(data, size), handler);
+
+
+See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 
+
+
+
+
+[endsect]
+
+
+
+[section:async_write_some windows::stream_handle::async_write_some]
+
+[indexterm2 async_write_some..windows::stream_handle] 
+Start an asynchronous write. 
+
+
+  template<
+      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
+      typename ``[link asio.reference.WriteHandler WriteHandler]``>
+  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_write_some(
+      const ConstBufferSequence & buffers,
+      WriteHandler && handler);
+
+
+This function is used to asynchronously write data to the stream handle. The function call always returns immediately.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[buffers][One or more data buffers to be written to the handle. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.]]
+
+[[handler][The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be: 
+``
+   void handler(
+     const asio::error_code& error, // Result of operation.
+     std::size_t bytes_transferred           // Number of bytes written.
+   ); 
+``
+Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using `asio::io_context::post()`.]]
+
+]
+
+
+[heading Remarks]
+      
+The write operation may not transmit all of the data to the peer. Consider using the [link asio.reference.async_write `async_write`]  function if you need to ensure that all data is written before the asynchronous operation completes.
+
+
+[heading Example]
+  
+To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 
+
+   handle.async_write_some(asio::buffer(data, size), handler);
+
+
+See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 
+
+
+
+
+[endsect]
+
+
+[section:cancel windows::stream_handle::cancel]
+
+[indexterm2 cancel..windows::stream_handle] 
+Cancel all asynchronous operations associated with the handle. 
+
+
+  void ``[link asio.reference.windows__stream_handle.cancel.overload1 cancel]``();
+  ``  [''''&raquo;''' [link asio.reference.windows__stream_handle.cancel.overload1 more...]]``
+
+  asio::error_code ``[link asio.reference.windows__stream_handle.cancel.overload2 cancel]``(
+      asio::error_code & ec);
+  ``  [''''&raquo;''' [link asio.reference.windows__stream_handle.cancel.overload2 more...]]``
+
+
+[section:overload1 windows::stream_handle::cancel (1 of 2 overloads)]
+
+
+['Inherited from windows::overlapped_handle.]
+
+
+Cancel all asynchronous operations associated with the handle. 
+
+
+  void cancel();
+
+
+This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[asio::system_error][Thrown on failure. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+
+[section:overload2 windows::stream_handle::cancel (2 of 2 overloads)]
+
+
+['Inherited from windows::overlapped_handle.]
+
+
+Cancel all asynchronous operations associated with the handle. 
+
+
+  asio::error_code cancel(
+      asio::error_code & ec);
+
+
+This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the `asio::error::operation_aborted` error.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[ec][Set to indicate what error occurred, if any. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+[endsect]
+
+[section:close windows::stream_handle::close]
+
+[indexterm2 close..windows::stream_handle] 
+Close the handle. 
+
+
+  void ``[link asio.reference.windows__stream_handle.close.overload1 close]``();
+  ``  [''''&raquo;''' [link asio.reference.windows__stream_handle.close.overload1 more...]]``
+
+  asio::error_code ``[link asio.reference.windows__stream_handle.close.overload2 close]``(
+      asio::error_code & ec);
+  ``  [''''&raquo;''' [link asio.reference.windows__stream_handle.close.overload2 more...]]``
+
+
+[section:overload1 windows::stream_handle::close (1 of 2 overloads)]
+
+
+['Inherited from windows::overlapped_handle.]
+
+
+Close the handle. 
+
+
+  void close();
+
+
+This function is used to close the handle. Any asynchronous read or write operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[asio::system_error][Thrown on failure. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+
+[section:overload2 windows::stream_handle::close (2 of 2 overloads)]
+
+
+['Inherited from windows::overlapped_handle.]
+
+
+Close the handle. 
+
+
+  asio::error_code close(
+      asio::error_code & ec);
+
+
+This function is used to close the handle. Any asynchronous read or write operations will be cancelled immediately, and will complete with the `asio::error::operation_aborted` error.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[ec][Set to indicate what error occurred, if any. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+[endsect]
+
+
+[section:executor_type windows::stream_handle::executor_type]
+
+
+['Inherited from windows::overlapped_handle.]
+
+[indexterm2 executor_type..windows::stream_handle] 
+The type of the executor associated with the object. 
+
+
+  typedef io_context::executor_type executor_type;
+
+
+[heading Member Functions]
+[table
+  [[Name][Description]]
+
+  [
+    [[link asio.reference.io_context__executor_type.context [*context]]]
+    [Obtain the underlying execution context. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context__executor_type.defer [*defer]]]
+    [Request the io_context to invoke the given function object. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context__executor_type.dispatch [*dispatch]]]
+    [Request the io_context to invoke the given function object. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context__executor_type.on_work_finished [*on_work_finished]]]
+    [Inform the io_context that some work is no longer outstanding. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context__executor_type.on_work_started [*on_work_started]]]
+    [Inform the io_context that it has some outstanding work to do. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context__executor_type.post [*post]]]
+    [Request the io_context to invoke the given function object. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context__executor_type.running_in_this_thread [*running_in_this_thread]]]
+    [Determine whether the io_context is running in the current thread. ]
+  ]
+  
+]
+
+[heading Friends]
+[table
+  [[Name][Description]]
+
+  [
+    [[link asio.reference.io_context__executor_type.operator_not__eq_ [*operator!=]]]
+    [Compare two executors for inequality. ]
+  ]
+  
+  [
+    [[link asio.reference.io_context__executor_type.operator_eq__eq_ [*operator==]]]
+    [Compare two executors for equality. ]
+  ]
+  
+]
+
+
+[heading Requirements]
+
+['Header: ][^asio/windows/stream_handle.hpp]
+
+['Convenience header: ][^asio.hpp]
+
+
+[endsect]
+
+
+
+[section:get_executor windows::stream_handle::get_executor]
+
+
+['Inherited from windows::overlapped_handle.]
+
+[indexterm2 get_executor..windows::stream_handle] 
+Get the executor associated with the object. 
+
+
+  executor_type get_executor();
+
+
+
+[endsect]
+
+
+[section:get_implementation windows::stream_handle::get_implementation]
+
+[indexterm2 get_implementation..windows::stream_handle] 
+Get the underlying implementation of the I/O object. 
+
+
+  implementation_type & ``[link asio.reference.windows__stream_handle.get_implementation.overload1 get_implementation]``();
+  ``  [''''&raquo;''' [link asio.reference.windows__stream_handle.get_implementation.overload1 more...]]``
+
+  const implementation_type & ``[link asio.reference.windows__stream_handle.get_implementation.overload2 get_implementation]``() const;
+  ``  [''''&raquo;''' [link asio.reference.windows__stream_handle.get_implementation.overload2 more...]]``
+
+
+[section:overload1 windows::stream_handle::get_implementation (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the underlying implementation of the I/O object. 
+
+
+  implementation_type & get_implementation();
+
+
+
+[endsect]
+
+
+
+[section:overload2 windows::stream_handle::get_implementation (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the underlying implementation of the I/O object. 
+
+
+  const implementation_type & get_implementation() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
+
+[section:get_io_context windows::stream_handle::get_io_context]
+
+
+['Inherited from windows::overlapped_handle.]
+
+[indexterm2 get_io_context..windows::stream_handle] 
+(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
+
+
+  asio::io_context & get_io_context();
+
+
+This function may be used to obtain the [link asio.reference.io_context `io_context`] object that the I/O object uses to dispatch handlers for asynchronous operations.
+
+
+[heading Return Value]
+      
+A reference to the [link asio.reference.io_context `io_context`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 
+
+
+
+
+[endsect]
+
+
+
+[section:get_io_service windows::stream_handle::get_io_service]
+
+
+['Inherited from windows::overlapped_handle.]
+
+[indexterm2 get_io_service..windows::stream_handle] 
+(Deprecated: Use `get_executor()`.) Get the [link asio.reference.io_context `io_context`] associated with the object. 
+
+
+  asio::io_context & get_io_service();
+
+
+This function may be used to obtain the [link asio.reference.io_context `io_context`] object that the I/O object uses to dispatch handlers for asynchronous operations.
+
+
+[heading Return Value]
+      
+A reference to the [link asio.reference.io_context `io_context`] object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller. 
+
+
+
+
+[endsect]
+
+
+[section:get_service windows::stream_handle::get_service]
+
+[indexterm2 get_service..windows::stream_handle] 
+Get the service associated with the I/O object. 
+
+
+  service_type & ``[link asio.reference.windows__stream_handle.get_service.overload1 get_service]``();
+  ``  [''''&raquo;''' [link asio.reference.windows__stream_handle.get_service.overload1 more...]]``
+
+  const service_type & ``[link asio.reference.windows__stream_handle.get_service.overload2 get_service]``() const;
+  ``  [''''&raquo;''' [link asio.reference.windows__stream_handle.get_service.overload2 more...]]``
+
+
+[section:overload1 windows::stream_handle::get_service (1 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object. 
+
+
+  service_type & get_service();
+
+
+
+[endsect]
+
+
+
+[section:overload2 windows::stream_handle::get_service (2 of 2 overloads)]
+
+
+['Inherited from basic_io_object.]
+
+
+Get the service associated with the I/O object. 
+
+
+  const service_type & get_service() const;
+
+
+
+[endsect]
+
+
+[endsect]
+
+
+[section:is_open windows::stream_handle::is_open]
+
+
+['Inherited from windows::overlapped_handle.]
+
+[indexterm2 is_open..windows::stream_handle] 
+Determine whether the handle is open. 
+
+
+  bool is_open() const;
+
+
+
+[endsect]
+
+
+[section:lowest_layer windows::stream_handle::lowest_layer]
+
+[indexterm2 lowest_layer..windows::stream_handle] 
+Get a reference to the lowest layer. 
+
+
+  lowest_layer_type & ``[link asio.reference.windows__stream_handle.lowest_layer.overload1 lowest_layer]``();
+  ``  [''''&raquo;''' [link asio.reference.windows__stream_handle.lowest_layer.overload1 more...]]``
+
+
+Get a const reference to the lowest layer. 
+
+
+  const lowest_layer_type & ``[link asio.reference.windows__stream_handle.lowest_layer.overload2 lowest_layer]``() const;
+  ``  [''''&raquo;''' [link asio.reference.windows__stream_handle.lowest_layer.overload2 more...]]``
+
+
+[section:overload1 windows::stream_handle::lowest_layer (1 of 2 overloads)]
+
+
+['Inherited from windows::overlapped_handle.]
+
+
+Get a reference to the lowest layer. 
+
+
+  lowest_layer_type & lowest_layer();
+
+
+This function returns a reference to the lowest layer in a stack of layers. Since an [link asio.reference.windows__overlapped_handle `windows::overlapped_handle`] cannot contain any further layers, it simply returns a reference to itself.
+
+
+[heading Return Value]
+      
+A reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 
+
+
+
+
+[endsect]
+
+
+
+[section:overload2 windows::stream_handle::lowest_layer (2 of 2 overloads)]
+
+
+['Inherited from windows::overlapped_handle.]
+
+
+Get a const reference to the lowest layer. 
+
+
+  const lowest_layer_type & lowest_layer() const;
+
+
+This function returns a const reference to the lowest layer in a stack of layers. Since an [link asio.reference.windows__overlapped_handle `windows::overlapped_handle`] cannot contain any further layers, it simply returns a reference to itself.
+
+
+[heading Return Value]
+      
+A const reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller. 
+
+
+
+
+[endsect]
+
+
+[endsect]
+
+
+[section:lowest_layer_type windows::stream_handle::lowest_layer_type]
+
+
+['Inherited from windows::overlapped_handle.]
+
+[indexterm2 lowest_layer_type..windows::stream_handle] 
+An [link asio.reference.windows__overlapped_handle `windows::overlapped_handle`] is always the lowest layer. 
+
+
+  typedef overlapped_handle lowest_layer_type;
+
+
+[heading Types]
+[table
+  [[Name][Description]]
+
+  [
+
+    [[link asio.reference.windows__overlapped_handle.executor_type [*executor_type]]]
+    [The type of the executor associated with the object. ]
+  
+  ]
+
+  [
+
+    [[link asio.reference.windows__overlapped_handle.lowest_layer_type [*lowest_layer_type]]]
+    [An overlapped_handle is always the lowest layer. ]
+  
+  ]
+
+  [
+
+    [[link asio.reference.windows__overlapped_handle.native_handle_type [*native_handle_type]]]
+    [The native representation of a handle. ]
+  
+  ]
+
+]
+
+[heading Member Functions]
+[table
+  [[Name][Description]]
+
+  [
+    [[link asio.reference.windows__overlapped_handle.assign [*assign]]]
+    [Assign an existing native handle to the handle. ]
+  ]
+  
+  [
+    [[link asio.reference.windows__overlapped_handle.cancel [*cancel]]]
+    [Cancel all asynchronous operations associated with the handle. ]
+  ]
+  
+  [
+    [[link asio.reference.windows__overlapped_handle.close [*close]]]
+    [Close the handle. ]
+  ]
+  
+  [
+    [[link asio.reference.windows__overlapped_handle.get_executor [*get_executor]]]
+    [Get the executor associated with the object. ]
+  ]
+  
+  [
+    [[link asio.reference.windows__overlapped_handle.get_io_context [*get_io_context]]]
+    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
+  ]
+  
+  [
+    [[link asio.reference.windows__overlapped_handle.get_io_service [*get_io_service]]]
+    [(Deprecated: Use get_executor().) Get the io_context associated with the object. ]
+  ]
+  
+  [
+    [[link asio.reference.windows__overlapped_handle.is_open [*is_open]]]
+    [Determine whether the handle is open. ]
+  ]
+  
+  [
+    [[link asio.reference.windows__overlapped_handle.lowest_layer [*lowest_layer]]]
+    [Get a reference to the lowest layer. 
+
+     Get a const reference to the lowest layer. ]
+  ]
+  
+  [
+    [[link asio.reference.windows__overlapped_handle.native_handle [*native_handle]]]
+    [Get the native handle representation. ]
+  ]
+  
+  [
+    [[link asio.reference.windows__overlapped_handle.operator_eq_ [*operator=]]]
+    [Move-assign an overlapped_handle from another. ]
+  ]
+  
+  [
+    [[link asio.reference.windows__overlapped_handle.overlapped_handle [*overlapped_handle]]]
+    [Construct an overlapped_handle without opening it. 
+
+     Construct an overlapped_handle on an existing native handle. 
+
+     Move-construct an overlapped_handle from another. ]
+  ]
+  
+]
+
+[heading Protected Member Functions]
+[table
+  [[Name][Description]]
+
+  [
+    [[link asio.reference.windows__overlapped_handle.get_implementation [*get_implementation]]]
+    [Get the underlying implementation of the I/O object. ]
+  ]
+  
+  [
+    [[link asio.reference.windows__overlapped_handle.get_service [*get_service]]]
+    [Get the service associated with the I/O object. ]
+  ]
+  
+  [
+    [[link asio.reference.windows__overlapped_handle._overlapped_handle [*~overlapped_handle]]]
+    [Protected destructor to prevent deletion through this type. ]
+  ]
+  
+]
+
+The [link asio.reference.windows__overlapped_handle `windows::overlapped_handle`] class provides the ability to wrap a Windows handle. The underlying object referred to by the handle must support overlapped I/O.
+
+
+[heading Thread Safety]
+  
+['Distinct] ['objects:] Safe.
+
+['Shared] ['objects:] Unsafe. 
+
+
+
 
 [heading Requirements]
 
@@ -129779,395 +116328,33 @@
 [endsect]
 
 
-[section:windows__stream_handle_service windows::stream_handle_service]
+
+[section:native_handle windows::stream_handle::native_handle]
 
 
-Default service implementation for a stream handle. 
+['Inherited from windows::overlapped_handle.]
+
+[indexterm2 native_handle..windows::stream_handle] 
+Get the native handle representation. 
 
 
-  class stream_handle_service :
-    public io_context::service
+  native_handle_type native_handle();
 
 
-[heading Types]
-[table
-  [[Name][Description]]
-
-  [
-
-    [[link asio.reference.windows__stream_handle_service.implementation_type [*implementation_type]]]
-    [The type of a stream handle implementation. ]
-  
-  ]
-
-  [
-
-    [[link asio.reference.windows__stream_handle_service.native_handle_type [*native_handle_type]]]
-    [The native handle type. ]
-  
-  ]
-
-]
-
-[heading Member Functions]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.windows__stream_handle_service.assign [*assign]]]
-    [Assign an existing native handle to a stream handle. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__stream_handle_service.async_read_some [*async_read_some]]]
-    [Start an asynchronous read. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__stream_handle_service.async_write_some [*async_write_some]]]
-    [Start an asynchronous write. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__stream_handle_service.cancel [*cancel]]]
-    [Cancel all asynchronous operations associated with the handle. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__stream_handle_service.close [*close]]]
-    [Close a stream handle implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__stream_handle_service.construct [*construct]]]
-    [Construct a new stream handle implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__stream_handle_service.destroy [*destroy]]]
-    [Destroy a stream handle implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__stream_handle_service.get_io_context [*get_io_context]]]
-    [Get the io_context object that owns the service. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__stream_handle_service.get_io_service [*get_io_service]]]
-    [Get the io_context object that owns the service. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__stream_handle_service.is_open [*is_open]]]
-    [Determine whether the handle is open. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__stream_handle_service.move_assign [*move_assign]]]
-    [Move-assign from another stream handle implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__stream_handle_service.move_construct [*move_construct]]]
-    [Move-construct a new stream handle implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__stream_handle_service.native_handle [*native_handle]]]
-    [Get the native handle implementation. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__stream_handle_service.read_some [*read_some]]]
-    [Read some data from the stream. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__stream_handle_service.stream_handle_service [*stream_handle_service]]]
-    [Construct a new stream handle service for the specified io_context. ]
-  ]
-  
-  [
-    [[link asio.reference.windows__stream_handle_service.write_some [*write_some]]]
-    [Write the given data to the stream. ]
-  ]
-  
-]
-
-[heading Data Members]
-[table
-  [[Name][Description]]
-
-  [
-    [[link asio.reference.windows__stream_handle_service.id [*id]]]
-    [The unique service identifier. ]
-  ]
-
-]
-
-[heading Requirements]
-
-['Header: ][^asio/windows/stream_handle_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[section:assign windows::stream_handle_service::assign]
-
-[indexterm2 assign..windows::stream_handle_service] 
-Assign an existing native handle to a stream handle. 
-
-
-  asio::error_code assign(
-      implementation_type & impl,
-      const native_handle_type & handle,
-      asio::error_code & ec);
-
+This function may be used to obtain the underlying representation of the handle. This is intended to allow access to native handle functionality that is not otherwise provided. 
 
 
 [endsect]
 
 
 
-[section:async_read_some windows::stream_handle_service::async_read_some]
+[section:native_handle_type windows::stream_handle::native_handle_type]
 
-[indexterm2 async_read_some..windows::stream_handle_service] 
-Start an asynchronous read. 
 
+['Inherited from windows::overlapped_handle.]
 
-  template<
-      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``,
-      typename ``[link asio.reference.ReadHandler ReadHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_read_some(
-      implementation_type & impl,
-      const MutableBufferSequence & buffers,
-      ReadHandler && handler);
-
-
-
-[endsect]
-
-
-
-[section:async_write_some windows::stream_handle_service::async_write_some]
-
-[indexterm2 async_write_some..windows::stream_handle_service] 
-Start an asynchronous write. 
-
-
-  template<
-      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``,
-      typename ``[link asio.reference.WriteHandler WriteHandler]``>
-  ``[link asio.reference.asynchronous_operations.return_type_of_an_initiating_function ['void-or-deduced]]`` async_write_some(
-      implementation_type & impl,
-      const ConstBufferSequence & buffers,
-      WriteHandler && handler);
-
-
-
-[endsect]
-
-
-
-[section:cancel windows::stream_handle_service::cancel]
-
-[indexterm2 cancel..windows::stream_handle_service] 
-Cancel all asynchronous operations associated with the handle. 
-
-
-  asio::error_code cancel(
-      implementation_type & impl,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:close windows::stream_handle_service::close]
-
-[indexterm2 close..windows::stream_handle_service] 
-Close a stream handle implementation. 
-
-
-  asio::error_code close(
-      implementation_type & impl,
-      asio::error_code & ec);
-
-
-
-[endsect]
-
-
-
-[section:construct windows::stream_handle_service::construct]
-
-[indexterm2 construct..windows::stream_handle_service] 
-Construct a new stream handle implementation. 
-
-
-  void construct(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:destroy windows::stream_handle_service::destroy]
-
-[indexterm2 destroy..windows::stream_handle_service] 
-Destroy a stream handle implementation. 
-
-
-  void destroy(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:get_io_context windows::stream_handle_service::get_io_context]
-
-
-['Inherited from io_context.]
-
-[indexterm2 get_io_context..windows::stream_handle_service] 
-Get the [link asio.reference.io_context `io_context`] object that owns the service. 
-
-
-  asio::io_context & get_io_context();
-
-
-
-[endsect]
-
-
-
-[section:get_io_service windows::stream_handle_service::get_io_service]
-
-
-['Inherited from io_context.]
-
-[indexterm2 get_io_service..windows::stream_handle_service] 
-Get the [link asio.reference.io_context `io_context`] object that owns the service. 
-
-
-  asio::io_context & get_io_service();
-
-
-
-[endsect]
-
-
-
-[section:id windows::stream_handle_service::id]
-
-[indexterm2 id..windows::stream_handle_service] 
-The unique service identifier. 
-
-
-  static asio::io_context::id id;
-
-
-
-[endsect]
-
-
-
-[section:implementation_type windows::stream_handle_service::implementation_type]
-
-[indexterm2 implementation_type..windows::stream_handle_service] 
-The type of a stream handle implementation. 
-
-
-  typedef implementation_defined implementation_type;
-
-
-
-[heading Requirements]
-
-['Header: ][^asio/windows/stream_handle_service.hpp]
-
-['Convenience header: ][^asio.hpp]
-
-
-[endsect]
-
-
-
-[section:is_open windows::stream_handle_service::is_open]
-
-[indexterm2 is_open..windows::stream_handle_service] 
-Determine whether the handle is open. 
-
-
-  bool is_open(
-      const implementation_type & impl) const;
-
-
-
-[endsect]
-
-
-
-[section:move_assign windows::stream_handle_service::move_assign]
-
-[indexterm2 move_assign..windows::stream_handle_service] 
-Move-assign from another stream handle implementation. 
-
-
-  void move_assign(
-      implementation_type & impl,
-      stream_handle_service & other_service,
-      implementation_type & other_impl);
-
-
-
-[endsect]
-
-
-
-[section:move_construct windows::stream_handle_service::move_construct]
-
-[indexterm2 move_construct..windows::stream_handle_service] 
-Move-construct a new stream handle implementation. 
-
-
-  void move_construct(
-      implementation_type & impl,
-      implementation_type & other_impl);
-
-
-
-[endsect]
-
-
-
-[section:native_handle windows::stream_handle_service::native_handle]
-
-[indexterm2 native_handle..windows::stream_handle_service] 
-Get the native handle implementation. 
-
-
-  native_handle_type native_handle(
-      implementation_type & impl);
-
-
-
-[endsect]
-
-
-
-[section:native_handle_type windows::stream_handle_service::native_handle_type]
-
-[indexterm2 native_handle_type..windows::stream_handle_service] 
-The native handle type. 
+[indexterm2 native_handle_type..windows::stream_handle] 
+The native representation of a handle. 
 
 
   typedef implementation_defined native_handle_type;
@@ -130176,7 +116363,7 @@
 
 [heading Requirements]
 
-['Header: ][^asio/windows/stream_handle_service.hpp]
+['Header: ][^asio/windows/stream_handle.hpp]
 
 ['Convenience header: ][^asio.hpp]
 
@@ -130185,52 +116372,373 @@
 
 
 
-[section:read_some windows::stream_handle_service::read_some]
+[section:operator_eq_ windows::stream_handle::operator=]
 
-[indexterm2 read_some..windows::stream_handle_service] 
-Read some data from the stream. 
+[indexterm2 operator=..windows::stream_handle] 
+Move-assign a [link asio.reference.windows__stream_handle `windows::stream_handle`] from another. 
+
+
+  stream_handle & operator=(
+      stream_handle && other);
+
+
+This assignment operator moves a stream handle from one object to another.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[other][The other [link asio.reference.windows__stream_handle `windows::stream_handle`] object from which the move will occur.]]
+
+]
+
+
+[heading Remarks]
+      
+Following the move, the moved-from object is in the same state as if constructed using the `stream_handle(io_context&) constructor`. 
+
+
+
+
+[endsect]
+
+
+[section:read_some windows::stream_handle::read_some]
+
+[indexterm2 read_some..windows::stream_handle] 
+Read some data from the handle. 
+
+
+  template<
+      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
+  std::size_t ``[link asio.reference.windows__stream_handle.read_some.overload1 read_some]``(
+      const MutableBufferSequence & buffers);
+  ``  [''''&raquo;''' [link asio.reference.windows__stream_handle.read_some.overload1 more...]]``
+
+  template<
+      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
+  std::size_t ``[link asio.reference.windows__stream_handle.read_some.overload2 read_some]``(
+      const MutableBufferSequence & buffers,
+      asio::error_code & ec);
+  ``  [''''&raquo;''' [link asio.reference.windows__stream_handle.read_some.overload2 more...]]``
+
+
+[section:overload1 windows::stream_handle::read_some (1 of 2 overloads)]
+
+
+Read some data from the handle. 
 
 
   template<
       typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
   std::size_t read_some(
-      implementation_type & impl,
+      const MutableBufferSequence & buffers);
+
+
+This function is used to read data from the stream handle. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[buffers][One or more buffers into which the data will be read.]]
+
+]
+
+
+[heading Return Value]
+      
+The number of bytes read.
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[asio::system_error][Thrown on failure. An error code of `asio::error::eof` indicates that the connection was closed by the peer.]]
+
+]
+
+
+[heading Remarks]
+      
+The read\_some operation may not read all of the requested number of bytes. Consider using the [link asio.reference.read `read`]  function if you need to ensure that the requested amount of data is read before the blocking operation completes.
+
+
+[heading Example]
+  
+To read into a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 
+
+   handle.read_some(asio::buffer(data, size));
+
+
+See the [link asio.reference.buffer `buffer`]  documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 
+
+
+
+
+[endsect]
+
+
+
+[section:overload2 windows::stream_handle::read_some (2 of 2 overloads)]
+
+
+Read some data from the handle. 
+
+
+  template<
+      typename ``[link asio.reference.MutableBufferSequence MutableBufferSequence]``>
+  std::size_t read_some(
       const MutableBufferSequence & buffers,
       asio::error_code & ec);
 
 
+This function is used to read data from the stream handle. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[buffers][One or more buffers into which the data will be read.]]
+
+[[ec][Set to indicate what error occurred, if any.]]
+
+]
+
+
+[heading Return Value]
+      
+The number of bytes read. Returns 0 if an error occurred.
+
+
+[heading Remarks]
+      
+The read\_some operation may not read all of the requested number of bytes. Consider using the [link asio.reference.read `read`]  function if you need to ensure that the requested amount of data is read before the blocking operation completes. 
+
+
+
 
 [endsect]
 
 
+[endsect]
 
-[section:stream_handle_service windows::stream_handle_service::stream_handle_service]
+[section:stream_handle windows::stream_handle::stream_handle]
 
-[indexterm2 stream_handle_service..windows::stream_handle_service] 
-Construct a new stream handle service for the specified [link asio.reference.io_context `io_context`]. 
+[indexterm2 stream_handle..windows::stream_handle] 
+Construct a [link asio.reference.windows__stream_handle `windows::stream_handle`] without opening it. 
 
 
-  stream_handle_service(
+  explicit ``[link asio.reference.windows__stream_handle.stream_handle.overload1 stream_handle]``(
+      asio::io_context & io_context);
+  ``  [''''&raquo;''' [link asio.reference.windows__stream_handle.stream_handle.overload1 more...]]``
+
+
+Construct a [link asio.reference.windows__stream_handle `windows::stream_handle`] on an existing native handle. 
+
+
+  ``[link asio.reference.windows__stream_handle.stream_handle.overload2 stream_handle]``(
+      asio::io_context & io_context,
+      const native_handle_type & handle);
+  ``  [''''&raquo;''' [link asio.reference.windows__stream_handle.stream_handle.overload2 more...]]``
+
+
+Move-construct a [link asio.reference.windows__stream_handle `windows::stream_handle`] from another. 
+
+
+  ``[link asio.reference.windows__stream_handle.stream_handle.overload3 stream_handle]``(
+      stream_handle && other);
+  ``  [''''&raquo;''' [link asio.reference.windows__stream_handle.stream_handle.overload3 more...]]``
+
+
+[section:overload1 windows::stream_handle::stream_handle (1 of 3 overloads)]
+
+
+Construct a [link asio.reference.windows__stream_handle `windows::stream_handle`] without opening it. 
+
+
+  stream_handle(
       asio::io_context & io_context);
 
 
+This constructor creates a stream handle without opening it. The handle needs to be opened and then connected or accepted before data can be sent or received on it.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[io_context][The [link asio.reference.io_context `io_context`] object that the stream handle will use to dispatch handlers for any asynchronous operations performed on the handle. ]]
+
+]
+
+
+
 
 [endsect]
 
 
 
-[section:write_some windows::stream_handle_service::write_some]
+[section:overload2 windows::stream_handle::stream_handle (2 of 3 overloads)]
 
-[indexterm2 write_some..windows::stream_handle_service] 
-Write the given data to the stream. 
+
+Construct a [link asio.reference.windows__stream_handle `windows::stream_handle`] on an existing native handle. 
+
+
+  stream_handle(
+      asio::io_context & io_context,
+      const native_handle_type & handle);
+
+
+This constructor creates a stream handle object to hold an existing native handle.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[io_context][The [link asio.reference.io_context `io_context`] object that the stream handle will use to dispatch handlers for any asynchronous operations performed on the handle.]]
+
+[[handle][The new underlying handle implementation.]]
+
+]
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[asio::system_error][Thrown on failure. ]]
+
+]
+
+
+
+
+[endsect]
+
+
+
+[section:overload3 windows::stream_handle::stream_handle (3 of 3 overloads)]
+
+
+Move-construct a [link asio.reference.windows__stream_handle `windows::stream_handle`] from another. 
+
+
+  stream_handle(
+      stream_handle && other);
+
+
+This constructor moves a stream handle from one object to another.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[other][The other [link asio.reference.windows__stream_handle `windows::stream_handle`] object from which the move will occur.]]
+
+]
+
+
+[heading Remarks]
+      
+Following the move, the moved-from object is in the same state as if constructed using the `stream_handle(io_context&) constructor`. 
+
+
+
+
+[endsect]
+
+
+[endsect]
+
+[section:write_some windows::stream_handle::write_some]
+
+[indexterm2 write_some..windows::stream_handle] 
+Write some data to the handle. 
+
+
+  template<
+      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
+  std::size_t ``[link asio.reference.windows__stream_handle.write_some.overload1 write_some]``(
+      const ConstBufferSequence & buffers);
+  ``  [''''&raquo;''' [link asio.reference.windows__stream_handle.write_some.overload1 more...]]``
+
+  template<
+      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
+  std::size_t ``[link asio.reference.windows__stream_handle.write_some.overload2 write_some]``(
+      const ConstBufferSequence & buffers,
+      asio::error_code & ec);
+  ``  [''''&raquo;''' [link asio.reference.windows__stream_handle.write_some.overload2 more...]]``
+
+
+[section:overload1 windows::stream_handle::write_some (1 of 2 overloads)]
+
+
+Write some data to the handle. 
 
 
   template<
       typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
   std::size_t write_some(
-      implementation_type & impl,
-      const ConstBufferSequence & buffers,
-      asio::error_code & ec);
+      const ConstBufferSequence & buffers);
+
+
+This function is used to write data to the stream handle. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[buffers][One or more data buffers to be written to the handle.]]
+
+]
+
+
+[heading Return Value]
+      
+The number of bytes written.
+
+
+[heading Exceptions]
+    
+
+[variablelist
+  
+[[asio::system_error][Thrown on failure. An error code of `asio::error::eof` indicates that the connection was closed by the peer.]]
+
+]
+
+
+[heading Remarks]
+      
+The write\_some operation may not transmit all of the data to the peer. Consider using the [link asio.reference.write `write`]  function if you need to ensure that all data is written before the blocking operation completes.
+
+
+[heading Example]
+  
+To write a single data buffer use the [link asio.reference.buffer `buffer`]  function as follows: 
+
+   handle.write_some(asio::buffer(data, size));
+
+
+See the [link asio.reference.buffer `buffer`]  documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector. 
+
 
 
 
@@ -130238,6 +116746,52 @@
 
 
 
+[section:overload2 windows::stream_handle::write_some (2 of 2 overloads)]
+
+
+Write some data to the handle. 
+
+
+  template<
+      typename ``[link asio.reference.ConstBufferSequence ConstBufferSequence]``>
+  std::size_t write_some(
+      const ConstBufferSequence & buffers,
+      asio::error_code & ec);
+
+
+This function is used to write data to the stream handle. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.
+
+
+[heading Parameters]
+    
+
+[variablelist
+  
+[[buffers][One or more data buffers to be written to the handle.]]
+
+[[ec][Set to indicate what error occurred, if any.]]
+
+]
+
+
+[heading Return Value]
+      
+The number of bytes written. Returns 0 if an error occurred.
+
+
+[heading Remarks]
+      
+The write\_some operation may not transmit all of the data to the peer. Consider using the [link asio.reference.write `write`]  function if you need to ensure that all data is written before the blocking operation completes. 
+
+
+
+
+[endsect]
+
+
+[endsect]
+
+
 [endsect]
 
 [section:write write]
diff --git a/asio/src/doc/reference.xsl b/asio/src/doc/reference.xsl
index effb691..7dbf4c9 100644
--- a/asio/src/doc/reference.xsl
+++ b/asio/src/doc/reference.xsl
@@ -49,49 +49,31 @@
 [include requirements/ConstBufferSequence.qbk]
 [include requirements/ConvertibleToConstBuffer.qbk]
 [include requirements/ConvertibleToMutableBuffer.qbk]
-[include requirements/DatagramSocketService.qbk]
-[include requirements/DescriptorService.qbk]
 [include requirements/DynamicBufferSequence.qbk]
 [include requirements/Endpoint.qbk]
 [include requirements/Executor.qbk]
 [include requirements/GettableSerialPortOption.qbk]
 [include requirements/GettableSocketOption.qbk]
 [include requirements/Handler.qbk]
-[include requirements/HandleService.qbk]
 [include requirements/HandshakeHandler.qbk]
 [include requirements/InternetProtocol.qbk]
 [include requirements/IoControlCommand.qbk]
-[include requirements/IoObjectService.qbk]
 [include requirements/IteratorConnectHandler.qbk]
 [include requirements/MutableBufferSequence.qbk]
-[include requirements/ObjectHandleService.qbk]
 [include requirements/Protocol.qbk]
-[include requirements/RandomAccessHandleService.qbk]
 [include requirements/RangeConnectHandler.qbk]
-[include requirements/RawSocketService.qbk]
 [include requirements/ReadHandler.qbk]
 [include requirements/ResolveHandler.qbk]
-[include requirements/ResolverService.qbk]
-[include requirements/SeqPacketSocketService.qbk]
-[include requirements/SerialPortService.qbk]
 [include requirements/Service.qbk]
 [include requirements/SettableSerialPortOption.qbk]
 [include requirements/SettableSocketOption.qbk]
 [include requirements/ShutdownHandler.qbk]
 [include requirements/SignalHandler.qbk]
-[include requirements/SignalSetService.qbk]
-[include requirements/SocketAcceptorService.qbk]
-[include requirements/SocketService.qbk]
-[include requirements/StreamDescriptorService.qbk]
-[include requirements/StreamHandleService.qbk]
-[include requirements/StreamSocketService.qbk]
 [include requirements/SyncRandomAccessReadDevice.qbk]
 [include requirements/SyncRandomAccessWriteDevice.qbk]
 [include requirements/SyncReadStream.qbk]
 [include requirements/SyncWriteStream.qbk]
 [include requirements/TimeTraits.qbk]
-[include requirements/TimerService.qbk]
-[include requirements/WaitableTimerService.qbk]
 [include requirements/WaitHandler.qbk]
 [include requirements/WaitTraits.qbk]
 [include requirements/WriteHandler.qbk]
diff --git a/asio/src/doc/requirements/DatagramSocketService.qbk b/asio/src/doc/requirements/DatagramSocketService.qbk
deleted file mode 100644
index da2f298..0000000
--- a/asio/src/doc/requirements/DatagramSocketService.qbk
+++ /dev/null
@@ -1,227 +0,0 @@
-[/
- / Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
- /
- / Distributed under the Boost Software License, Version 1.0. (See accompanying
- / file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- /]
-
-[section:DatagramSocketService Datagram socket service requirements]
-
-A datagram socket service must meet the requirements for a [link
-asio.reference.SocketService socket service], as well as the
-additional requirements listed below.
-
-In the table below, `X` denotes a datagram socket service class for protocol
-[link asio.reference.Protocol `Protocol`], `a` denotes a value of type
-`X`, `b` denotes a value of type `X::implementation_type`, `e` denotes a value
-of type `Protocol::endpoint`, `ec` denotes a value of type `error_code`, `f`
-denotes a value of type `socket_base::message_flags`, `mb` denotes a value
-satisfying [link asio.reference.MutableBufferSequence mutable buffer
-sequence] requirements, `rh` denotes a value meeting [link
-asio.reference.ReadHandler `ReadHandler`] requirements, `cb` denotes a
-value satisfying [link asio.reference.ConstBufferSequence constant
-buffer sequence] requirements, and `wh` denotes a value meeting [link
-asio.reference.WriteHandler `WriteHandler`] requirements.
-
-[table DatagramSocketService requirements
-  [[expression] [return type] [assertion/note\npre/post-condition]]
-  [
-    [`a.receive(b, mb, f, ec);`]
-    [`size_t`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Reads one or more bytes of data from a connected socket `b`.\n
-      \n
-      The mutable buffer sequence `mb` specifies memory where the data should
-      be placed. The operation shall always fill a buffer in the sequence
-      completely before proceeding to the next.\n
-      \n
-      If successful, returns the number of bytes read. Otherwise returns `0`.
-    ]
-  ]
-  [
-    [`a.async_receive(b, mb, f, rh);`]
-    [`void`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Initiates an asynchronous operation to read one or more bytes of data
-      from a connected socket `b`. The operation is performed via the
-      `io_service` object `a.get_io_service()` and behaves according to [link
-      asio.reference.asynchronous_operations asynchronous operation]
-      requirements.\n
-      \n
-      The mutable buffer sequence `mb` specifies memory where the data should
-      be placed. The operation shall always fill a buffer in the sequence
-      completely before proceeding to the next.\n
-      \n
-      The implementation shall maintain one or more copies of `mb` until such
-      time as the read operation no longer requires access to the memory
-      specified by the buffers in the sequence. The program must ensure the
-      memory is valid until:\n
-      \n
-      [mdash] the last copy of `mb` is destroyed, or\n
-      \n
-      [mdash] the handler for the asynchronous operation is invoked,\n
-      \n
-      whichever comes first.\n
-      \n
-      If the operation completes successfully, the `ReadHandler` object
-      `rh` is invoked with the number of bytes transferred. Otherwise it is
-      invoked with `0`.
-    ]
-  ]
-  [
-    [`a.receive_from(b, mb, e, f, ec);`]
-    [`size_t`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Reads one or more bytes of data from an unconnected socket `b`.\n
-      \n
-      The mutable buffer sequence `mb` specifies memory where the data should
-      be placed. The operation shall always fill a buffer in the sequence
-      completely before proceeding to the next.\n
-      \n
-      If successful, returns the number of bytes read. Otherwise returns `0`.
-    ]
-  ]
-  [
-    [`a.async_receive_from(b, mb, e, f, rh);`]
-    [`void`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Initiates an asynchronous operation to read one or more bytes of data
-      from an unconnected socket `b`. The operation is performed via the
-      `io_service` object `a.get_io_service()` and behaves according to [link
-      asio.reference.asynchronous_operations asynchronous operation]
-      requirements.\n
-      \n
-      The mutable buffer sequence `mb` specifies memory where the data should
-      be placed. The operation shall always fill a buffer in the sequence
-      completely before proceeding to the next.\n
-      \n
-      The implementation shall maintain one or more copies of `mb` until such
-      time as the read operation no longer requires access to the memory
-      specified by the buffers in the sequence. The program must ensure the
-      memory is valid until:\n
-      \n
-      [mdash] the last copy of `mb` is destroyed, or\n
-      \n
-      [mdash] the handler for the asynchronous operation is invoked,\n
-      \n
-      whichever comes first.\n
-      \n
-      The program must ensure the object `e` is valid until the handler
-      for the asynchronous operation is invoked.\n
-      \n
-      If the operation completes successfully, the `ReadHandler` object
-      `rh` is invoked with the number of bytes transferred. Otherwise it is
-      invoked with `0`.
-    ]
-  ]
-  [
-    [`a.send(b, cb, f, ec);`]
-    [`size_t`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Writes one or more bytes of data to a connected socket `b`.\n
-      \n
-      The constant buffer sequence `cb` specifies memory where the data to be
-      written is located. The operation shall always write a buffer in the
-      sequence completely before proceeding to the next.\n
-      \n
-      If successful, returns the number of bytes written. Otherwise returns `0`.
-    ]
-  ]
-  [
-    [`a.async_send(b, cb, f, wh);`]
-    [`void`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Initiates an asynchronous operation to write one or more bytes of data to
-      a connected socket `b`. The operation is performed via the `io_service`
-      object `a.get_io_service()` and behaves according to [link
-      asio.reference.asynchronous_operations asynchronous operation]
-      requirements.\n
-      \n
-      The constant buffer sequence `cb` specifies memory where the data to be
-      written is located. The operation shall always write a buffer in the
-      sequence completely before proceeding to the next.\n
-      \n
-      The implementation shall maintain one or more copies of `cb` until such
-      time as the write operation no longer requires access to the memory
-      specified by the buffers in the sequence. The program must ensure the
-      memory is valid until:\n
-      \n
-      [mdash] the last copy of `cb` is destroyed, or\n
-      \n
-      [mdash] the handler for the asynchronous operation is invoked,\n
-      \n
-      whichever comes first.\n
-      \n
-      If the operation completes successfully, the `WriteHandler` object `wh`
-      is invoked with the number of bytes transferred. Otherwise it is invoked
-      with `0`.
-    ]
-  ]
-  [
-    [``
-      const typename Protocol::endpoint& u = e;
-      a.send_to(b, cb, u, f, ec);
-    ``]
-    [`size_t`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Writes one or more bytes of data to an unconnected socket `b`.\n
-      \n
-      The constant buffer sequence `cb` specifies memory where the data to be
-      written is located. The operation shall always write a buffer in the
-      sequence completely before proceeding to the next.\n
-      \n
-      If successful, returns the number of bytes written. Otherwise returns `0`.
-    ]
-  ]
-  [
-    [``
-      const typename Protocol::endpoint& u = e;
-      a.async_send(b, cb, u, f, wh);
-    ``]
-    [`void`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Initiates an asynchronous operation to write one or more bytes of data to
-      an unconnected socket `b`. The operation is performed via the `io_service`
-      object `a.get_io_service()` and behaves according to [link
-      asio.reference.asynchronous_operations asynchronous operation]
-      requirements.\n
-      \n
-      The constant buffer sequence `cb` specifies memory where the data to be
-      written is located. The operation shall always write a buffer in the
-      sequence completely before proceeding to the next.\n
-      \n
-      The implementation shall maintain one or more copies of `cb` until such
-      time as the write operation no longer requires access to the memory
-      specified by the buffers in the sequence. The program must ensure the
-      memory is valid until:\n
-      \n
-      [mdash] the last copy of `cb` is destroyed, or\n
-      \n
-      [mdash] the handler for the asynchronous operation is invoked,\n
-      \n
-      whichever comes first.\n
-      \n
-      If the operation completes successfully, the `WriteHandler` object `wh`
-      is invoked with the number of bytes transferred. Otherwise it is invoked
-      with `0`.
-    ]
-  ]
-]
-
-[endsect]
diff --git a/asio/src/doc/requirements/DescriptorService.qbk b/asio/src/doc/requirements/DescriptorService.qbk
deleted file mode 100644
index ca39c5a..0000000
--- a/asio/src/doc/requirements/DescriptorService.qbk
+++ /dev/null
@@ -1,167 +0,0 @@
-[/
- / Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
- /
- / Distributed under the Boost Software License, Version 1.0. (See accompanying
- / file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- /]
-
-[section:DescriptorService Descriptor service requirements]
-
-A descriptor service must meet the requirements for an [link
-asio.reference.IoObjectService I/O object service] with support for movability,
-as well as the additional requirements listed below.
-
-In the table below, `X` denotes a descriptor service class, `a` and `ao` denote
-values of type `X`, `b` and `c` denote values of type `X::implementation_type`,
-`n` denotes a value of type `X::native_handle_type`, `ec` denotes a value of type
-`error_code`, `i` denotes a value meeting [link asio.reference.IoControlCommand
-`IoControlCommand`] requirements, `w` denotes a value of type
-`descriptor_base::wait_type`, `wh` denotes a value meeting [link
-asio.reference.WaitHandler `WaitHandler`] requirements, and `u` and `v` denote
-identifiers.
-
-[table DescriptorService requirements
-  [[expression] [return type] [assertion/note\npre/post-condition]]
-  [
-    [`X::native_handle_type`]
-    []
-    [
-      The implementation-defined native representation of a descriptor. Must
-      satisfy the requirements of `CopyConstructible` types (C++ Std, 20.1.3),
-      and the requirements of `Assignable` types (C++ Std, 23.1).
-    ]
-  ]
-  [
-    [`a.construct(b);`]
-    []
-    [
-      From [link asio.reference.IoObjectService IoObjectService]
-      requirements.\n
-      post: `!a.is_open(b)`.
-    ]
-  ]
-  [
-    [`a.destroy(b);`]
-    []
-    [
-      From [link asio.reference.IoObjectService IoObjectService]
-      requirements. Implicitly cancels asynchronous operations, as if by calling
-      `a.close(b, ec)`.
-    ]
-  ]
-  [
-    [``
-      a.move_construct(b, c);
-    ``]
-    []
-    [
-      From [link asio.reference.IoObjectService IoObjectService] requirements.
-      The underlying native representation is moved from `c` to `b`.
-    ]
-  ]
-  [
-    [``
-      a.move_assign(b, ao, c);
-    ``]
-    []
-    [
-      From [link asio.reference.IoObjectService IoObjectService] requirements.
-      Implicitly cancels asynchronous operations associated with `b`, as if by
-      calling `a.close(b, ec)`. Then the underlying native representation is
-      moved from `c` to `b`.
-    ]
-  ]
-  [
-    [``
-      a.assign(b, n, ec);
-    ``]
-    [`error_code`]
-    [
-      pre: `!a.is_open(b)`.\n
-      post: `!!ec || a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      a.is_open(b);
-    ``]
-    [`bool`]
-    [
-    ]
-  ]
-  [
-    [``
-      const X& u = a;
-      const X::implementation_type& v = b;
-      u.is_open(v);
-    ``]
-    [`bool`]
-    [
-    ]
-  ]
-  [
-    [``
-      a.close(b, ec);
-    ``]
-    [`error_code`]
-    [
-      If `a.is_open()` is true, causes any outstanding asynchronous operations
-      to complete as soon as possible. Handlers for cancelled operations shall
-      be passed the error code `error::operation_aborted`.\n
-      post: `!a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      a.native_handle(b);
-    ``]
-    [`X::native_handle_type`]
-    [
-    ]
-  ]
-  [
-    [``
-      a.cancel(b, ec);
-    ``]
-    [`error_code`]
-    [
-      pre: `a.is_open(b)`.\n
-      Causes any outstanding asynchronous operations to complete as soon as
-      possible. Handlers for cancelled operations shall be passed the error
-      code `error::operation_aborted`.
-    ]
-  ]
-  [
-    [``
-      a.io_control(b, i, ec);
-    ``]
-    [`error_code`]
-    [
-      pre: `a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      a.wait(b, w, ec);
-    ``]
-    [`error_code`]
-    [
-      pre: `a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      a.async_wait(b, w, wh);
-    ``]
-    []
-    [
-      pre: `a.is_open(b)`.\n
-      Initiates an asynchronous wait operation that is performed via the
-      `io_service` object `a.get_io_service()` and behaves according to [link
-      asio.reference.asynchronous_operations asynchronous operation]
-      requirements.
-    ]
-  ]
-]
-
-[endsect]
diff --git a/asio/src/doc/requirements/HandleService.qbk b/asio/src/doc/requirements/HandleService.qbk
deleted file mode 100644
index 3f0ab22..0000000
--- a/asio/src/doc/requirements/HandleService.qbk
+++ /dev/null
@@ -1,132 +0,0 @@
-[/
- / Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
- /
- / Distributed under the Boost Software License, Version 1.0. (See accompanying
- / file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- /]
-
-[section:HandleService Handle service requirements]
-
-A handle service must meet the requirements for an [link
-asio.reference.IoObjectService I/O object service] with support for movability,
-as well as the additional requirements listed below.
-
-In the table below, `X` denotes a handle service class, `a` and `ao` denote
-values of type `X`, `b` and `c` denote values of type `X::implementation_type`,
-`n` denotes a value of type `X::native_handle_type`, `ec` denotes a value of
-type `error_code`, and `u` and `v` denote identifiers.
-
-[table HandleService requirements
-  [[expression] [return type] [assertion/note\npre/post-condition]]
-  [
-    [`X::native_handle_type`]
-    []
-    [
-      The implementation-defined native representation of a handle. Must
-      satisfy the requirements of `CopyConstructible` types (C++ Std, 20.1.3),
-      and the requirements of `Assignable` types (C++ Std, 23.1).
-    ]
-  ]
-  [
-    [`a.construct(b);`]
-    []
-    [
-      From [link asio.reference.IoObjectService IoObjectService]
-      requirements.\n
-      post: `!a.is_open(b)`.
-    ]
-  ]
-  [
-    [`a.destroy(b);`]
-    []
-    [
-      From [link asio.reference.IoObjectService IoObjectService]
-      requirements. Implicitly cancels asynchronous operations, as if by calling
-      `a.close(b, ec)`.
-    ]
-  ]
-  [
-    [``
-      a.move_construct(b, c);
-    ``]
-    []
-    [
-      From [link asio.reference.IoObjectService IoObjectService] requirements.
-      The underlying native representation is moved from `c` to `b`.
-    ]
-  ]
-  [
-    [``
-      a.move_assign(b, ao, c);
-    ``]
-    []
-    [
-      From [link asio.reference.IoObjectService IoObjectService] requirements.
-      Implicitly cancels asynchronous operations associated with `b`, as if by
-      calling `a.close(b, ec)`. Then the underlying native representation is
-      moved from `c` to `b`.
-    ]
-  ]
-  [
-    [``
-      a.assign(b, n, ec);
-    ``]
-    [`error_code`]
-    [
-      pre: `!a.is_open(b)`.\n
-      post: `!!ec || a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      a.is_open(b);
-    ``]
-    [`bool`]
-    [
-    ]
-  ]
-  [
-    [``
-      const X& u = a;
-      const X::implementation_type& v = b;
-      u.is_open(v);
-    ``]
-    [`bool`]
-    [
-    ]
-  ]
-  [
-    [``
-      a.close(b, ec);
-    ``]
-    [`error_code`]
-    [
-      If `a.is_open()` is true, causes any outstanding asynchronous operations
-      to complete as soon as possible. Handlers for cancelled operations shall
-      be passed the error code `error::operation_aborted`.\n
-      post: `!a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      a.native_handle(b);
-    ``]
-    [`X::native_handle_type`]
-    [
-    ]
-  ]
-  [
-    [``
-      a.cancel(b, ec);
-    ``]
-    [`error_code`]
-    [
-      pre: `a.is_open(b)`.\n
-      Causes any outstanding asynchronous operations to complete as soon as
-      possible. Handlers for cancelled operations shall be passed the error
-      code `error::operation_aborted`.
-    ]
-  ]
-]
-
-[endsect]
diff --git a/asio/src/doc/requirements/ObjectHandleService.qbk b/asio/src/doc/requirements/ObjectHandleService.qbk
deleted file mode 100644
index 809ab9e..0000000
--- a/asio/src/doc/requirements/ObjectHandleService.qbk
+++ /dev/null
@@ -1,46 +0,0 @@
-[/
- / Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
- /
- / Distributed under the Boost Software License, Version 1.0. (See accompanying
- / file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- /]
-
-[section:ObjectHandleService Object handle service requirements]
-
-An object handle service must meet the requirements for a [link
-asio.reference.HandleService handle service], as well as the additional
-requirements listed below.
-
-In the table below, `X` denotes an object handle service class, `a` denotes a
-value of type `X`, `b` denotes a value of type `X::implementation_type`, `ec`
-denotes a value of type `error_code`, and `wh` denotes a value meeting [link
-asio.reference.WaitHandler `WaitHandler`] requirements.
-
-[table ObjectHandleService requirements
-  [[expression] [return type] [assertion/note\npre/post-condition]]
-  [
-    [`a.wait(b, ec);`]
-    [`error_code`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Synchronously waits for the object represented by handle `b` to become
-      signalled.
-    ]
-  ]
-  [
-    [`a.async_wait(b, wh);`]
-    [`void`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Initiates an asynchronous operation to wait for the object represented by
-      handle `b` to become signalled. The operation is performed via the
-      `io_service` object `a.get_io_service()` and behaves according to [link
-      asio.reference.asynchronous_operations asynchronous operation]
-      requirements.
-    ]
-  ]
-]
-
-[endsect]
diff --git a/asio/src/doc/requirements/RandomAccessHandleService.qbk b/asio/src/doc/requirements/RandomAccessHandleService.qbk
deleted file mode 100644
index 23b35a2..0000000
--- a/asio/src/doc/requirements/RandomAccessHandleService.qbk
+++ /dev/null
@@ -1,133 +0,0 @@
-[/
- / Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
- /
- / Distributed under the Boost Software License, Version 1.0. (See accompanying
- / file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- /]
-
-[section:RandomAccessHandleService Random access handle service requirements]
-
-A random access handle service must meet the requirements for a [link
-asio.reference.HandleService handle service], as well as the additional
-requirements listed below.
-
-In the table below, `X` denotes a random access handle service class, `a`
-denotes a value of type `X`, `b` denotes a value of type
-`X::implementation_type`, `ec` denotes a value of type `error_code`, `o`
-denotes an offset of type boost::uint64_t, `mb` denotes a value satisfying
-[link asio.reference.MutableBufferSequence mutable buffer sequence]
-requirements, `rh` denotes a value meeting [link asio.reference.ReadHandler
-`ReadHandler`] requirements, `cb` denotes a value satisfying [link
-asio.reference.ConstBufferSequence constant buffer sequence] requirements, and
-`wh` denotes a value meeting [link asio.reference.WriteHandler `WriteHandler`]
-requirements.
-
-[table RandomAccessHandleService requirements
-  [[expression] [return type] [assertion/note\npre/post-condition]]
-  [
-    [`a.read_some_at(b, o, mb, ec);`]
-    [`size_t`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Reads one or more bytes of data from a handle `b` at offset `o`.\n
-      \n
-      The mutable buffer sequence `mb` specifies memory where the data should
-      be placed. The operation shall always fill a buffer in the sequence
-      completely before proceeding to the next.\n
-      \n
-      If successful, returns the number of bytes read. Otherwise returns `0`.
-      If the total size of all buffers in the sequence `mb` is `0`, the
-      function shall return `0` immediately.
-    ]
-  ]
-  [
-    [`a.async_read_some_at(b, o, mb, rh);`]
-    [`void`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Initiates an asynchronous operation to read one or more bytes of data
-      from a handle `b` at offset `o`. The operation is performed via the
-      `io_service` object `a.get_io_service()` and behaves according to [link
-      asio.reference.asynchronous_operations asynchronous operation]
-      requirements.\n
-      \n
-      The mutable buffer sequence `mb` specifies memory where the data should
-      be placed. The operation shall always fill a buffer in the sequence
-      completely before proceeding to the next.\n
-      \n
-      The implementation shall maintain one or more copies of `mb` until such
-      time as the read operation no longer requires access to the memory
-      specified by the buffers in the sequence. The program must ensure the
-      memory is valid until:\n
-      \n
-      [mdash] the last copy of `mb` is destroyed, or\n
-      \n
-      [mdash] the handler for the asynchronous operation is invoked,\n
-      \n
-      whichever comes first. If the total size of all buffers in the sequence
-      `mb` is `0`, the asynchronous read operation shall complete immediately
-      and pass `0` as the argument to the handler that specifies the number of
-      bytes read.\n
-      \n
-      If the operation completes successfully, the `ReadHandler` object
-      `rh` is invoked with the number of bytes transferred. Otherwise it is
-      invoked with `0`.
-    ]
-  ]
-  [
-    [`a.write_some_at(b, o, cb, ec);`]
-    [`size_t`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Writes one or more bytes of data to a handle `b` at offset `o`.\n
-      \n
-      The constant buffer sequence `cb` specifies memory where the data to be
-      written is located. The operation shall always write a buffer in the
-      sequence completely before proceeding to the next.\n
-      \n
-      If successful, returns the number of bytes written. Otherwise returns `0`.
-      If the total size of all buffers in the sequence `cb` is `0`, the
-      function shall return `0` immediately.
-    ]
-  ]
-  [
-    [`a.async_write_some_at(b, o, cb, wh);`]
-    [`void`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Initiates an asynchronous operation to write one or more bytes of data to
-      a handle `b` at offset `o`. The operation is performed via the
-      `io_service` object `a.get_io_service()` and behaves according to [link
-      asio.reference.asynchronous_operations asynchronous operation]
-      requirements.\n
-      \n
-      The constant buffer sequence `cb` specifies memory where the data to be
-      written is located. The operation shall always write a buffer in the
-      sequence completely before proceeding to the next.\n
-      \n
-      The implementation shall maintain one or more copies of `cb` until such
-      time as the write operation no longer requires access to the memory
-      specified by the buffers in the sequence. The program must ensure the
-      memory is valid until:\n
-      \n
-      [mdash] the last copy of `cb` is destroyed, or\n
-      \n
-      [mdash] the handler for the asynchronous operation is invoked,\n
-      \n
-      whichever comes first. If the total size of all buffers in the sequence
-      `cb` is `0`, the asynchronous operation shall complete immediately and
-      pass `0` as the argument to the handler that specifies the number of
-      bytes read.\n
-      \n
-      If the operation completes successfully, the `WriteHandler` object `wh`
-      is invoked with the number of bytes transferred. Otherwise it is invoked
-      with `0`.
-    ]
-  ]
-]
-
-[endsect]
diff --git a/asio/src/doc/requirements/RawSocketService.qbk b/asio/src/doc/requirements/RawSocketService.qbk
deleted file mode 100644
index 99092c4..0000000
--- a/asio/src/doc/requirements/RawSocketService.qbk
+++ /dev/null
@@ -1,227 +0,0 @@
-[/
- / Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
- /
- / Distributed under the Boost Software License, Version 1.0. (See accompanying
- / file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- /]
-
-[section:RawSocketService Raw socket service requirements]
-
-A raw socket service must meet the requirements for a [link
-asio.reference.SocketService socket service], as well as the additional
-requirements listed below.
-
-In the table below, `X` denotes a raw socket service class for protocol
-[link asio.reference.Protocol `Protocol`], `a` denotes a value of type
-`X`, `b` denotes a value of type `X::implementation_type`, `e` denotes a value
-of type `Protocol::endpoint`, `ec` denotes a value of type `error_code`, `f`
-denotes a value of type `socket_base::message_flags`, `mb` denotes a value
-satisfying [link asio.reference.MutableBufferSequence mutable buffer
-sequence] requirements, `rh` denotes a value meeting [link
-asio.reference.ReadHandler `ReadHandler`] requirements, `cb` denotes a
-value satisfying [link asio.reference.ConstBufferSequence constant
-buffer sequence] requirements, and `wh` denotes a value meeting [link
-asio.reference.WriteHandler `WriteHandler`] requirements.
-
-[table RawSocketService requirements
-  [[expression] [return type] [assertion/note\npre/post-condition]]
-  [
-    [`a.receive(b, mb, f, ec);`]
-    [`size_t`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Reads one or more bytes of data from a connected socket `b`.\n
-      \n
-      The mutable buffer sequence `mb` specifies memory where the data should
-      be placed. The operation shall always fill a buffer in the sequence
-      completely before proceeding to the next.\n
-      \n
-      If successful, returns the number of bytes read. Otherwise returns `0`.
-    ]
-  ]
-  [
-    [`a.async_receive(b, mb, f, rh);`]
-    [`void`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Initiates an asynchronous operation to read one or more bytes of data
-      from a connected socket `b`. The operation is performed via the
-      `io_service` object `a.get_io_service()` and behaves according to [link
-      asio.reference.asynchronous_operations asynchronous operation]
-      requirements.\n
-      \n
-      The mutable buffer sequence `mb` specifies memory where the data should
-      be placed. The operation shall always fill a buffer in the sequence
-      completely before proceeding to the next.\n
-      \n
-      The implementation shall maintain one or more copies of `mb` until such
-      time as the read operation no longer requires access to the memory
-      specified by the buffers in the sequence. The program must ensure the
-      memory is valid until:\n
-      \n
-      [mdash] the last copy of `mb` is destroyed, or\n
-      \n
-      [mdash] the handler for the asynchronous operation is invoked,\n
-      \n
-      whichever comes first.\n
-      \n
-      If the operation completes successfully, the `ReadHandler` object
-      `rh` is invoked with the number of bytes transferred. Otherwise it is
-      invoked with `0`.
-    ]
-  ]
-  [
-    [`a.receive_from(b, mb, e, f, ec);`]
-    [`size_t`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Reads one or more bytes of data from an unconnected socket `b`.\n
-      \n
-      The mutable buffer sequence `mb` specifies memory where the data should
-      be placed. The operation shall always fill a buffer in the sequence
-      completely before proceeding to the next.\n
-      \n
-      If successful, returns the number of bytes read. Otherwise returns `0`.
-    ]
-  ]
-  [
-    [`a.async_receive_from(b, mb, e, f, rh);`]
-    [`void`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Initiates an asynchronous operation to read one or more bytes of data
-      from an unconnected socket `b`. The operation is performed via the
-      `io_service` object `a.get_io_service()` and behaves according to [link
-      asio.reference.asynchronous_operations asynchronous operation]
-      requirements.\n
-      \n
-      The mutable buffer sequence `mb` specifies memory where the data should
-      be placed. The operation shall always fill a buffer in the sequence
-      completely before proceeding to the next.\n
-      \n
-      The implementation shall maintain one or more copies of `mb` until such
-      time as the read operation no longer requires access to the memory
-      specified by the buffers in the sequence. The program must ensure the
-      memory is valid until:\n
-      \n
-      [mdash] the last copy of `mb` is destroyed, or\n
-      \n
-      [mdash] the handler for the asynchronous operation is invoked,\n
-      \n
-      whichever comes first.\n
-      \n
-      The program must ensure the object `e` is valid until the handler
-      for the asynchronous operation is invoked.\n
-      \n
-      If the operation completes successfully, the `ReadHandler` object
-      `rh` is invoked with the number of bytes transferred. Otherwise it is
-      invoked with `0`.
-    ]
-  ]
-  [
-    [`a.send(b, cb, f, ec);`]
-    [`size_t`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Writes one or more bytes of data to a connected socket `b`.\n
-      \n
-      The constant buffer sequence `cb` specifies memory where the data to be
-      written is located. The operation shall always write a buffer in the
-      sequence completely before proceeding to the next.\n
-      \n
-      If successful, returns the number of bytes written. Otherwise returns `0`.
-    ]
-  ]
-  [
-    [`a.async_send(b, cb, f, wh);`]
-    [`void`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Initiates an asynchronous operation to write one or more bytes of data to
-      a connected socket `b`. The operation is performed via the `io_service`
-      object `a.get_io_service()` and behaves according to [link
-      asio.reference.asynchronous_operations asynchronous operation]
-      requirements.\n
-      \n
-      The constant buffer sequence `cb` specifies memory where the data to be
-      written is located. The operation shall always write a buffer in the
-      sequence completely before proceeding to the next.\n
-      \n
-      The implementation shall maintain one or more copies of `cb` until such
-      time as the write operation no longer requires access to the memory
-      specified by the buffers in the sequence. The program must ensure the
-      memory is valid until:\n
-      \n
-      [mdash] the last copy of `cb` is destroyed, or\n
-      \n
-      [mdash] the handler for the asynchronous operation is invoked,\n
-      \n
-      whichever comes first.\n
-      \n
-      If the operation completes successfully, the `WriteHandler` object `wh`
-      is invoked with the number of bytes transferred. Otherwise it is invoked
-      with `0`.
-    ]
-  ]
-  [
-    [``
-      const typename Protocol::endpoint& u = e;
-      a.send_to(b, cb, u, f, ec);
-    ``]
-    [`size_t`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Writes one or more bytes of data to an unconnected socket `b`.\n
-      \n
-      The constant buffer sequence `cb` specifies memory where the data to be
-      written is located. The operation shall always write a buffer in the
-      sequence completely before proceeding to the next.\n
-      \n
-      If successful, returns the number of bytes written. Otherwise returns `0`.
-    ]
-  ]
-  [
-    [``
-      const typename Protocol::endpoint& u = e;
-      a.async_send(b, cb, u, f, wh);
-    ``]
-    [`void`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Initiates an asynchronous operation to write one or more bytes of data to
-      an unconnected socket `b`. The operation is performed via the `io_service`
-      object `a.get_io_service()` and behaves according to [link
-      asio.reference.asynchronous_operations asynchronous operation]
-      requirements.\n
-      \n
-      The constant buffer sequence `cb` specifies memory where the data to be
-      written is located. The operation shall always write a buffer in the
-      sequence completely before proceeding to the next.\n
-      \n
-      The implementation shall maintain one or more copies of `cb` until such
-      time as the write operation no longer requires access to the memory
-      specified by the buffers in the sequence. The program must ensure the
-      memory is valid until:\n
-      \n
-      [mdash] the last copy of `cb` is destroyed, or\n
-      \n
-      [mdash] the handler for the asynchronous operation is invoked,\n
-      \n
-      whichever comes first.\n
-      \n
-      If the operation completes successfully, the `WriteHandler` object `wh`
-      is invoked with the number of bytes transferred. Otherwise it is invoked
-      with `0`.
-    ]
-  ]
-]
-
-[endsect]
diff --git a/asio/src/doc/requirements/ResolverService.qbk b/asio/src/doc/requirements/ResolverService.qbk
deleted file mode 100644
index 744686d..0000000
--- a/asio/src/doc/requirements/ResolverService.qbk
+++ /dev/null
@@ -1,108 +0,0 @@
-[/
- / Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
- /
- / Distributed under the Boost Software License, Version 1.0. (See accompanying
- / file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- /]
-
-[section:ResolverService Resolver service requirements]
-
-A resolver service must meet the requirements for an [link
-asio.reference.IoObjectService I/O object service], as well as the
-additional requirements listed below.
-
-In the table below, `X` denotes a resolver service class for protocol
-`InternetProtocol`, `a` denotes a value of type `X`, `b` denotes a value of
-type `X::implementation_type`, `q` denotes a value of type
-`ip::basic_resolver_query<InternetProtocol>`, `e` denotes a value of type
-`ip::basic_endpoint<InternetProtocol>`, `ec` denotes a value of type
-`error_code`, and `h` denotes a value meeting [link
-asio.reference.ResolveHandler `ResolveHandler`] requirements.
-
-[table ResolverService requirements
-  [[expression] [return type] [assertion/note\npre/post-condition]]
-  [
-    [`a.destroy(b);`]
-    []
-    [
-      From [link asio.reference.IoObjectService IoObjectService]
-      requirements. Implicitly cancels asynchronous resolve operations, as if by
-      calling `a.cancel(b, ec)`.
-    ]
-  ]
-  [
-    [``
-      a.cancel(b, ec);
-    ``]
-    [`error_code`]
-    [
-      Causes any outstanding asynchronous resolve operations to complete as
-      soon as possible. Handlers for cancelled operations shall be passed the
-      error code `error::operation_aborted`.
-    ]
-  ]
-  [
-    [``
-      a.resolve(b, q, ec);
-    ``]
-    [``
-      ip::basic_resolver_iterator<
-        InternetProtocol>
-    ``]
-    [
-      On success, returns an iterator `i` such that `i !=
-      ip::basic_resolver_iterator<InternetProtocol>()`. Otherwise returns
-      `ip::basic_resolver_iterator<InternetProtocol>()`.
-    ]
-  ]
-  [
-    [``
-      a.async_resolve(b, q, h);
-    ``]
-    []
-    [
-      Initiates an asynchronous resolve operation that is performed via the
-      `io_service` object `a.get_io_service()` and behaves according to [link
-      asio.reference.asynchronous_operations asynchronous operation]
-      requirements.\n
-      \n
-      If the operation completes successfully, the `ResolveHandler` object `h`
-      shall be invoked with an iterator object `i` such that the condition `i
-      != ip::basic_resolver_iterator<InternetProtocol>()` holds. Otherwise it
-      is invoked with `ip::basic_resolver_iterator<InternetProtocol>()`.
-    ]
-  ]
-  [
-    [``
-      a.resolve(b, e, ec);
-    ``]
-    [``
-      ip::basic_resolver_iterator<
-        InternetProtocol>
-    ``]
-    [
-      On success, returns an iterator `i` such that `i !=
-      ip::basic_resolver_iterator<InternetProtocol>()`. Otherwise returns
-      `ip::basic_resolver_iterator<InternetProtocol>()`.
-    ]
-  ]
-  [
-    [``
-      a.async_resolve(b, e, h);
-    ``]
-    []
-    [
-      Initiates an asynchronous resolve operation that is performed via the
-      `io_service` object `a.get_io_service()` and behaves according to [link
-      asio.reference.asynchronous_operations asynchronous operation]
-      requirements.\n
-      \n
-      If the operation completes successfully, the `ResolveHandler` object `h`
-      shall be invoked with an iterator object `i` such that the condition `i
-      != ip::basic_resolver_iterator<InternetProtocol>()` holds. Otherwise it
-      is invoked with `ip::basic_resolver_iterator<InternetProtocol>()`.
-    ]
-  ]
-]
-
-[endsect]
diff --git a/asio/src/doc/requirements/SeqPacketSocketService.qbk b/asio/src/doc/requirements/SeqPacketSocketService.qbk
deleted file mode 100644
index b8b2689..0000000
--- a/asio/src/doc/requirements/SeqPacketSocketService.qbk
+++ /dev/null
@@ -1,127 +0,0 @@
-[/
- / Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
- /
- / Distributed under the Boost Software License, Version 1.0. (See accompanying
- / file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- /]
-
-[section:SeqPacketSocketService Sequenced packet socket service requirements]
-
-A sequenced packet socket service must meet the requirements for a [link
-asio.reference.SocketService socket service], as well as the additional
-requirements listed below.
-
-In the table below, `X` denotes a stream socket service class, `a` denotes a
-value of type `X`, `b` denotes a value of type `X::implementation_type`, `ec`
-denotes a value of type `error_code`, `f` denotes a value of type
-`socket_base::message_flags`, `g` denotes an lvalue of type
-`socket_base::message_flags`, `mb` denotes a value satisfying [link
-asio.reference.MutableBufferSequence mutable buffer sequence] requirements,
-`rh` denotes a value meeting [link asio.reference.ReadHandler `ReadHandler`]
-requirements, `cb` denotes a value satisfying [link
-asio.reference.ConstBufferSequence constant buffer sequence] requirements, and
-`wh` denotes a value meeting [link asio.reference.WriteHandler `WriteHandler`]
-requirements.
-
-[table StreamSocketService requirements
-  [[expression] [return type] [assertion/note\npre/post-condition]]
-  [
-    [`a.receive(b, mb, f, g, ec);`]
-    [`size_t`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Reads one or more bytes of data from a connected socket `b`.\n
-      \n
-      The mutable buffer sequence `mb` specifies memory where the data should
-      be placed. The operation shall always fill a buffer in the sequence
-      completely before proceeding to the next.\n
-      \n
-      If successful, sets `g` to the flags associated with the received data,
-      and returns the number of bytes read. Otherwise, sets `g` to `0` and
-      returns `0`.
-    ]
-  ]
-  [
-    [`a.async_receive(b, mb, f, g, rh);`]
-    [`void`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Initiates an asynchronous operation to read one or more bytes of data
-      from a connected socket `b`. The operation is performed via the
-      `io_service` object `a.get_io_service()` and behaves according to [link
-      asio.reference.asynchronous_operations asynchronous operation]
-      requirements.\n
-      \n
-      The mutable buffer sequence `mb` specifies memory where the data should
-      be placed. The operation shall always fill a buffer in the sequence
-      completely before proceeding to the next.\n
-      \n
-      The implementation shall maintain one or more copies of `mb` until such
-      time as the read operation no longer requires access to the memory
-      specified by the buffers in the sequence. The program must ensure the
-      memory is valid until:\n
-      \n
-      [mdash] the last copy of `mb` is destroyed, or\n
-      \n
-      [mdash] the handler for the asynchronous operation is invoked,\n
-      \n
-      whichever comes first.\n
-      \n
-      If the operation completes successfully, sets `g` to the flags associated
-      with the received data, then invokes the `ReadHandler` object `rh` with
-      the number of bytes transferred. Otherwise, sets `g` to `0` and invokes
-      `rh` with `0` bytes transferred.
-    ]
-  ]
-  [
-    [`a.send(b, cb, f, ec);`]
-    [`size_t`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Writes one or more bytes of data to a connected socket `b`.\n
-      \n
-      The constant buffer sequence `cb` specifies memory where the data to be
-      written is located. The operation shall always write a buffer in the
-      sequence completely before proceeding to the next.\n
-      \n
-      If successful, returns the number of bytes written. Otherwise returns `0`.
-    ]
-  ]
-  [
-    [`a.async_send(b, cb, f, wh);`]
-    [`void`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Initiates an asynchronous operation to write one or more bytes of data to
-      a connected socket `b`. The operation is performed via the `io_service`
-      object `a.get_io_service()` and behaves according to [link
-      asio.reference.asynchronous_operations asynchronous operation]
-      requirements.\n
-      \n
-      The constant buffer sequence `cb` specifies memory where the data to be
-      written is located. The operation shall always write a buffer in the
-      sequence completely before proceeding to the next.\n
-      \n
-      The implementation shall maintain one or more copies of `cb` until such
-      time as the write operation no longer requires access to the memory
-      specified by the buffers in the sequence. The program must ensure the
-      memory is valid until:\n
-      \n
-      [mdash] the last copy of `cb` is destroyed, or\n
-      \n
-      [mdash] the handler for the asynchronous operation is invoked,\n
-      \n
-      whichever comes first.\n
-      \n
-      If the operation completes successfully, the `WriteHandler` object `wh`
-      is invoked with the number of bytes transferred. Otherwise it is invoked
-      with `0`.
-    ]
-  ]
-]
-
-[endsect]
diff --git a/asio/src/doc/requirements/SerialPortService.qbk b/asio/src/doc/requirements/SerialPortService.qbk
deleted file mode 100644
index 02ecfd0..0000000
--- a/asio/src/doc/requirements/SerialPortService.qbk
+++ /dev/null
@@ -1,301 +0,0 @@
-[/
- / Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
- /
- / Distributed under the Boost Software License, Version 1.0. (See accompanying
- / file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- /]
-
-[section:SerialPortService Serial port service requirements]
-
-A serial port service must meet the requirements for an [link
-asio.reference.IoObjectService I/O object service] with support for movability,
-as well as the additional requirements listed below.
-
-In the table below, `X` denotes a serial port service class, `a` and `ao` denote
-values of type `X`, `d` denotes a serial port device name of type `std::string`,
-`b` and `c` denote values of type `X::implementation_type`, `n` denotes a value
-of type `X::native_handle_type`, `ec` denotes a value of type `error_code`, `s`
-denotes a value meeting [link asio.reference.SettableSerialPortOption
-`SettableSerialPortOption`] requirements, `g` denotes a value meeting [link
-asio.reference.GettableSerialPortOption `GettableSerialPortOption`]
-requirements, `mb` denotes a value satisfying [link
-asio.reference.MutableBufferSequence mutable buffer sequence] requirements,
-`rh` denotes a value meeting [link asio.reference.ReadHandler `ReadHandler`]
-requirements, `cb` denotes a value satisfying [link
-asio.reference.ConstBufferSequence constant buffer sequence] requirements, and
-`wh` denotes a value meeting [link asio.reference.WriteHandler `WriteHandler`]
-requirements. and `u` and `v` denote identifiers.
-
-[table SerialPortService requirements
-  [[expression] [return type] [assertion/note\npre/post-condition]]
-  [
-    [`X::native_handle_type`]
-    []
-    [
-      The implementation-defined native representation of a serial port. Must
-      satisfy the requirements of `CopyConstructible` types (C++ Std, 20.1.3),
-      and the requirements of `Assignable` types (C++ Std, 23.1).
-    ]
-  ]
-  [
-    [`a.construct(b);`]
-    []
-    [
-      From [link asio.reference.IoObjectService IoObjectService]
-      requirements.\n
-      post: `!a.is_open(b)`.
-    ]
-  ]
-  [
-    [`a.destroy(b);`]
-    []
-    [
-      From [link asio.reference.IoObjectService IoObjectService]
-      requirements. Implicitly cancels asynchronous operations, as if by calling
-      `a.close(b, ec)`.
-    ]
-  ]
-  [
-    [``
-      a.move_construct(b, c);
-    ``]
-    []
-    [
-      From [link asio.reference.IoObjectService IoObjectService] requirements.
-      The underlying native representation is moved from `c` to `b`.
-    ]
-  ]
-  [
-    [``
-      a.move_assign(b, ao, c);
-    ``]
-    []
-    [
-      From [link asio.reference.IoObjectService IoObjectService] requirements.
-      Implicitly cancels asynchronous operations associated with `b`, as if by
-      calling `a.close(b, ec)`. Then the underlying native representation is
-      moved from `c` to `b`.
-    ]
-  ]
-  [
-    [``
-      const std::string& u = d;
-      a.open(b, u, ec);
-    ``]
-    [`error_code`]
-    [
-      pre: `!a.is_open(b)`.\n
-      post: `!!ec || a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      a.assign(b, n, ec);
-    ``]
-    [`error_code`]
-    [
-      pre: `!a.is_open(b)`.\n
-      post: `!!ec || a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      a.is_open(b);
-    ``]
-    [`bool`]
-    [
-    ]
-  ]
-  [
-    [``
-      const X& u = a;
-      const X::implementation_type& v = b;
-      u.is_open(v);
-    ``]
-    [`bool`]
-    [
-    ]
-  ]
-  [
-    [``
-      a.close(b, ec);
-    ``]
-    [`error_code`]
-    [
-      If `a.is_open()` is true, causes any outstanding asynchronous operations
-      to complete as soon as possible. Handlers for cancelled operations shall
-      be passed the error code `error::operation_aborted`.\n
-      post: `!a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      a.native_handle(b);
-    ``]
-    [`X::native_handle_type`]
-    [
-    ]
-  ]
-  [
-    [``
-      a.cancel(b, ec);
-    ``]
-    [`error_code`]
-    [
-      pre: `a.is_open(b)`.\n
-      Causes any outstanding asynchronous operations to complete as soon as
-      possible. Handlers for cancelled operations shall be passed the error
-      code `error::operation_aborted`.
-    ]
-  ]
-  [
-    [``
-      a.set_option(b, s, ec);
-    ``]
-    [`error_code`]
-    [
-      pre: `a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      a.get_option(b, g, ec);
-    ``]
-    [`error_code`]
-    [
-      pre: `a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      const X& u = a;
-      const X::implementation_type& v = b;
-      u.get_option(v, g, ec);
-    ``]
-    [`error_code`]
-    [
-      pre: `a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      a.send_break(b, ec);
-    ``]
-    [`error_code`]
-    [
-      pre: `a.is_open(b)`.
-    ]
-  ]
-  [
-    [`a.read_some(b, mb, ec);`]
-    [`size_t`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Reads one or more bytes of data from a serial port `b`.\n
-      \n
-      The mutable buffer sequence `mb` specifies memory where the data should
-      be placed. The operation shall always fill a buffer in the sequence
-      completely before proceeding to the next.\n
-      \n
-      If successful, returns the number of bytes read. Otherwise returns `0`.
-      If the total size of all buffers in the sequence `mb` is `0`, the
-      function shall return `0` immediately.\n
-      \n
-      If the operation completes due to graceful connection closure by the
-      peer, the operation shall fail with `error::eof`.
-    ]
-  ]
-  [
-    [`a.async_read_some(b, mb, rh);`]
-    [`void`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Initiates an asynchronous operation to read one or more bytes of data
-      from a serial port `b`. The operation is performed via the
-      `io_service` object `a.get_io_service()` and behaves according to [link
-      asio.reference.asynchronous_operations asynchronous operation]
-      requirements.\n
-      \n
-      The mutable buffer sequence `mb` specifies memory where the data should
-      be placed. The operation shall always fill a buffer in the sequence
-      completely before proceeding to the next.\n
-      \n
-      The implementation shall maintain one or more copies of `mb` until such
-      time as the read operation no longer requires access to the memory
-      specified by the buffers in the sequence. The program must ensure the
-      memory is valid until:\n
-      \n
-      [mdash] the last copy of `mb` is destroyed, or\n
-      \n
-      [mdash] the handler for the asynchronous operation is invoked,\n
-      \n
-      whichever comes first. If the total size of all buffers in the sequence
-      `mb` is `0`, the asynchronous read operation shall complete immediately
-      and pass `0` as the argument to the handler that specifies the number of
-      bytes read.\n
-      \n
-      If the operation completes due to graceful connection closure by the
-      peer, the operation shall fail with `error::eof`.\n
-      \n
-      If the operation completes successfully, the `ReadHandler` object
-      `rh` is invoked with the number of bytes transferred. Otherwise it is
-      invoked with `0`.
-    ]
-  ]
-  [
-    [`a.write_some(b, cb, ec);`]
-    [`size_t`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Writes one or more bytes of data to a serial port `b`.\n
-      \n
-      The constant buffer sequence `cb` specifies memory where the data to be
-      written is located. The operation shall always write a buffer in the
-      sequence completely before proceeding to the next.\n
-      \n
-      If successful, returns the number of bytes written. Otherwise returns `0`.
-      If the total size of all buffers in the sequence `cb` is `0`, the
-      function shall return `0` immediately.
-    ]
-  ]
-  [
-    [`a.async_write_some(b, cb, wh);`]
-    [`void`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Initiates an asynchronous operation to write one or more bytes of data to
-      a serial port `b`. The operation is performed via the `io_service`
-      object `a.get_io_service()` and behaves according to [link
-      asio.reference.asynchronous_operations asynchronous operation]
-      requirements.\n
-      \n
-      The constant buffer sequence `cb` specifies memory where the data to be
-      written is located. The operation shall always write a buffer in the
-      sequence completely before proceeding to the next.\n
-      \n
-      The implementation shall maintain one or more copies of `cb` until such
-      time as the write operation no longer requires access to the memory
-      specified by the buffers in the sequence. The program must ensure the
-      memory is valid until:\n
-      \n
-      [mdash] the last copy of `cb` is destroyed, or\n
-      \n
-      [mdash] the handler for the asynchronous operation is invoked,\n
-      \n
-      whichever comes first. If the total size of all buffers in the sequence
-      `cb` is `0`, the asynchronous operation shall complete immediately and
-      pass `0` as the argument to the handler that specifies the number of
-      bytes read.\n
-      \n
-      If the operation completes successfully, the `WriteHandler` object `wh`
-      is invoked with the number of bytes transferred. Otherwise it is invoked
-      with `0`.
-    ]
-  ]
-]
-
-[endsect]
diff --git a/asio/src/doc/requirements/SignalSetService.qbk b/asio/src/doc/requirements/SignalSetService.qbk
deleted file mode 100644
index 04f60ef..0000000
--- a/asio/src/doc/requirements/SignalSetService.qbk
+++ /dev/null
@@ -1,91 +0,0 @@
-[/
- / Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
- /
- / Distributed under the Boost Software License, Version 1.0. (See accompanying
- / file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- /]
-
-[section:SignalSetService Signal set service requirements]
-
-A signal set service must meet the requirements for an [link
-asio.reference.IoObjectService I/O object service], as well as the
-additional requirements listed below.
-
-In the table below, `X` denotes a signal set service class, `a` denotes a value
-of type `X`, `b` denotes a value of type `X::implementation_type`, `ec` denotes
-a value of type `error_code`, `n` denotes a value of type `int`, and `sh`
-denotes a value meeting [link asio.reference.SignalHandler `SignalHandler`]
-requirements.
-
-[table SignalSetService requirements
-  [[expression] [return type] [assertion/note\npre/post-condition]]
-  [
-    [`a.construct(b);`]
-    []
-    [
-      From [link asio.reference.IoObjectService IoObjectService]
-      requirements.\n
-    ]
-  ]
-  [
-    [`a.destroy(b);`]
-    []
-    [
-      From [link asio.reference.IoObjectService IoObjectService]
-      requirements. Implicitly clears the registered signals as if by calling
-      `a.clear(b, ec)`, then implicitly cancels outstanding asynchronous
-      operations as if by calling `a.cancel(b, ec)`.
-    ]
-  ]
-  [
-    [``
-      a.add(b, n, ec);
-    ``]
-    [`error_code`]
-    [
-    ]
-  ]
-  [
-    [``
-      a.remove(b, n, ec);
-    ``]
-    [`error_code`]
-    [
-    ]
-  ]
-  [
-    [``
-      a.clear(b, ec);
-    ``]
-    [`error_code`]
-    [
-    ]
-  ]
-  [
-    [``
-      a.cancel(b, ec);
-    ``]
-    [`error_code`]
-    [
-    ]
-  ]
-  [
-    [`a.async_wait(b, sh);`]
-    [`void`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Initiates an asynchronous operation to wait for the delivery of one of the
-      signals registered for the signal set `b`. The operation is performed via
-      the `io_service` object `a.get_io_service()` and behaves according to
-      [link asio.reference.asynchronous_operations asynchronous operation]
-      requirements.\n
-      \n
-      If the operation completes successfully, the `SignalHandler` object
-      `sh` is invoked with the number identifying the delivered signal. Otherwise
-      it is invoked with `0`.
-    ]
-  ]
-]
-
-[endsect]
diff --git a/asio/src/doc/requirements/SocketAcceptorService.qbk b/asio/src/doc/requirements/SocketAcceptorService.qbk
deleted file mode 100644
index d40a22c..0000000
--- a/asio/src/doc/requirements/SocketAcceptorService.qbk
+++ /dev/null
@@ -1,270 +0,0 @@
-[/
- / Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
- /
- / Distributed under the Boost Software License, Version 1.0. (See accompanying
- / file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- /]
-
-[section:SocketAcceptorService Socket acceptor service requirements]
-
-A socket acceptor service must meet the requirements for an [link
-asio.reference.IoObjectService I/O object service], as well as the
-additional requirements listed below.
-
-In the table below, `X` denotes a socket acceptor service class for protocol
-[link asio.reference.Protocol `Protocol`], `a` and `ao` denote values of type
-`X`, `b` and `c` denote values of type `X::implementation_type`, `p` denotes a
-value of type `Protocol`, `n` denotes a value of type `X::native_handle_type`,
-`e` denotes a value of type `Protocol::endpoint`, `ec` denotes a value of type
-`error_code`, `s` denotes a value meeting [link
-asio.reference.SettableSocketOption `SettableSocketOption`] requirements, `g`
-denotes a value meeting [link asio.reference.GettableSocketOption
-`GettableSocketOption`] requirements, `i` denotes a value meeting [link
-asio.reference.IoControlCommand `IoControlCommand`] requirements, `k` denotes a
-value of type `basic_socket<Protocol, SocketService>` where `SocketService` is
-a type meeting [link asio.reference.SocketService socket service] requirements,
-`ah` denotes a value meeting [link asio.reference.AcceptHandler
-`AcceptHandler`] requirements, and `u` and `v` denote identifiers.
-
-[table SocketAcceptorService requirements
-  [[expression] [return type] [assertion/note\npre/post-condition]]
-  [
-    [`X::native_handle_type`]
-    []
-    [
-      The implementation-defined native representation of a socket acceptor.
-      Must satisfy the requirements of `CopyConstructible` types (C++ Std,
-      20.1.3), and the requirements of `Assignable` types (C++ Std, 23.1).
-    ]
-  ]
-  [
-    [`a.construct(b);`]
-    []
-    [
-      From [link asio.reference.IoObjectService IoObjectService]
-      requirements.\n
-      post: `!a.is_open(b)`.
-    ]
-  ]
-  [
-    [`a.destroy(b);`]
-    []
-    [
-      From [link asio.reference.IoObjectService IoObjectService]
-      requirements. Implicitly cancels asynchronous operations, as if by calling
-      `a.close(b, ec)`.
-    ]
-  ]
-  [
-    [``
-      a.move_construct(b, c);
-    ``]
-    []
-    [
-      From [link asio.reference.IoObjectService IoObjectService] requirements.
-      The underlying native representation is moved from `c` to `b`.
-    ]
-  ]
-  [
-    [``
-      a.move_assign(b, ao, c);
-    ``]
-    []
-    [
-      From [link asio.reference.IoObjectService IoObjectService] requirements.
-      Implicitly cancels asynchronous operations associated with `b`, as if by
-      calling `a.close(b, ec)`. Then the underlying native representation is
-      moved from `c` to `b`.
-    ]
-  ]
-  [
-    [``
-      a.open(b, p, ec);
-    ``]
-    [`error_code`]
-    [
-      pre: `!a.is_open(b)`.\n
-      post: `!!ec || a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      a.assign(b, p, n, ec);
-    ``]
-    [`error_code`]
-    [
-      pre: `!a.is_open(b)`.\n
-      post: `!!ec || a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      a.is_open(b);
-    ``]
-    [`bool`]
-    [
-    ]
-  ]
-  [
-    [``
-      const X& u = a;
-      const X::implementation_type& v = b;
-      u.is_open(v);
-    ``]
-    [`bool`]
-    [
-    ]
-  ]
-  [
-    [``
-      a.close(b, ec);
-    ``]
-    [`error_code`]
-    [
-      If `a.is_open()` is true, causes any outstanding asynchronous operations
-      to complete as soon as possible. Handlers for cancelled operations shall
-      be passed the error code `error::operation_aborted`.\n
-      post: `!a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      a.native_handle(b);
-    ``]
-    [`X::native_handle_type`]
-    [
-    ]
-  ]
-  [
-    [``
-      a.cancel(b, ec);
-    ``]
-    [`error_code`]
-    [
-      pre: `a.is_open(b)`.\n
-      Causes any outstanding asynchronous operations to complete as soon as
-      possible. Handlers for cancelled operations shall be passed the error
-      code `error::operation_aborted`.
-    ]
-  ]
-  [
-    [``
-      a.set_option(b, s, ec);
-    ``]
-    [`error_code`]
-    [
-      pre: `a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      a.get_option(b, g, ec);
-    ``]
-    [`error_code`]
-    [
-      pre: `a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      const X& u = a;
-      const X::implementation_type& v = b;
-      u.get_option(v, g, ec);
-    ``]
-    [`error_code`]
-    [
-      pre: `a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      a.io_control(b, i, ec);
-    ``]
-    [`error_code`]
-    [
-      pre: `a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      const typename Protocol::endpoint& u = e;
-      a.bind(b, u, ec);
-    ``]
-    [`error_code`]
-    [
-      pre: `a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      a.local_endpoint(b, ec);
-    ``]
-    [`Protocol::endpoint`]
-    [
-      pre: `a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      const X& u = a;
-      const X::implementation_type& v = b;
-      u.local_endpoint(v, ec);
-    ``]
-    [`Protocol::endpoint`]
-    [
-      pre: `a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      a.accept(b, k, &e, ec);
-    ``]
-    [`error_code`]
-    [
-      pre: `a.is_open(b) && !k.is_open()`.\n
-      post: `k.is_open()`
-    ]
-  ]
-  [
-    [``
-      a.accept(b, k, 0, ec);
-    ``]
-    [`error_code`]
-    [
-      pre: `a.is_open(b) && !k.is_open()`.\n
-      post: `k.is_open()`
-    ]
-  ]
-  [
-    [``
-      a.async_accept(b, k, &e, ah);
-    ``]
-    []
-    [
-      pre: `a.is_open(b) && !k.is_open()`.\n
-      Initiates an asynchronous accept operation that is performed via the
-      `io_service` object `a.get_io_service()` and behaves according to [link
-      asio.reference.asynchronous_operations asynchronous operation]
-      requirements.\n\n
-      The program must ensure the objects `k` and `e` are valid until the
-      handler for the asynchronous operation is invoked.
-    ]
-  ]
-  [
-    [``
-      a.async_accept(b, k, 0, ah);
-    ``]
-    []
-    [
-      pre: `a.is_open(b) && !k.is_open()`.\n
-      Initiates an asynchronous accept operation that is performed via the
-      `io_service` object `a.get_io_service()` and behaves according to [link
-      asio.reference.asynchronous_operations asynchronous operation]
-      requirements.\n\n
-      The program must ensure the object `k` is valid until the handler for the
-      asynchronous operation is invoked.
-    ]
-  ]
-]
-
-[endsect]
diff --git a/asio/src/doc/requirements/SocketService.qbk b/asio/src/doc/requirements/SocketService.qbk
deleted file mode 100644
index 0245900..0000000
--- a/asio/src/doc/requirements/SocketService.qbk
+++ /dev/null
@@ -1,336 +0,0 @@
-[/
- / Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
- /
- / Distributed under the Boost Software License, Version 1.0. (See accompanying
- / file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- /]
-
-[section:SocketService Socket service requirements]
-
-A socket service must meet the requirements for an [link
-asio.reference.IoObjectService I/O object service] with support for movability,
-as well as the  additional requirements listed below.
-
-In the table below, `X` denotes a socket service class for protocol [link
-asio.reference.Protocol `Protocol`], `a` and `ao` denote values of type `X`,
-`b` and `c` denote values of type `X::implementation_type`, `p` denotes a value
-of type `Protocol`, `n` denotes a value of type `X::native_handle_type`, `e`
-denotes a value of type `Protocol::endpoint`, `ec` denotes a value of type
-`error_code`, `s` denotes a value meeting [link
-asio.reference.SettableSocketOption `SettableSocketOption`] requirements, `g`
-denotes a value meeting [link asio.reference.GettableSocketOption
-`GettableSocketOption`] requirements, `i` denotes a value meeting [link
-asio.reference.IoControlCommand `IoControlCommand`] requirements, `h` denotes a
-value of type `socket_base::shutdown_type`, `ch` denotes a value meeting [link
-asio.reference.ConnectHandler `ConnectHandler`] requirements, `w` denotes a
-value of type `socket_base::wait_type`, `wh` denotes a value meeting [link
-asio.reference.WaitHandler `WaitHandler`] requirements, and `u` and `v` denote
-identifiers.
-
-[table SocketService requirements
-  [[expression] [return type] [assertion/note\npre/post-condition]]
-  [
-    [`X::native_handle_type`]
-    []
-    [
-      The implementation-defined native representation of a socket. Must
-      satisfy the requirements of `CopyConstructible` types (C++ Std, 20.1.3),
-      and the requirements of `Assignable` types (C++ Std, 23.1).
-    ]
-  ]
-  [
-    [`a.construct(b);`]
-    []
-    [
-      From [link asio.reference.IoObjectService IoObjectService]
-      requirements.\n
-      post: `!a.is_open(b)`.
-    ]
-  ]
-  [
-    [`a.destroy(b);`]
-    []
-    [
-      From [link asio.reference.IoObjectService IoObjectService]
-      requirements. Implicitly cancels asynchronous operations, as if by calling
-      `a.close(b, ec)`.
-    ]
-  ]
-  [
-    [``
-      a.move_construct(b, c);
-    ``]
-    []
-    [
-      From [link asio.reference.IoObjectService IoObjectService] requirements.
-      The underlying native representation is moved from `c` to `b`.
-    ]
-  ]
-  [
-    [``
-      a.move_assign(b, ao, c);
-    ``]
-    []
-    [
-      From [link asio.reference.IoObjectService IoObjectService] requirements.
-      Implicitly cancels asynchronous operations associated with `b`, as if by
-      calling `a.close(b, ec)`. Then the underlying native representation is
-      moved from `c` to `b`.
-    ]
-  ]
-  [
-    [``
-      a.open(b, p, ec);
-    ``]
-    [`error_code`]
-    [
-      pre: `!a.is_open(b)`.\n
-      post: `!!ec || a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      a.assign(b, p, n, ec);
-    ``]
-    [`error_code`]
-    [
-      pre: `!a.is_open(b)`.\n
-      post: `!!ec || a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      a.is_open(b);
-    ``]
-    [`bool`]
-    [
-    ]
-  ]
-  [
-    [``
-      const X& u = a;
-      const X::implementation_type& v = b;
-      u.is_open(v);
-    ``]
-    [`bool`]
-    [
-    ]
-  ]
-  [
-    [``
-      a.close(b, ec);
-    ``]
-    [`error_code`]
-    [
-      If `a.is_open()` is true, causes any outstanding asynchronous operations
-      to complete as soon as possible. Handlers for cancelled operations shall
-      be passed the error code `error::operation_aborted`.\n
-      post: `!a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      a.native_handle(b);
-    ``]
-    [`X::native_handle_type`]
-    [
-    ]
-  ]
-  [
-    [``
-      a.cancel(b, ec);
-    ``]
-    [`error_code`]
-    [
-      pre: `a.is_open(b)`.\n
-      Causes any outstanding asynchronous operations to complete as soon as
-      possible. Handlers for cancelled operations shall be passed the error
-      code `error::operation_aborted`.
-    ]
-  ]
-  [
-    [``
-      a.set_option(b, s, ec);
-    ``]
-    [`error_code`]
-    [
-      pre: `a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      a.get_option(b, g, ec);
-    ``]
-    [`error_code`]
-    [
-      pre: `a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      const X& u = a;
-      const X::implementation_type& v = b;
-      u.get_option(v, g, ec);
-    ``]
-    [`error_code`]
-    [
-      pre: `a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      a.io_control(b, i, ec);
-    ``]
-    [`error_code`]
-    [
-      pre: `a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      a.at_mark(b, ec);
-    ``]
-    [`bool`]
-    [
-      pre: `a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      const X& u = a;
-      const X::implementation_type& v = b;
-      u.at_mark(v, ec);
-    ``]
-    [`bool`]
-    [
-      pre: `a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      a.available(b, ec);
-    ``]
-    [`size_t`]
-    [
-      pre: `a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      const X& u = a;
-      const X::implementation_type& v = b;
-      u.available(v, ec);
-    ``]
-    [`size_t`]
-    [
-      pre: `a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      const typename Protocol::endpoint& u = e;
-      a.bind(b, u, ec);
-    ``]
-    [`error_code`]
-    [
-      pre: `a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      a.shutdown(b, h, ec);
-    ``]
-    [`error_code`]
-    [
-      pre: `a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      a.local_endpoint(b, ec);
-    ``]
-    [`Protocol::endpoint`]
-    [
-      pre: `a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      const X& u = a;
-      const X::implementation_type& v = b;
-      u.local_endpoint(v, ec);
-    ``]
-    [`Protocol::endpoint`]
-    [
-      pre: `a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      a.remote_endpoint(b, ec);
-    ``]
-    [`Protocol::endpoint`]
-    [
-      pre: `a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      const X& u = a;
-      const X::implementation_type& v = b;
-      u.remote_endpoint(v, ec);
-    ``]
-    [`Protocol::endpoint`]
-    [
-      pre: `a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      const typename Protocol::endpoint& u = e;
-      a.connect(b, u, ec);
-    ``]
-    [`error_code`]
-    [
-      pre: `a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      const typename Protocol::endpoint& u = e;
-      a.async_connect(b, u, ch);
-    ``]
-    []
-    [
-      pre: `a.is_open(b)`.\n
-      Initiates an asynchronous connect operation that is performed via the
-      `io_service` object `a.get_io_service()` and behaves according to [link
-      asio.reference.asynchronous_operations asynchronous operation]
-      requirements.
-    ]
-  ]
-  [
-    [``
-      a.wait(b, w, ec);
-    ``]
-    [`error_code`]
-    [
-      pre: `a.is_open(b)`.
-    ]
-  ]
-  [
-    [``
-      a.async_wait(b, w, wh);
-    ``]
-    []
-    [
-      pre: `a.is_open(b)`.\n
-      Initiates an asynchronous wait operation that is performed via the
-      `io_service` object `a.get_io_service()` and behaves according to [link
-      asio.reference.asynchronous_operations asynchronous operation]
-      requirements.
-    ]
-  ]
-]
-
-[endsect]
diff --git a/asio/src/doc/requirements/StreamDescriptorService.qbk b/asio/src/doc/requirements/StreamDescriptorService.qbk
deleted file mode 100644
index 958b089..0000000
--- a/asio/src/doc/requirements/StreamDescriptorService.qbk
+++ /dev/null
@@ -1,138 +0,0 @@
-[/
- / Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
- /
- / Distributed under the Boost Software License, Version 1.0. (See accompanying
- / file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- /]
-
-[section:StreamDescriptorService Stream descriptor service requirements]
-
-A stream descriptor service must meet the requirements for a [link
-asio.reference.DescriptorService descriptor service], as well as the additional
-requirements listed below.
-
-In the table below, `X` denotes a stream descriptor service class, `a` denotes
-a value of type `X`, `b` denotes a value of type `X::implementation_type`, `ec`
-denotes a value of type `error_code`, `mb` denotes a value satisfying [link
-asio.reference.MutableBufferSequence mutable buffer sequence] requirements,
-`rh` denotes a value meeting [link asio.reference.ReadHandler `ReadHandler`]
-requirements, `cb` denotes a value satisfying [link
-asio.reference.ConstBufferSequence constant buffer sequence] requirements, and
-`wh` denotes a value meeting [link asio.reference.WriteHandler `WriteHandler`]
-requirements.
-
-[table StreamDescriptorService requirements
-  [[expression] [return type] [assertion/note\npre/post-condition]]
-  [
-    [`a.read_some(b, mb, ec);`]
-    [`size_t`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Reads one or more bytes of data from a descriptor `b`.\n
-      \n
-      The mutable buffer sequence `mb` specifies memory where the data should
-      be placed. The operation shall always fill a buffer in the sequence
-      completely before proceeding to the next.\n
-      \n
-      If successful, returns the number of bytes read. Otherwise returns `0`.
-      If the total size of all buffers in the sequence `mb` is `0`, the
-      function shall return `0` immediately.\n
-      \n
-      If the operation completes due to graceful connection closure by the
-      peer, the operation shall fail with `error::eof`.
-    ]
-  ]
-  [
-    [`a.async_read_some(b, mb, rh);`]
-    [`void`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Initiates an asynchronous operation to read one or more bytes of data
-      from a descriptor `b`. The operation is performed via the
-      `io_service` object `a.get_io_service()` and behaves according to [link
-      asio.reference.asynchronous_operations asynchronous operation]
-      requirements.\n
-      \n
-      The mutable buffer sequence `mb` specifies memory where the data should
-      be placed. The operation shall always fill a buffer in the sequence
-      completely before proceeding to the next.\n
-      \n
-      The implementation shall maintain one or more copies of `mb` until such
-      time as the read operation no longer requires access to the memory
-      specified by the buffers in the sequence. The program must ensure the
-      memory is valid until:\n
-      \n
-      [mdash] the last copy of `mb` is destroyed, or\n
-      \n
-      [mdash] the handler for the asynchronous operation is invoked,\n
-      \n
-      whichever comes first. If the total size of all buffers in the sequence
-      `mb` is `0`, the asynchronous read operation shall complete immediately
-      and pass `0` as the argument to the handler that specifies the number of
-      bytes read.\n
-      \n
-      If the operation completes due to graceful connection closure by the
-      peer, the operation shall fail with `error::eof`.\n
-      \n
-      If the operation completes successfully, the `ReadHandler` object
-      `rh` is invoked with the number of bytes transferred. Otherwise it is
-      invoked with `0`.
-    ]
-  ]
-  [
-    [`a.write_some(b, cb, ec);`]
-    [`size_t`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Writes one or more bytes of data to a descriptor `b`.\n
-      \n
-      The constant buffer sequence `cb` specifies memory where the data to be
-      written is located. The operation shall always write a buffer in the
-      sequence completely before proceeding to the next.\n
-      \n
-      If successful, returns the number of bytes written. Otherwise returns `0`.
-      If the total size of all buffers in the sequence `cb` is `0`, the
-      function shall return `0` immediately.
-    ]
-  ]
-  [
-    [`a.async_write_some(b, cb, wh);`]
-    [`void`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Initiates an asynchronous operation to write one or more bytes of data to
-      a descriptor `b`. The operation is performed via the `io_service`
-      object `a.get_io_service()` and behaves according to [link
-      asio.reference.asynchronous_operations asynchronous operation]
-      requirements.\n
-      \n
-      The constant buffer sequence `cb` specifies memory where the data to be
-      written is located. The operation shall always write a buffer in the
-      sequence completely before proceeding to the next.\n
-      \n
-      The implementation shall maintain one or more copies of `cb` until such
-      time as the write operation no longer requires access to the memory
-      specified by the buffers in the sequence. The program must ensure the
-      memory is valid until:\n
-      \n
-      [mdash] the last copy of `cb` is destroyed, or\n
-      \n
-      [mdash] the handler for the asynchronous operation is invoked,\n
-      \n
-      whichever comes first. If the total size of all buffers in the sequence
-      `cb` is `0`, the asynchronous operation shall complete immediately and
-      pass `0` as the argument to the handler that specifies the number of
-      bytes read.\n
-      \n
-      If the operation completes successfully, the `WriteHandler` object `wh`
-      is invoked with the number of bytes transferred. Otherwise it is invoked
-      with `0`.
-    ]
-  ]
-]
-
-[endsect]
diff --git a/asio/src/doc/requirements/StreamHandleService.qbk b/asio/src/doc/requirements/StreamHandleService.qbk
deleted file mode 100644
index b73ab89..0000000
--- a/asio/src/doc/requirements/StreamHandleService.qbk
+++ /dev/null
@@ -1,138 +0,0 @@
-[/
- / Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
- /
- / Distributed under the Boost Software License, Version 1.0. (See accompanying
- / file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- /]
-
-[section:StreamHandleService Stream handle service requirements]
-
-A stream handle service must meet the requirements for a [link
-asio.reference.HandleService handle service], as well as the additional
-requirements listed below.
-
-In the table below, `X` denotes a stream handle service class, `a` denotes
-a value of type `X`, `b` denotes a value of type `X::implementation_type`, `ec`
-denotes a value of type `error_code`, `mb` denotes a value satisfying [link
-asio.reference.MutableBufferSequence mutable buffer sequence] requirements,
-`rh` denotes a value meeting [link asio.reference.ReadHandler `ReadHandler`]
-requirements, `cb` denotes a value satisfying [link
-asio.reference.ConstBufferSequence constant buffer sequence] requirements, and
-`wh` denotes a value meeting [link asio.reference.WriteHandler `WriteHandler`]
-requirements.
-
-[table StreamHandleService requirements
-  [[expression] [return type] [assertion/note\npre/post-condition]]
-  [
-    [`a.read_some(b, mb, ec);`]
-    [`size_t`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Reads one or more bytes of data from a handle `b`.\n
-      \n
-      The mutable buffer sequence `mb` specifies memory where the data should
-      be placed. The operation shall always fill a buffer in the sequence
-      completely before proceeding to the next.\n
-      \n
-      If successful, returns the number of bytes read. Otherwise returns `0`.
-      If the total size of all buffers in the sequence `mb` is `0`, the
-      function shall return `0` immediately.\n
-      \n
-      If the operation completes due to graceful connection closure by the
-      peer, the operation shall fail with `error::eof`.
-    ]
-  ]
-  [
-    [`a.async_read_some(b, mb, rh);`]
-    [`void`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Initiates an asynchronous operation to read one or more bytes of data
-      from a handle `b`. The operation is performed via the
-      `io_service` object `a.get_io_service()` and behaves according to [link
-      asio.reference.asynchronous_operations asynchronous operation]
-      requirements.\n
-      \n
-      The mutable buffer sequence `mb` specifies memory where the data should
-      be placed. The operation shall always fill a buffer in the sequence
-      completely before proceeding to the next.\n
-      \n
-      The implementation shall maintain one or more copies of `mb` until such
-      time as the read operation no longer requires access to the memory
-      specified by the buffers in the sequence. The program must ensure the
-      memory is valid until:\n
-      \n
-      [mdash] the last copy of `mb` is destroyed, or\n
-      \n
-      [mdash] the handler for the asynchronous operation is invoked,\n
-      \n
-      whichever comes first. If the total size of all buffers in the sequence
-      `mb` is `0`, the asynchronous read operation shall complete immediately
-      and pass `0` as the argument to the handler that specifies the number of
-      bytes read.\n
-      \n
-      If the operation completes due to graceful connection closure by the
-      peer, the operation shall fail with `error::eof`.\n
-      \n
-      If the operation completes successfully, the `ReadHandler` object
-      `rh` is invoked with the number of bytes transferred. Otherwise it is
-      invoked with `0`.
-    ]
-  ]
-  [
-    [`a.write_some(b, cb, ec);`]
-    [`size_t`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Writes one or more bytes of data to a handle `b`.\n
-      \n
-      The constant buffer sequence `cb` specifies memory where the data to be
-      written is located. The operation shall always write a buffer in the
-      sequence completely before proceeding to the next.\n
-      \n
-      If successful, returns the number of bytes written. Otherwise returns `0`.
-      If the total size of all buffers in the sequence `cb` is `0`, the
-      function shall return `0` immediately.
-    ]
-  ]
-  [
-    [`a.async_write_some(b, cb, wh);`]
-    [`void`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Initiates an asynchronous operation to write one or more bytes of data to
-      a handle `b`. The operation is performed via the `io_service`
-      object `a.get_io_service()` and behaves according to [link
-      asio.reference.asynchronous_operations asynchronous operation]
-      requirements.\n
-      \n
-      The constant buffer sequence `cb` specifies memory where the data to be
-      written is located. The operation shall always write a buffer in the
-      sequence completely before proceeding to the next.\n
-      \n
-      The implementation shall maintain one or more copies of `cb` until such
-      time as the write operation no longer requires access to the memory
-      specified by the buffers in the sequence. The program must ensure the
-      memory is valid until:\n
-      \n
-      [mdash] the last copy of `cb` is destroyed, or\n
-      \n
-      [mdash] the handler for the asynchronous operation is invoked,\n
-      \n
-      whichever comes first. If the total size of all buffers in the sequence
-      `cb` is `0`, the asynchronous operation shall complete immediately and
-      pass `0` as the argument to the handler that specifies the number of
-      bytes read.\n
-      \n
-      If the operation completes successfully, the `WriteHandler` object `wh`
-      is invoked with the number of bytes transferred. Otherwise it is invoked
-      with `0`.
-    ]
-  ]
-]
-
-[endsect]
diff --git a/asio/src/doc/requirements/StreamSocketService.qbk b/asio/src/doc/requirements/StreamSocketService.qbk
deleted file mode 100644
index b3ecd11..0000000
--- a/asio/src/doc/requirements/StreamSocketService.qbk
+++ /dev/null
@@ -1,139 +0,0 @@
-[/
- / Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
- /
- / Distributed under the Boost Software License, Version 1.0. (See accompanying
- / file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- /]
-
-[section:StreamSocketService Stream socket service requirements]
-
-A stream socket service must meet the requirements for a [link
-asio.reference.SocketService socket service], as well as the additional
-requirements listed below.
-
-In the table below, `X` denotes a stream socket service class, `a` denotes a
-value of type `X`, `b` denotes a value of type `X::implementation_type`, `ec`
-denotes a value of type `error_code`, `f` denotes a value of type
-`socket_base::message_flags`, `mb` denotes a value satisfying [link
-asio.reference.MutableBufferSequence mutable buffer sequence]
-requirements, `rh` denotes a value meeting [link
-asio.reference.ReadHandler `ReadHandler`] requirements, `cb` denotes a
-value satisfying [link asio.reference.ConstBufferSequence constant
-buffer sequence] requirements, and `wh` denotes a value meeting [link
-asio.reference.WriteHandler `WriteHandler`] requirements.
-
-[table StreamSocketService requirements
-  [[expression] [return type] [assertion/note\npre/post-condition]]
-  [
-    [`a.receive(b, mb, f, ec);`]
-    [`size_t`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Reads one or more bytes of data from a connected socket `b`.\n
-      \n
-      The mutable buffer sequence `mb` specifies memory where the data should
-      be placed. The operation shall always fill a buffer in the sequence
-      completely before proceeding to the next.\n
-      \n
-      If successful, returns the number of bytes read. Otherwise returns `0`.
-      If the total size of all buffers in the sequence `mb` is `0`, the
-      function shall return `0` immediately.\n
-      \n
-      If the operation completes due to graceful connection closure by the
-      peer, the operation shall fail with `error::eof`.
-    ]
-  ]
-  [
-    [`a.async_receive(b, mb, f, rh);`]
-    [`void`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Initiates an asynchronous operation to read one or more bytes of data
-      from a connected socket `b`. The operation is performed via the
-      `io_service` object `a.get_io_service()` and behaves according to [link
-      asio.reference.asynchronous_operations asynchronous operation]
-      requirements.\n
-      \n
-      The mutable buffer sequence `mb` specifies memory where the data should
-      be placed. The operation shall always fill a buffer in the sequence
-      completely before proceeding to the next.\n
-      \n
-      The implementation shall maintain one or more copies of `mb` until such
-      time as the read operation no longer requires access to the memory
-      specified by the buffers in the sequence. The program must ensure the
-      memory is valid until:\n
-      \n
-      [mdash] the last copy of `mb` is destroyed, or\n
-      \n
-      [mdash] the handler for the asynchronous operation is invoked,\n
-      \n
-      whichever comes first. If the total size of all buffers in the sequence
-      `mb` is `0`, the asynchronous read operation shall complete immediately
-      and pass `0` as the argument to the handler that specifies the number of
-      bytes read.\n
-      \n
-      If the operation completes due to graceful connection closure by the
-      peer, the operation shall fail with `error::eof`.\n
-      \n
-      If the operation completes successfully, the `ReadHandler` object
-      `rh` is invoked with the number of bytes transferred. Otherwise it is
-      invoked with `0`.
-    ]
-  ]
-  [
-    [`a.send(b, cb, f, ec);`]
-    [`size_t`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Writes one or more bytes of data to a connected socket `b`.\n
-      \n
-      The constant buffer sequence `cb` specifies memory where the data to be
-      written is located. The operation shall always write a buffer in the
-      sequence completely before proceeding to the next.\n
-      \n
-      If successful, returns the number of bytes written. Otherwise returns `0`.
-      If the total size of all buffers in the sequence `cb` is `0`, the
-      function shall return `0` immediately.
-    ]
-  ]
-  [
-    [`a.async_send(b, cb, f, wh);`]
-    [`void`]
-    [
-      pre: `a.is_open(b)`.\n
-      \n
-      Initiates an asynchronous operation to write one or more bytes of data to
-      a connected socket `b`. The operation is performed via the `io_service`
-      object `a.get_io_service()` and behaves according to [link
-      asio.reference.asynchronous_operations asynchronous operation]
-      requirements.\n
-      \n
-      The constant buffer sequence `cb` specifies memory where the data to be
-      written is located. The operation shall always write a buffer in the
-      sequence completely before proceeding to the next.\n
-      \n
-      The implementation shall maintain one or more copies of `cb` until such
-      time as the write operation no longer requires access to the memory
-      specified by the buffers in the sequence. The program must ensure the
-      memory is valid until:\n
-      \n
-      [mdash] the last copy of `cb` is destroyed, or\n
-      \n
-      [mdash] the handler for the asynchronous operation is invoked,\n
-      \n
-      whichever comes first. If the total size of all buffers in the sequence
-      `cb` is `0`, the asynchronous operation shall complete immediately and
-      pass `0` as the argument to the handler that specifies the number of
-      bytes read.\n
-      \n
-      If the operation completes successfully, the `WriteHandler` object `wh`
-      is invoked with the number of bytes transferred. Otherwise it is invoked
-      with `0`.
-    ]
-  ]
-]
-
-[endsect]
diff --git a/asio/src/doc/requirements/TimerService.qbk b/asio/src/doc/requirements/TimerService.qbk
deleted file mode 100644
index 12a6228..0000000
--- a/asio/src/doc/requirements/TimerService.qbk
+++ /dev/null
@@ -1,105 +0,0 @@
-[/
- / Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
- /
- / Distributed under the Boost Software License, Version 1.0. (See accompanying
- / file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- /]
-
-[section:TimerService Timer service requirements]
-
-A timer service must meet the requirements for an [link
-asio.reference.IoObjectService I/O object service], as well as the
-additional requirements listed below.
-
-In the table below, `X` denotes a timer service class for time type `Time` and
-traits type `TimeTraits`, `a` denotes a value of type `X`, `b` denotes a value
-of type `X::implementation_type`, `t` denotes a value of type `Time`, `d`
-denotes a value of type `TimeTraits::duration_type`, `e` denotes a value of
-type `error_code`, and `h` denotes a value meeting [link
-asio.reference.WaitHandler `WaitHandler`] requirements.
-
-[table TimerService requirements
-  [[expression] [return type] [assertion/note\npre/post-condition]]
-  [
-    [`a.destroy(b);`]
-    []
-    [
-      From [link asio.reference.IoObjectService IoObjectService]
-      requirements. Implicitly cancels asynchronous wait operations, as if by
-      calling `a.cancel(b, e)`.
-    ]
-  ]
-  [
-    [``
-      a.cancel(b, e);
-    ``]
-    [`size_t`]
-    [
-      Causes any outstanding asynchronous wait operations to complete as soon
-      as possible. Handlers for cancelled operations shall be passed the error
-      code `error::operation_aborted`. Sets `e` to indicate success or failure.
-      Returns the number of operations that were cancelled.
-    ]
-  ]
-  [
-    [`a.expires_at(b);`]
-    [`Time`]
-    []
-  ]
-  [
-    [``
-      a.expires_at(b, t, e);
-    ``]
-    [`size_t`]
-    [
-      Implicitly cancels asynchronous wait operations, as if by calling
-      `a.cancel(b, e)`. Returns the number of operations that were cancelled.\n
-      post: `a.expires_at(b) == t`.
-    ]
-  ]
-  [
-    [`a.expires_from_now(b);`]
-    [`TimeTraits::duration_type`]
-    [
-      Returns a value equivalent to `TimeTraits::subtract(a.expires_at(b),
-      TimeTraits::now())`.
-    ]
-  ]
-  [
-    [``
-      a.expires_from_now(b, d, e);
-    ``]
-    [`size_t`]
-    [
-      Equivalent to `a.expires_at(b, TimeTraits::add(TimeTraits::now(), d), e)`.
-    ]
-  ]
-  [
-    [``
-      a.wait(b, e);
-    ``]
-    [`error_code`]
-    [
-      Sets `e` to indicate success or failure. Returns `e`.\n
-      post: `!!e || !TimeTraits::lt(TimeTraits::now(), a.expires_at(b))`.
-    ]
-  ]
-  [
-    [``
-      a.async_wait(b, h);
-    ``]
-    []
-    [
-      Initiates an asynchronous wait operation that is performed via the
-      `io_service` object `a.get_io_service()` and behaves according to [link
-      asio.reference.asynchronous_operations asynchronous operation]
-      requirements.\n
-      \n
-      The handler shall be posted for execution only if the condition
-      `!!ec || !TimeTraits::lt(TimeTraits::now(), a.expires_at(b))`
-      holds, where `ec` is the error code to be passed to the handler.
-    ]
-  ]
-]
-
-[endsect]
diff --git a/asio/src/doc/requirements/WaitableTimerService.qbk b/asio/src/doc/requirements/WaitableTimerService.qbk
deleted file mode 100644
index 47ccb86..0000000
--- a/asio/src/doc/requirements/WaitableTimerService.qbk
+++ /dev/null
@@ -1,97 +0,0 @@
-[/
- / Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
- /
- / Distributed under the Boost Software License, Version 1.0. (See accompanying
- / file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- /]
-
-[section:WaitableTimerService Waitable timer service requirements]
-
-A waitable timer service must meet the requirements for an [link
-asio.reference.IoObjectService I/O object service], as well as the
-additional requirements listed below.
-
-In the table below, `X` denotes a waitable timer service class for clock type
-`Clock`, where `Clock` meets the C++11 clock type requirements, `a` denotes a
-value of type `X`, `b` denotes a value of type `X::implementation_type`, `t`
-denotes a value of type `Clock::time_point`, `d` denotes a value of type
-`Clock::duration`, `e` denotes a value of type `error_code`, and `h` denotes a
-value meeting [link asio.reference.WaitHandler `WaitHandler`] requirements.
-
-[table WaitableTimerService requirements
-  [[expression] [return type] [assertion/note\npre/post-condition]]
-  [
-    [`a.destroy(b);`]
-    []
-    [
-      From [link asio.reference.IoObjectService IoObjectService]
-      requirements. Implicitly cancels asynchronous wait operations, as if by
-      calling `a.cancel(b, e)`.
-    ]
-  ]
-  [
-    [``
-      a.cancel(b, e);
-    ``]
-    [`size_t`]
-    [
-      Causes any outstanding asynchronous wait operations to complete as soon
-      as possible. Handlers for cancelled operations shall be passed the error
-      code `error::operation_aborted`. Sets `e` to indicate success or failure.
-      Returns the number of operations that were cancelled.
-    ]
-  ]
-  [
-    [`a.expiry(b);`]
-    [`Clock::time_point`]
-    []
-  ]
-  [
-    [``
-      a.expires_at(b, t, e);
-    ``]
-    [`size_t`]
-    [
-      Implicitly cancels asynchronous wait operations, as if by calling
-      `a.cancel(b, e)`. Returns the number of operations that were cancelled.\n
-      post: `a.expires_at(b) == t`.
-    ]
-  ]
-  [
-    [``
-      a.expires_after(b, d, e);
-    ``]
-    [`size_t`]
-    [
-      Equivalent to `a.expires_at(b, Clock::now() + d, e)`.
-    ]
-  ]
-  [
-    [``
-      a.wait(b, e);
-    ``]
-    [`error_code`]
-    [
-      Sets `e` to indicate success or failure. Returns `e`.\n
-      post: `!!e || !(Clock::now() < a.expires_at(b))`.
-    ]
-  ]
-  [
-    [``
-      a.async_wait(b, h);
-    ``]
-    []
-    [
-      Initiates an asynchronous wait operation that is performed via the
-      `io_service` object `a.get_io_service()` and behaves according to [link
-      asio.reference.asynchronous_operations asynchronous operation]
-      requirements.\n
-      \n
-      The handler shall be posted for execution only if the condition
-      `!!ec || !(Clock::now() < a.expires_at(b))`
-      holds, where `ec` is the error code to be passed to the handler.
-    ]
-  ]
-]
-
-[endsect]
diff --git a/asio/src/doc/tutorial.qbk b/asio/src/doc/tutorial.qbk
index be3a2c7..0a5067e 100644
--- a/asio/src/doc/tutorial.qbk
+++ b/asio/src/doc/tutorial.qbk
@@ -196,13 +196,13 @@
 
 
 
-Finally, we must call the asio::io\_service::run() member function on the io\_service object.
+Finally, we must call the [link asio.reference.io_context.run io_service::run()] member function on the io\_service object.
 
-The asio library provides a guarantee that callback handlers will only be called from threads that are currently calling asio::io\_service::run(). Therefore unless the asio::io\_service::run() function is called the callback for the asynchronous wait completion will never be invoked.
+The asio library provides a guarantee that callback handlers will only be called from threads that are currently calling [link asio.reference.io_context.run io_service::run()]. Therefore unless the [link asio.reference.io_context.run io_service::run()] function is called the callback for the asynchronous wait completion will never be invoked.
 
-The asio::io\_service::run() function will also continue to run while there is still "work" to do. In this example, the work is the asynchronous wait on the timer, so the call will not return until the timer has expired and the callback has completed.
+The [link asio.reference.io_context.run io_service::run()] function will also continue to run while there is still "work" to do. In this example, the work is the asynchronous wait on the timer, so the call will not return until the timer has expired and the callback has completed.
 
-It is important to remember to give the io\_service some work to do before calling asio::io\_service::run(). For example, if we had omitted the above call to [link asio.reference.basic_deadline_timer.async_wait deadline_timer::async_wait()], the io\_service would not have had any work to do, and consequently asio::io\_service::run() would have returned immediately.
+It is important to remember to give the io\_service some work to do before calling [link asio.reference.io_context.run io_service::run()]. For example, if we had omitted the above call to [link asio.reference.basic_deadline_timer.async_wait deadline_timer::async_wait()], the io\_service would not have had any work to do, and consequently [link asio.reference.io_context.run io_service::run()] would have returned immediately.
 
 
   ``''''''``  io.run();
@@ -294,7 +294,7 @@
 
 
 
-As mentioned above, this tutorial program uses a counter to stop running when the timer fires for the sixth time. However you will observe that there is no explicit call to ask the io\_service to stop. Recall that in tutorial Timer.2 we learnt that the asio::io\_service::run() function completes when there is no more "work" to do. By not starting a new asynchronous wait on the timer when `count` reaches 5, the io\_service will run out of work and stop running.
+As mentioned above, this tutorial program uses a counter to stop running when the timer fires for the sixth time. However you will observe that there is no explicit call to ask the io\_service to stop. Recall that in tutorial Timer.2 we learnt that the [link asio.reference.io_context.run io_service::run()] function completes when there is no more "work" to do. By not starting a new asynchronous wait on the timer when `count` reaches 5, the io\_service will run out of work and stop running.
 
 
   ``''''''``  if (*count < 5)
@@ -580,7 +580,7 @@
 
 This tutorial demonstrates the use of the asio::io\_service::strand class to synchronise callback handlers in a multithreaded program.
 
-The previous four tutorials avoided the issue of handler synchronisation by calling the asio::io\_service::run() function from one thread only. As you already know, the asio library provides a guarantee that callback handlers will only be called from threads that are currently calling asio::io\_service::run(). Consequently, calling asio::io\_service::run() from only one thread ensures that callback handlers cannot run concurrently.
+The previous four tutorials avoided the issue of handler synchronisation by calling the [link asio.reference.io_context.run io_service::run()] function from one thread only. As you already know, the asio library provides a guarantee that callback handlers will only be called from threads that are currently calling [link asio.reference.io_context.run io_service::run()]. Consequently, calling [link asio.reference.io_context.run io_service::run()] from only one thread ensures that callback handlers cannot run concurrently.
 
 The single threaded approach is usually the best place to start when developing applications using asio. The downside is the limitations it places on programs, particularly servers, including:
 
@@ -592,7 +592,7 @@
 
 
 
-If you find yourself running into these limitations, an alternative approach is to have a pool of threads calling asio::io\_service::run(). However, as this allows handlers to execute concurrently, we need a method of synchronisation when handlers might be accessing a shared, thread-unsafe resource.
+If you find yourself running into these limitations, an alternative approach is to have a pool of threads calling [link asio.reference.io_context.run io_service::run()]. However, as this allows handlers to execute concurrently, we need a method of synchronisation when handlers might be accessing a shared, thread-unsafe resource.
 
 
 
@@ -618,7 +618,7 @@
 
 In addition to initialising a pair of asio::deadline\_timer members, the constructor initialises the `strand_` member, an object of type asio::io\_service::strand.
 
-An asio::io\_service::strand is an executor that guarantees that, for those handlers that are dispatched through it, an executing handler will be allowed to complete before the next one is started. This is guaranteed irrespective of the number of threads that are calling asio::io\_service::run(). Of course, the handlers may still execute concurrently with other handlers that were not dispatched through an asio::io\_service::strand, or were dispatched through a different asio::io\_service::strand object.
+An asio::io\_service::strand is an executor that guarantees that, for those handlers that are dispatched through it, an executing handler will be allowed to complete before the next one is started. This is guaranteed irrespective of the number of threads that are calling [link asio.reference.io_context.run io_service::run()]. Of course, the handlers may still execute concurrently with other handlers that were not dispatched through an asio::io\_service::strand, or were dispatched through a different asio::io\_service::strand object.
 
 
   ``''''''``  printer(asio::io_context& io)
@@ -688,10 +688,10 @@
 
 
 
-The `main` function now causes asio::io\_service::run() to be called from two threads: the main thread and one additional thread. This is accomplished using an 
+The `main` function now causes [link asio.reference.io_context.run io_service::run()] to be called from two threads: the main thread and one additional thread. This is accomplished using an 
 [link asio.reference.thread thread] object.
 
-Just as it would with a call from a single thread, concurrent calls to asio::io\_service::run() will continue to execute while there is "work" left to do. The background thread will not exit until all asynchronous operations have completed.
+Just as it would with a call from a single thread, concurrent calls to [link asio.reference.io_context.run io_service::run()] will continue to execute while there is "work" left to do. The background thread will not exit until all asynchronous operations have completed.
 
 
 
diff --git a/asio/src/examples/cpp03/Makefile.am b/asio/src/examples/cpp03/Makefile.am
index 0540783..5b88dad 100644
--- a/asio/src/examples/cpp03/Makefile.am
+++ b/asio/src/examples/cpp03/Makefile.am
@@ -88,8 +88,7 @@
 	chat/chat_message.hpp \
 	services/basic_logger.hpp \
 	services/logger.hpp \
-	services/logger_service.hpp \
-	services/stream_socket_service.hpp
+	services/logger_service.hpp
 
 AM_CXXFLAGS = -I$(srcdir)/../../../include
 
@@ -240,7 +239,6 @@
 	services/basic_logger.hpp \
 	services/logger.hpp \
 	services/logger_service.hpp \
-	services/stream_socket_service.hpp \
 	socks4/socks4.hpp \
 	ssl/README \
 	ssl/ca.pem \
diff --git a/asio/src/examples/cpp03/services/daytime_client.cpp b/asio/src/examples/cpp03/services/daytime_client.cpp
index 8817142..cc1b029 100644
--- a/asio/src/examples/cpp03/services/daytime_client.cpp
+++ b/asio/src/examples/cpp03/services/daytime_client.cpp
@@ -12,15 +12,13 @@
 #include <boost/bind.hpp>
 #include <iostream>
 #include "logger.hpp"
-#include "stream_socket_service.hpp"
 
-typedef asio::basic_stream_socket<asio::ip::tcp,
-    services::stream_socket_service<asio::ip::tcp> > debug_stream_socket;
+using asio::ip::tcp;
 
 char read_buffer[1024];
 
 void read_handler(const asio::error_code& e,
-    std::size_t bytes_transferred, debug_stream_socket* s)
+    std::size_t bytes_transferred, tcp::socket* s)
 {
   if (!e)
   {
@@ -30,19 +28,33 @@
         boost::bind(read_handler, asio::placeholders::error,
           asio::placeholders::bytes_transferred, s));
   }
+  else
+  {
+    services::logger logger(s->get_executor().context(), "read_handler");
+
+    std::string msg = "Read error: ";
+    msg += e.message();
+    logger.log(msg);
+  }
 }
 
-void connect_handler(const asio::error_code& e, debug_stream_socket* s)
+void connect_handler(const asio::error_code& e, tcp::socket* s)
 {
+  services::logger logger(s->get_executor().context(), "connect_handler");
+
   if (!e)
   {
+    logger.log("Connection established");
+
     s->async_read_some(asio::buffer(read_buffer),
         boost::bind(read_handler, asio::placeholders::error,
           asio::placeholders::bytes_transferred, s));
   }
   else
   {
-    std::cerr << e.message() << std::endl;
+    std::string msg = "Unable to establish connection: ";
+    msg += e.message();
+    logger.log(msg);
   }
 }
 
@@ -63,12 +75,12 @@
     logger.use_file("log.txt");
 
     // Resolve the address corresponding to the given host.
-    asio::ip::tcp::resolver resolver(io_context);
-    asio::ip::tcp::resolver::results_type endpoints =
+    tcp::resolver resolver(io_context);
+    tcp::resolver::results_type endpoints =
       resolver.resolve(argv[1], "daytime");
 
     // Start an asynchronous connect.
-    debug_stream_socket socket(io_context);
+    tcp::socket socket(io_context);
     asio::async_connect(socket, endpoints,
         boost::bind(connect_handler,
           asio::placeholders::error, &socket));
diff --git a/asio/src/examples/cpp03/services/stream_socket_service.hpp b/asio/src/examples/cpp03/services/stream_socket_service.hpp
deleted file mode 100644
index d4d0c22..0000000
--- a/asio/src/examples/cpp03/services/stream_socket_service.hpp
+++ /dev/null
@@ -1,351 +0,0 @@
-//
-// stream_socket_service.hpp
-// ~~~~~~~~~~~~~~~~~~~~~~~~~
-//
-// Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-
-#ifndef SERVICES_STREAM_SOCKET_SERVICE_HPP
-#define SERVICES_STREAM_SOCKET_SERVICE_HPP
-
-#include <asio.hpp>
-#include <boost/noncopyable.hpp>
-#include <boost/lexical_cast.hpp>
-#include "logger.hpp"
-
-namespace services {
-
-/// Debugging stream socket service that wraps the normal stream socket service.
-template <typename Protocol>
-class stream_socket_service
-  : public asio::io_context::service
-{
-private:
-  /// The type of the wrapped stream socket service.
-  typedef asio::stream_socket_service<Protocol> service_impl_type;
-
-public:
-  /// The unique service identifier.
-  static asio::io_context::id id;
-
-  /// The protocol type.
-  typedef Protocol protocol_type;
-
-  /// The endpoint type.
-  typedef typename Protocol::endpoint endpoint_type;
-
-  /// The implementation type of a stream socket.
-  typedef typename service_impl_type::implementation_type implementation_type;
-
-  /// The native type of a stream socket.
-  typedef typename service_impl_type::native_handle_type native_handle_type;
-
-  /// Construct a new stream socket service for the specified io_context.
-  explicit stream_socket_service(asio::io_context& io_context)
-    : asio::io_context::service(io_context),
-      service_impl_(asio::use_service<service_impl_type>(io_context)),
-      logger_(io_context, "stream_socket")
-  {
-  }
-
-  /// Destroy all user-defined handler objects owned by the service.
-  void shutdown()
-  {
-  }
-
-  /// Construct a new stream socket implementation.
-  void construct(implementation_type& impl)
-  {
-    service_impl_.construct(impl);
-  }
-
-  /// Destroy a stream socket implementation.
-  void destroy(implementation_type& impl)
-  {
-    service_impl_.destroy(impl);
-  }
-
-  /// Open a new stream socket implementation.
-  asio::error_code open(implementation_type& impl,
-      const protocol_type& protocol, asio::error_code& ec)
-  {
-    logger_.log("Opening new socket");
-    return service_impl_.open(impl, protocol, ec);
-  }
-
-  /// Open a stream socket from an existing native socket.
-  asio::error_code assign(implementation_type& impl,
-      const protocol_type& protocol, const native_handle_type& native_socket,
-      asio::error_code& ec)
-  {
-    logger_.log("Assigning from a native socket");
-    return service_impl_.assign(impl, protocol, native_socket, ec);
-  }
-
-  /// Determine whether the socket is open.
-  bool is_open(const implementation_type& impl) const
-  {
-    logger_.log("Checking if socket is open");
-    return service_impl_.is_open(impl);
-  }
-
-  /// Close a stream socket implementation.
-  asio::error_code close(implementation_type& impl,
-      asio::error_code& ec)
-  {
-    logger_.log("Closing socket");
-    return service_impl_.close(impl, ec);
-  }
-
-  /// Determine whether the socket is at the out-of-band data mark.
-  bool at_mark(const implementation_type& impl,
-      asio::error_code& ec) const
-  {
-    logger_.log("Checking if socket is at out-of-band data mark");
-    return service_impl_.at_mark(impl, ec);
-  }
-
-  /// Determine the number of bytes available for reading.
-  std::size_t available(const implementation_type& impl,
-      asio::error_code& ec) const
-  {
-    logger_.log("Determining number of bytes available for reading");
-    return service_impl_.available(impl, ec);
-  }
-
-  /// Bind the stream socket to the specified local endpoint.
-  asio::error_code bind(implementation_type& impl,
-      const endpoint_type& endpoint, asio::error_code& ec)
-  {
-    logger_.log("Binding socket");
-    return service_impl_.bind(impl, endpoint, ec);
-  }
-
-  /// Connect the stream socket to the specified endpoint.
-  asio::error_code connect(implementation_type& impl,
-      const endpoint_type& peer_endpoint, asio::error_code& ec)
-  {
-    logger_.log("Connecting socket to " +
-        boost::lexical_cast<std::string>(peer_endpoint));
-    return service_impl_.connect(impl, peer_endpoint, ec);
-  }
-
-  /// Handler to wrap asynchronous connect completion.
-  template <typename Handler>
-  class connect_handler
-  {
-  public:
-    connect_handler(Handler h, logger& l)
-      : handler_(h),
-        logger_(l)
-    {
-    }
-
-    void operator()(const asio::error_code& e)
-    {
-      if (e)
-      {
-        std::string msg = "Asynchronous connect failed: ";
-        msg += e.message();
-        logger_.log(msg);
-      }
-      else
-      {
-        logger_.log("Asynchronous connect succeeded");
-      }
-
-      handler_(e);
-    }
-
-  private:
-    Handler handler_;
-    logger& logger_;
-  };
-
-  /// Start an asynchronous connect.
-  template <typename Handler>
-  void async_connect(implementation_type& impl,
-      const endpoint_type& peer_endpoint, Handler handler)
-  {
-    logger_.log("Starting asynchronous connect to " +
-        boost::lexical_cast<std::string>(peer_endpoint));
-    service_impl_.async_connect(impl, peer_endpoint, 
-        connect_handler<Handler>(handler, logger_));
-  }
-
-  /// Set a socket option.
-  template <typename Option>
-  asio::error_code set_option(implementation_type& impl,
-      const Option& option, asio::error_code& ec)
-  {
-    logger_.log("Setting socket option");
-    return service_impl_.set_option(impl, option, ec);
-  }
-
-  /// Get a socket option.
-  template <typename Option>
-  asio::error_code get_option(const implementation_type& impl,
-      Option& option, asio::error_code& ec) const
-  {
-    logger_.log("Getting socket option");
-    return service_impl_.get_option(impl, option, ec);
-  }
-
-  /// Perform an IO control command on the socket.
-  template <typename IO_Control_Command>
-  asio::error_code io_control(implementation_type& impl,
-      IO_Control_Command& command, asio::error_code& ec)
-  {
-    logger_.log("Performing IO control command on socket");
-    return service_impl_.io_control(impl, command, ec);
-  }
-
-  /// Get the local endpoint.
-  endpoint_type local_endpoint(const implementation_type& impl,
-      asio::error_code& ec) const
-  {
-    logger_.log("Getting socket's local endpoint");
-    return service_impl_.local_endpoint(impl, ec);
-  }
-
-  /// Get the remote endpoint.
-  endpoint_type remote_endpoint(const implementation_type& impl,
-      asio::error_code& ec) const
-  {
-    logger_.log("Getting socket's remote endpoint");
-    return service_impl_.remote_endpoint(impl, ec);
-  }
-
-  /// Disable sends or receives on the socket.
-  asio::error_code shutdown(implementation_type& impl,
-      asio::socket_base::shutdown_type what,
-      asio::error_code& ec)
-  {
-    logger_.log("Shutting down socket");
-    return service_impl_.shutdown(impl, what, ec);
-  }
-
-  /// Send the given data to the peer.
-  template <typename Const_Buffers>
-  std::size_t send(implementation_type& impl, const Const_Buffers& buffers,
-      asio::socket_base::message_flags flags,
-      asio::error_code& ec)
-  {
-    logger_.log("Sending data on socket");
-    return service_impl_.send(impl, buffers, flags, ec);
-  }
-
-  /// Handler to wrap asynchronous send completion.
-  template <typename Handler>
-  class send_handler
-  {
-  public:
-    send_handler(Handler h, logger& l)
-      : handler_(h),
-        logger_(l)
-    {
-    }
-
-    void operator()(const asio::error_code& e,
-        std::size_t bytes_transferred)
-    {
-      if (e)
-      {
-        std::string msg = "Asynchronous send failed: ";
-        msg += e.message();
-        logger_.log(msg);
-      }
-      else
-      {
-        logger_.log("Asynchronous send succeeded");
-      }
-
-      handler_(e, bytes_transferred);
-    }
-
-  private:
-    Handler handler_;
-    logger& logger_;
-  };
-
-  /// Start an asynchronous send.
-  template <typename Const_Buffers, typename Handler>
-  void async_send(implementation_type& impl, const Const_Buffers& buffers,
-      asio::socket_base::message_flags flags, Handler handler)
-  {
-    logger_.log("Starting asynchronous send");
-    service_impl_.async_send(impl, buffers, flags,
-        send_handler<Handler>(handler, logger_));
-  }
-
-  /// Receive some data from the peer.
-  template <typename Mutable_Buffers>
-  std::size_t receive(implementation_type& impl,
-      const Mutable_Buffers& buffers,
-      asio::socket_base::message_flags flags,
-      asio::error_code& ec)
-  {
-    logger_.log("Receiving data on socket");
-    return service_impl_.receive(impl, buffers, flags, ec);
-  }
-
-  /// Handler to wrap asynchronous receive completion.
-  template <typename Handler>
-  class receive_handler
-  {
-  public:
-    receive_handler(Handler h, logger& l)
-      : handler_(h),
-        logger_(l)
-    {
-    }
-
-    void operator()(const asio::error_code& e,
-        std::size_t bytes_transferred)
-    {
-      if (e)
-      {
-        std::string msg = "Asynchronous receive failed: ";
-        msg += e.message();
-        logger_.log(msg);
-      }
-      else
-      {
-        logger_.log("Asynchronous receive succeeded");
-      }
-
-      handler_(e, bytes_transferred);
-    }
-
-  private:
-    Handler handler_;
-    logger& logger_;
-  };
-
-  /// Start an asynchronous receive.
-  template <typename Mutable_Buffers, typename Handler>
-  void async_receive(implementation_type& impl, const Mutable_Buffers& buffers,
-      asio::socket_base::message_flags flags, Handler handler)
-  {
-    logger_.log("Starting asynchronous receive");
-    service_impl_.async_receive(impl, buffers, flags,
-        receive_handler<Handler>(handler, logger_));
-  }
-
-private:
-  /// The wrapped stream socket service.
-  service_impl_type& service_impl_;
-
-  /// The logger used for writing debug messages.
-  mutable logger logger_;
-};
-
-template <typename Protocol>
-asio::io_context::id stream_socket_service<Protocol>::id;
-
-} // namespace services
-
-#endif // SERVICES_STREAM_SOCKET_SERVICE_HPP
diff --git a/asio/src/tests/Makefile.am b/asio/src/tests/Makefile.am
index 8e93cab..81ac613 100644
--- a/asio/src/tests/Makefile.am
+++ b/asio/src/tests/Makefile.am
@@ -71,6 +71,7 @@
 	unit/placeholders \
 	unit/posix/basic_descriptor \
 	unit/posix/basic_stream_descriptor \
+	unit/posix/descriptor \
 	unit/posix/descriptor_base \
 	unit/posix/stream_descriptor \
 	unit/posix/stream_descriptor_service \
@@ -101,6 +102,7 @@
 	unit/windows/basic_stream_handle \
 	unit/windows/object_handle \
 	unit/windows/object_handle_service \
+	unit/windows/overlapped_handle \
 	unit/windows/overlapped_ptr \
 	unit/windows/random_access_handle \
 	unit/windows/random_access_handle_service \
@@ -184,6 +186,7 @@
 	unit/placeholders \
 	unit/posix/basic_descriptor \
 	unit/posix/basic_stream_descriptor \
+	unit/posix/descriptor\
 	unit/posix/descriptor_base \
 	unit/posix/stream_descriptor \
 	unit/posix/stream_descriptor_service \
@@ -214,6 +217,7 @@
 	unit/windows/basic_stream_handle \
 	unit/windows/object_handle \
 	unit/windows/object_handle_service \
+	unit/windows/overlapped_handle \
 	unit/windows/overlapped_ptr \
 	unit/windows/random_access_handle \
 	unit/windows/random_access_handle_service \
@@ -310,6 +314,7 @@
 unit_placeholders_SOURCES = unit/placeholders.cpp
 unit_posix_basic_descriptor_SOURCES = unit/posix/basic_descriptor.cpp
 unit_posix_basic_stream_descriptor_SOURCES = unit/posix/basic_stream_descriptor.cpp
+unit_posix_descriptor_SOURCES = unit/posix/descriptor.cpp
 unit_posix_descriptor_base_SOURCES = unit/posix/descriptor_base.cpp
 unit_posix_stream_descriptor_SOURCES = unit/posix/stream_descriptor.cpp
 unit_posix_stream_descriptor_service_SOURCES = unit/posix/stream_descriptor_service.cpp
@@ -340,6 +345,7 @@
 unit_windows_basic_stream_handle_SOURCES = unit/windows/basic_stream_handle.cpp
 unit_windows_object_handle_SOURCES = unit/windows/object_handle.cpp
 unit_windows_object_handle_service_SOURCES = unit/windows/object_handle_service.cpp
+unit_windows_overlapped_handle_SOURCES = unit/windows/overlapped_handle.cpp
 unit_windows_overlapped_ptr_SOURCES = unit/windows/overlapped_ptr.cpp
 unit_windows_random_access_handle_SOURCES = unit/windows/random_access_handle.cpp
 unit_windows_random_access_handle_service_SOURCES = unit/windows/random_access_handle_service.cpp
diff --git a/asio/src/tests/unit/posix/.gitignore b/asio/src/tests/unit/posix/.gitignore
index af4bde6..2de575a 100644
--- a/asio/src/tests/unit/posix/.gitignore
+++ b/asio/src/tests/unit/posix/.gitignore
@@ -9,6 +9,7 @@
 *.tds
 basic_descriptor
 basic_stream_descriptor
+descriptor
 descriptor_base
 stream_descriptor
 stream_descriptor_service
diff --git a/asio/src/tests/unit/posix/descriptor.cpp b/asio/src/tests/unit/posix/descriptor.cpp
new file mode 100644
index 0000000..b8e21b1
--- /dev/null
+++ b/asio/src/tests/unit/posix/descriptor.cpp
@@ -0,0 +1,25 @@
+//
+// descriptor.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/posix/descriptor.hpp"
+
+#include "../unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+  "posix/descriptor",
+  ASIO_TEST_CASE(null_test)
+)
diff --git a/asio/src/tests/unit/windows/.gitignore b/asio/src/tests/unit/windows/.gitignore
index 50d329a..d225c81 100644
--- a/asio/src/tests/unit/windows/.gitignore
+++ b/asio/src/tests/unit/windows/.gitignore
@@ -13,6 +13,7 @@
 basic_stream_handle
 object_handle
 object_handle_service
+overlapped_handle
 overlapped_ptr
 random_access_handle
 random_access_handle_service
diff --git a/asio/src/tests/unit/windows/overlapped_handle.cpp b/asio/src/tests/unit/windows/overlapped_handle.cpp
new file mode 100644
index 0000000..62531f8
--- /dev/null
+++ b/asio/src/tests/unit/windows/overlapped_handle.cpp
@@ -0,0 +1,26 @@
+//
+// overlapped_handle.cpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/windows/overlapped_handle.hpp"
+
+#include "asio.hpp"
+#include "../unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+  "windows/overlapped_handle",
+  ASIO_TEST_CASE(null_test)
+)