Enable move-only handlers.

All async operations and executor operations support move-only
handlers. However, the io_service::post(), io_service::dispatch(),
io_service::strand::post() and io_service::strand::dispatch() functions
still require copyable handlers.
diff --git a/asio/include/asio/basic_socket.hpp b/asio/include/asio/basic_socket.hpp
index c2b50e9..3b6cebe 100644
--- a/asio/include/asio/basic_socket.hpp
+++ b/asio/include/asio/basic_socket.hpp
@@ -22,6 +22,7 @@
 #include "asio/detail/throw_error.hpp"
 #include "asio/detail/type_traits.hpp"
 #include "asio/error.hpp"
+#include "asio/post.hpp"
 #include "asio/socket_base.hpp"
 
 #include "asio/detail/push_options.hpp"
@@ -747,7 +748,7 @@
         async_completion<ConnectHandler,
           void (asio::error_code)> init(handler);
 
-        this->get_service().get_io_service().post(
+        asio::post(this->get_executor(),
             asio::detail::bind_handler(
               ASIO_MOVE_CAST(ASIO_HANDLER_TYPE(
                 ConnectHandler, void (asio::error_code)))(
diff --git a/asio/include/asio/detail/handler_type_requirements.hpp b/asio/include/asio/detail/handler_type_requirements.hpp
index fdf3a55..319bb83 100644
--- a/asio/include/asio/detail/handler_type_requirements.hpp
+++ b/asio/include/asio/detail/handler_type_requirements.hpp
@@ -71,19 +71,19 @@
 # if defined(ASIO_ENABLE_HANDLER_TYPE_REQUIREMENTS_ASSERT)
 
 template <typename Handler>
-auto zero_arg_handler_test(Handler h, void*)
+auto zero_arg_copyable_handler_test(Handler h, void*)
   -> decltype(
     sizeof(Handler(static_cast<const Handler&>(h))),
     ((h)()),
     char(0));
 
 template <typename Handler>
-char (&zero_arg_handler_test(Handler, ...))[2];
+char (&zero_arg_copyable_handler_test(Handler, ...))[2];
 
 template <typename Handler, typename Arg1>
 auto one_arg_handler_test(Handler h, Arg1* a1)
   -> decltype(
-    sizeof(Handler(static_cast<const Handler&>(h))),
+    sizeof(Handler(ASIO_MOVE_CAST(Handler)(h))),
     ((h)(*a1)),
     char(0));
 
@@ -93,7 +93,7 @@
 template <typename Handler, typename Arg1, typename Arg2>
 auto two_arg_handler_test(Handler h, Arg1* a1, Arg2* a2)
   -> decltype(
-    sizeof(Handler(static_cast<const Handler&>(h))),
+    sizeof(Handler(ASIO_MOVE_CAST(Handler)(h))),
     ((h)(*a1, *a2)),
     char(0));
 
@@ -113,6 +113,13 @@
 template <typename T> T& lvref(T);
 template <typename T> const T& clvref();
 template <typename T> const T& clvref(T);
+#if defined(ASIO_HAS_MOVE)
+template <typename T> T rvref();
+template <typename T> T rvref(T);
+#else // defined(ASIO_HAS_MOVE)
+template <typename T> const T& rvref();
+template <typename T> const T& rvref(T);
+#endif // defined(ASIO_HAS_MOVE)
 template <typename T> char argbyv(T);
 
 template <int>
@@ -127,7 +134,7 @@
       void()) asio_true_handler_type; \
   \
   ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \
-      sizeof(asio::detail::zero_arg_handler_test( \
+      sizeof(asio::detail::zero_arg_copyable_handler_test( \
           asio::detail::clvref< \
             asio_true_handler_type>(), 0)) == 1, \
       "CompletionHandler type requirements not met") \
@@ -151,7 +158,7 @@
   \
   ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \
       sizeof(asio::detail::two_arg_handler_test( \
-          asio::detail::clvref< \
+          asio::detail::rvref< \
             asio_true_handler_type>(), \
           static_cast<const asio::error_code*>(0), \
           static_cast<const std::size_t*>(0))) == 1, \
@@ -160,7 +167,7 @@
   typedef asio::detail::handler_type_requirements< \
       sizeof( \
         asio::detail::argbyv( \
-          asio::detail::clvref< \
+          asio::detail::rvref< \
             asio_true_handler_type>())) + \
       sizeof( \
         asio::detail::lvref< \
@@ -169,7 +176,6 @@
             asio::detail::lvref<const std::size_t>()), \
         char(0))> ASIO_UNUSED_TYPEDEF
 
-
 #define ASIO_WRITE_HANDLER_CHECK( \
     handler_type, handler) \
   \
@@ -179,7 +185,7 @@
   \
   ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \
       sizeof(asio::detail::two_arg_handler_test( \
-          asio::detail::clvref< \
+          asio::detail::rvref< \
             asio_true_handler_type>(), \
           static_cast<const asio::error_code*>(0), \
           static_cast<const std::size_t*>(0))) == 1, \
@@ -188,7 +194,7 @@
   typedef asio::detail::handler_type_requirements< \
       sizeof( \
         asio::detail::argbyv( \
-          asio::detail::clvref< \
+          asio::detail::rvref< \
             asio_true_handler_type>())) + \
       sizeof( \
         asio::detail::lvref< \
@@ -206,7 +212,7 @@
   \
   ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \
       sizeof(asio::detail::one_arg_handler_test( \
-          asio::detail::clvref< \
+          asio::detail::rvref< \
             asio_true_handler_type>(), \
           static_cast<const asio::error_code*>(0))) == 1, \
       "AcceptHandler type requirements not met") \
@@ -214,7 +220,7 @@
   typedef asio::detail::handler_type_requirements< \
       sizeof( \
         asio::detail::argbyv( \
-          asio::detail::clvref< \
+          asio::detail::rvref< \
             asio_true_handler_type>())) + \
       sizeof( \
         asio::detail::lvref< \
@@ -231,7 +237,7 @@
   \
   ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \
       sizeof(asio::detail::one_arg_handler_test( \
-          asio::detail::clvref< \
+          asio::detail::rvref< \
             asio_true_handler_type>(), \
           static_cast<const asio::error_code*>(0))) == 1, \
       "ConnectHandler type requirements not met") \
@@ -239,7 +245,7 @@
   typedef asio::detail::handler_type_requirements< \
       sizeof( \
         asio::detail::argbyv( \
-          asio::detail::clvref< \
+          asio::detail::rvref< \
             asio_true_handler_type>())) + \
       sizeof( \
         asio::detail::lvref< \
@@ -256,7 +262,7 @@
   \
   ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \
       sizeof(asio::detail::two_arg_handler_test( \
-          asio::detail::clvref< \
+          asio::detail::rvref< \
             asio_true_handler_type>(), \
           static_cast<const asio::error_code*>(0), \
           static_cast<const iter_type*>(0))) == 1, \
@@ -265,7 +271,7 @@
   typedef asio::detail::handler_type_requirements< \
       sizeof( \
         asio::detail::argbyv( \
-          asio::detail::clvref< \
+          asio::detail::rvref< \
             asio_true_handler_type>())) + \
       sizeof( \
         asio::detail::lvref< \
@@ -283,7 +289,7 @@
   \
   ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \
       sizeof(asio::detail::two_arg_handler_test( \
-          asio::detail::clvref< \
+          asio::detail::rvref< \
             asio_true_handler_type>(), \
           static_cast<const asio::error_code*>(0), \
           static_cast<const iter_type*>(0))) == 1, \
@@ -292,7 +298,7 @@
   typedef asio::detail::handler_type_requirements< \
       sizeof( \
         asio::detail::argbyv( \
-          asio::detail::clvref< \
+          asio::detail::rvref< \
             asio_true_handler_type>())) + \
       sizeof( \
         asio::detail::lvref< \
@@ -310,7 +316,7 @@
   \
   ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \
       sizeof(asio::detail::one_arg_handler_test( \
-          asio::detail::clvref< \
+          asio::detail::rvref< \
             asio_true_handler_type>(), \
           static_cast<const asio::error_code*>(0))) == 1, \
       "WaitHandler type requirements not met") \
@@ -318,7 +324,7 @@
   typedef asio::detail::handler_type_requirements< \
       sizeof( \
         asio::detail::argbyv( \
-          asio::detail::clvref< \
+          asio::detail::rvref< \
             asio_true_handler_type>())) + \
       sizeof( \
         asio::detail::lvref< \
@@ -335,7 +341,7 @@
   \
   ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \
       sizeof(asio::detail::two_arg_handler_test( \
-          asio::detail::clvref< \
+          asio::detail::rvref< \
             asio_true_handler_type>(), \
           static_cast<const asio::error_code*>(0), \
           static_cast<const int*>(0))) == 1, \
@@ -344,7 +350,7 @@
   typedef asio::detail::handler_type_requirements< \
       sizeof( \
         asio::detail::argbyv( \
-          asio::detail::clvref< \
+          asio::detail::rvref< \
             asio_true_handler_type>())) + \
       sizeof( \
         asio::detail::lvref< \
@@ -362,7 +368,7 @@
   \
   ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \
       sizeof(asio::detail::one_arg_handler_test( \
-          asio::detail::clvref< \
+          asio::detail::rvref< \
             asio_true_handler_type>(), \
           static_cast<const asio::error_code*>(0))) == 1, \
       "HandshakeHandler type requirements not met") \
@@ -370,7 +376,7 @@
   typedef asio::detail::handler_type_requirements< \
       sizeof( \
         asio::detail::argbyv( \
-          asio::detail::clvref< \
+          asio::detail::rvref< \
             asio_true_handler_type>())) + \
       sizeof( \
         asio::detail::lvref< \
@@ -387,7 +393,7 @@
   \
   ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \
       sizeof(asio::detail::two_arg_handler_test( \
-          asio::detail::clvref< \
+          asio::detail::rvref< \
             asio_true_handler_type>(), \
           static_cast<const asio::error_code*>(0), \
           static_cast<const std::size_t*>(0))) == 1, \
@@ -396,7 +402,7 @@
   typedef asio::detail::handler_type_requirements< \
       sizeof( \
         asio::detail::argbyv( \
-          asio::detail::clvref< \
+          asio::detail::rvref< \
             asio_true_handler_type>())) + \
       sizeof( \
         asio::detail::lvref< \
@@ -414,7 +420,7 @@
   \
   ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \
       sizeof(asio::detail::one_arg_handler_test( \
-          asio::detail::clvref< \
+          asio::detail::rvref< \
             asio_true_handler_type>(), \
           static_cast<const asio::error_code*>(0))) == 1, \
       "ShutdownHandler type requirements not met") \
@@ -422,7 +428,7 @@
   typedef asio::detail::handler_type_requirements< \
       sizeof( \
         asio::detail::argbyv( \
-          asio::detail::clvref< \
+          asio::detail::rvref< \
             asio_true_handler_type>())) + \
       sizeof( \
         asio::detail::lvref< \
diff --git a/asio/include/asio/impl/buffered_read_stream.hpp b/asio/include/asio/impl/buffered_read_stream.hpp
index 6ba81e3..444d455 100644
--- a/asio/include/asio/impl/buffered_read_stream.hpp
+++ b/asio/include/asio/impl/buffered_read_stream.hpp
@@ -232,7 +232,7 @@
         const MutableBufferSequence& buffers, ReadHandler& handler)
       : storage_(storage),
         buffers_(buffers),
-        handler_(handler)
+        handler_(ASIO_MOVE_CAST(ReadHandler)(handler))
     {
     }
 
diff --git a/asio/include/asio/impl/buffered_write_stream.hpp b/asio/include/asio/impl/buffered_write_stream.hpp
index 43e7c28..ff36d01 100644
--- a/asio/include/asio/impl/buffered_write_stream.hpp
+++ b/asio/include/asio/impl/buffered_write_stream.hpp
@@ -54,7 +54,7 @@
     buffered_flush_handler(detail::buffered_stream_storage& storage,
         WriteHandler& handler)
       : storage_(storage),
-        handler_(handler)
+        handler_(ASIO_MOVE_CAST(WriteHandler)(handler))
     {
     }
 
@@ -213,7 +213,7 @@
         const ConstBufferSequence& buffers, WriteHandler& handler)
       : storage_(storage),
         buffers_(buffers),
-        handler_(handler)
+        handler_(ASIO_MOVE_CAST(WriteHandler)(handler))
     {
     }
 
diff --git a/asio/src/tests/unit/archetypes/async_result.hpp b/asio/src/tests/unit/archetypes/async_result.hpp
index 21169b1..3fefca4 100644
--- a/asio/src/tests/unit/archetypes/async_result.hpp
+++ b/asio/src/tests/unit/archetypes/async_result.hpp
@@ -35,6 +35,12 @@
   void operator()(Arg1, Arg2)
   {
   }
+
+#if defined(ASIO_HAS_MOVE)
+  concrete_handler(concrete_handler&&) {}
+private:
+  concrete_handler(const concrete_handler&);
+#endif // defined(ASIO_HAS_MOVE)
 };
 
 } // namespace archetypes
diff --git a/asio/src/tests/unit/ip/icmp.cpp b/asio/src/tests/unit/ip/icmp.cpp
index b903a29..ab2a8bf 100644
--- a/asio/src/tests/unit/ip/icmp.cpp
+++ b/asio/src/tests/unit/ip/icmp.cpp
@@ -28,23 +28,44 @@
 //------------------------------------------------------------------------------
 
 // ip_icmp_socket_compile test
-// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
 // The following test checks that all public member functions on the class
 // ip::icmp::socket compile and link correctly. Runtime failures are ignored.
 
 namespace ip_icmp_socket_compile {
 
-void connect_handler(const asio::error_code&)
+struct connect_handler
 {
-}
+  connect_handler() {}
+  void operator()(const asio::error_code&) {}
+#if defined(ASIO_HAS_MOVE)
+  connect_handler(connect_handler&&) {}
+private:
+  connect_handler(const connect_handler&);
+#endif // defined(ASIO_HAS_MOVE)
+};
 
-void send_handler(const asio::error_code&, std::size_t)
+struct send_handler
 {
-}
+  send_handler() {}
+  void operator()(const asio::error_code&, std::size_t) {}
+#if defined(ASIO_HAS_MOVE)
+  send_handler(send_handler&&) {}
+private:
+  send_handler(const send_handler&);
+#endif // defined(ASIO_HAS_MOVE)
+};
 
-void receive_handler(const asio::error_code&, std::size_t)
+struct receive_handler
 {
-}
+  receive_handler() {}
+  void operator()(const asio::error_code&, std::size_t) {}
+#if defined(ASIO_HAS_MOVE)
+  receive_handler(receive_handler&&) {}
+private:
+  receive_handler(const receive_handler&);
+#endif // defined(ASIO_HAS_MOVE)
+};
 
 void test()
 {
@@ -151,9 +172,9 @@
     socket1.connect(ip::icmp::endpoint(ip::icmp::v6(), 0), ec);
 
     socket1.async_connect(ip::icmp::endpoint(ip::icmp::v4(), 0),
-        &connect_handler);
+        connect_handler());
     socket1.async_connect(ip::icmp::endpoint(ip::icmp::v6(), 0),
-        &connect_handler);
+        connect_handler());
     int i1 = socket1.async_connect(ip::icmp::endpoint(ip::icmp::v4(), 0), lazy);
     (void)i1;
     int i2 = socket1.async_connect(ip::icmp::endpoint(ip::icmp::v6(), 0), lazy);
@@ -207,12 +228,12 @@
     socket1.send(buffer(const_char_buffer), in_flags, ec);
     socket1.send(null_buffers(), in_flags, ec);
 
-    socket1.async_send(buffer(mutable_char_buffer), &send_handler);
-    socket1.async_send(buffer(const_char_buffer), &send_handler);
-    socket1.async_send(null_buffers(), &send_handler);
-    socket1.async_send(buffer(mutable_char_buffer), in_flags, &send_handler);
-    socket1.async_send(buffer(const_char_buffer), in_flags, &send_handler);
-    socket1.async_send(null_buffers(), in_flags, &send_handler);
+    socket1.async_send(buffer(mutable_char_buffer), send_handler());
+    socket1.async_send(buffer(const_char_buffer), send_handler());
+    socket1.async_send(null_buffers(), send_handler());
+    socket1.async_send(buffer(mutable_char_buffer), in_flags, send_handler());
+    socket1.async_send(buffer(const_char_buffer), in_flags, send_handler());
+    socket1.async_send(null_buffers(), in_flags, send_handler());
     int i3 = socket1.async_send(buffer(mutable_char_buffer), lazy);
     (void)i3;
     int i4 = socket1.async_send(buffer(const_char_buffer), lazy);
@@ -264,29 +285,29 @@
         ip::icmp::endpoint(ip::icmp::v6(), 0), in_flags, ec);
 
     socket1.async_send_to(buffer(mutable_char_buffer),
-        ip::icmp::endpoint(ip::icmp::v4(), 0), &send_handler);
+        ip::icmp::endpoint(ip::icmp::v4(), 0), send_handler());
     socket1.async_send_to(buffer(mutable_char_buffer),
-        ip::icmp::endpoint(ip::icmp::v6(), 0), &send_handler);
+        ip::icmp::endpoint(ip::icmp::v6(), 0), send_handler());
     socket1.async_send_to(buffer(const_char_buffer),
-        ip::icmp::endpoint(ip::icmp::v4(), 0), &send_handler);
+        ip::icmp::endpoint(ip::icmp::v4(), 0), send_handler());
     socket1.async_send_to(buffer(const_char_buffer),
-        ip::icmp::endpoint(ip::icmp::v6(), 0), &send_handler);
+        ip::icmp::endpoint(ip::icmp::v6(), 0), send_handler());
     socket1.async_send_to(null_buffers(),
-        ip::icmp::endpoint(ip::icmp::v4(), 0), &send_handler);
+        ip::icmp::endpoint(ip::icmp::v4(), 0), send_handler());
     socket1.async_send_to(null_buffers(),
-        ip::icmp::endpoint(ip::icmp::v6(), 0), &send_handler);
+        ip::icmp::endpoint(ip::icmp::v6(), 0), send_handler());
     socket1.async_send_to(buffer(mutable_char_buffer),
-        ip::icmp::endpoint(ip::icmp::v4(), 0), in_flags, &send_handler);
+        ip::icmp::endpoint(ip::icmp::v4(), 0), in_flags, send_handler());
     socket1.async_send_to(buffer(mutable_char_buffer),
-        ip::icmp::endpoint(ip::icmp::v6(), 0), in_flags, &send_handler);
+        ip::icmp::endpoint(ip::icmp::v6(), 0), in_flags, send_handler());
     socket1.async_send_to(buffer(const_char_buffer),
-        ip::icmp::endpoint(ip::icmp::v4(), 0), in_flags, &send_handler);
+        ip::icmp::endpoint(ip::icmp::v4(), 0), in_flags, send_handler());
     socket1.async_send_to(buffer(const_char_buffer),
-        ip::icmp::endpoint(ip::icmp::v6(), 0), in_flags, &send_handler);
+        ip::icmp::endpoint(ip::icmp::v6(), 0), in_flags, send_handler());
     socket1.async_send_to(null_buffers(),
-        ip::icmp::endpoint(ip::icmp::v4(), 0), in_flags, &send_handler);
+        ip::icmp::endpoint(ip::icmp::v4(), 0), in_flags, send_handler());
     socket1.async_send_to(null_buffers(),
-        ip::icmp::endpoint(ip::icmp::v6(), 0), in_flags, &send_handler);
+        ip::icmp::endpoint(ip::icmp::v6(), 0), in_flags, send_handler());
     int i9 = socket1.async_send_to(buffer(mutable_char_buffer),
         ip::icmp::endpoint(ip::icmp::v4(), 0), lazy);
     (void)i9;
@@ -331,11 +352,11 @@
     socket1.receive(buffer(mutable_char_buffer), in_flags, ec);
     socket1.receive(null_buffers(), in_flags, ec);
 
-    socket1.async_receive(buffer(mutable_char_buffer), &receive_handler);
-    socket1.async_receive(null_buffers(), &receive_handler);
+    socket1.async_receive(buffer(mutable_char_buffer), receive_handler());
+    socket1.async_receive(null_buffers(), receive_handler());
     socket1.async_receive(buffer(mutable_char_buffer), in_flags,
-        &receive_handler);
-    socket1.async_receive(null_buffers(), in_flags, &receive_handler);
+        receive_handler());
+    socket1.async_receive(null_buffers(), in_flags, receive_handler());
     int i21 = socket1.async_receive(buffer(mutable_char_buffer), lazy);
     (void)i21;
     int i22 = socket1.async_receive(null_buffers(), lazy);
@@ -355,13 +376,13 @@
     socket1.receive_from(null_buffers(), endpoint, in_flags, ec);
 
     socket1.async_receive_from(buffer(mutable_char_buffer),
-        endpoint, &receive_handler);
+        endpoint, receive_handler());
     socket1.async_receive_from(null_buffers(),
-        endpoint, &receive_handler);
+        endpoint, receive_handler());
     socket1.async_receive_from(buffer(mutable_char_buffer),
-        endpoint, in_flags, &receive_handler);
+        endpoint, in_flags, receive_handler());
     socket1.async_receive_from(null_buffers(),
-        endpoint, in_flags, &receive_handler);
+        endpoint, in_flags, receive_handler());
     int i25 = socket1.async_receive_from(buffer(mutable_char_buffer),
         endpoint, lazy);
     (void)i25;
diff --git a/asio/src/tests/unit/ip/tcp.cpp b/asio/src/tests/unit/ip/tcp.cpp
index 145337b..b80a7b1 100644
--- a/asio/src/tests/unit/ip/tcp.cpp
+++ b/asio/src/tests/unit/ip/tcp.cpp
@@ -137,25 +137,60 @@
 
 namespace ip_tcp_socket_compile {
 
-void connect_handler(const asio::error_code&)
+struct connect_handler
 {
-}
+  connect_handler() {}
+  void operator()(const asio::error_code&) {}
+#if defined(ASIO_HAS_MOVE)
+  connect_handler(connect_handler&&) {}
+private:
+  connect_handler(const connect_handler&);
+#endif // defined(ASIO_HAS_MOVE)
+};
 
-void send_handler(const asio::error_code&, std::size_t)
+struct send_handler
 {
-}
+  send_handler() {}
+  void operator()(const asio::error_code&, std::size_t) {}
+#if defined(ASIO_HAS_MOVE)
+  send_handler(send_handler&&) {}
+private:
+  send_handler(const send_handler&);
+#endif // defined(ASIO_HAS_MOVE)
+};
 
-void receive_handler(const asio::error_code&, std::size_t)
+struct receive_handler
 {
-}
+  receive_handler() {}
+  void operator()(const asio::error_code&, std::size_t) {}
+#if defined(ASIO_HAS_MOVE)
+  receive_handler(receive_handler&&) {}
+private:
+  receive_handler(const receive_handler&);
+#endif // defined(ASIO_HAS_MOVE)
+};
 
-void write_some_handler(const asio::error_code&, std::size_t)
+struct write_some_handler
 {
-}
+  write_some_handler() {}
+  void operator()(const asio::error_code&, std::size_t) {}
+#if defined(ASIO_HAS_MOVE)
+  write_some_handler(write_some_handler&&) {}
+private:
+  write_some_handler(const write_some_handler&);
+#endif // defined(ASIO_HAS_MOVE)
+};
 
-void read_some_handler(const asio::error_code&, std::size_t)
+struct read_some_handler
 {
-}
+  read_some_handler() {}
+  void operator()(const asio::error_code&, std::size_t) {}
+#if defined(ASIO_HAS_MOVE)
+  read_some_handler(read_some_handler&&) {}
+private:
+  read_some_handler(const read_some_handler&);
+#endif // defined(ASIO_HAS_MOVE)
+};
 
 void test()
 {
@@ -277,9 +312,9 @@
     socket1.connect(ip::tcp::endpoint(ip::tcp::v6(), 0), ec);
 
     socket1.async_connect(ip::tcp::endpoint(ip::tcp::v4(), 0),
-        &connect_handler);
+        connect_handler());
     socket1.async_connect(ip::tcp::endpoint(ip::tcp::v6(), 0),
-        &connect_handler);
+        connect_handler());
     int i1 = socket1.async_connect(ip::tcp::endpoint(ip::tcp::v4(), 0), lazy);
     (void)i1;
     int i2 = socket1.async_connect(ip::tcp::endpoint(ip::tcp::v6(), 0), lazy);
@@ -339,16 +374,16 @@
     socket1.send(const_buffers, in_flags, ec);
     socket1.send(null_buffers(), in_flags, ec);
 
-    socket1.async_send(buffer(mutable_char_buffer), &send_handler);
-    socket1.async_send(buffer(const_char_buffer), &send_handler);
-    socket1.async_send(mutable_buffers, &send_handler);
-    socket1.async_send(const_buffers, &send_handler);
-    socket1.async_send(null_buffers(), &send_handler);
-    socket1.async_send(buffer(mutable_char_buffer), in_flags, &send_handler);
-    socket1.async_send(buffer(const_char_buffer), in_flags, &send_handler);
-    socket1.async_send(mutable_buffers, in_flags, &send_handler);
-    socket1.async_send(const_buffers, in_flags, &send_handler);
-    socket1.async_send(null_buffers(), in_flags, &send_handler);
+    socket1.async_send(buffer(mutable_char_buffer), send_handler());
+    socket1.async_send(buffer(const_char_buffer), send_handler());
+    socket1.async_send(mutable_buffers, send_handler());
+    socket1.async_send(const_buffers, send_handler());
+    socket1.async_send(null_buffers(), send_handler());
+    socket1.async_send(buffer(mutable_char_buffer), in_flags, send_handler());
+    socket1.async_send(buffer(const_char_buffer), in_flags, send_handler());
+    socket1.async_send(mutable_buffers, in_flags, send_handler());
+    socket1.async_send(const_buffers, in_flags, send_handler());
+    socket1.async_send(null_buffers(), in_flags, send_handler());
     int i3 = socket1.async_send(buffer(mutable_char_buffer), lazy);
     (void)i3;
     int i4 = socket1.async_send(buffer(const_char_buffer), lazy);
@@ -380,13 +415,13 @@
     socket1.receive(mutable_buffers, in_flags, ec);
     socket1.receive(null_buffers(), in_flags, ec);
 
-    socket1.async_receive(buffer(mutable_char_buffer), &receive_handler);
-    socket1.async_receive(mutable_buffers, &receive_handler);
-    socket1.async_receive(null_buffers(), &receive_handler);
+    socket1.async_receive(buffer(mutable_char_buffer), receive_handler());
+    socket1.async_receive(mutable_buffers, receive_handler());
+    socket1.async_receive(null_buffers(), receive_handler());
     socket1.async_receive(buffer(mutable_char_buffer), in_flags,
-        &receive_handler);
-    socket1.async_receive(mutable_buffers, in_flags, &receive_handler);
-    socket1.async_receive(null_buffers(), in_flags, &receive_handler);
+        receive_handler());
+    socket1.async_receive(mutable_buffers, in_flags, receive_handler());
+    socket1.async_receive(null_buffers(), in_flags, receive_handler());
     int i13 = socket1.async_receive(buffer(mutable_char_buffer), lazy);
     (void)i13;
     int i14 = socket1.async_receive(mutable_buffers, lazy);
@@ -412,11 +447,11 @@
     socket1.write_some(const_buffers, ec);
     socket1.write_some(null_buffers(), ec);
 
-    socket1.async_write_some(buffer(mutable_char_buffer), &write_some_handler);
-    socket1.async_write_some(buffer(const_char_buffer), &write_some_handler);
-    socket1.async_write_some(mutable_buffers, &write_some_handler);
-    socket1.async_write_some(const_buffers, &write_some_handler);
-    socket1.async_write_some(null_buffers(), &write_some_handler);
+    socket1.async_write_some(buffer(mutable_char_buffer), write_some_handler());
+    socket1.async_write_some(buffer(const_char_buffer), write_some_handler());
+    socket1.async_write_some(mutable_buffers, write_some_handler());
+    socket1.async_write_some(const_buffers, write_some_handler());
+    socket1.async_write_some(null_buffers(), write_some_handler());
     int i19 = socket1.async_write_some(buffer(mutable_char_buffer), lazy);
     (void)i19;
     int i20 = socket1.async_write_some(buffer(const_char_buffer), lazy);
@@ -435,9 +470,9 @@
     socket1.read_some(mutable_buffers, ec);
     socket1.read_some(null_buffers(), ec);
 
-    socket1.async_read_some(buffer(mutable_char_buffer), &read_some_handler);
-    socket1.async_read_some(mutable_buffers, &read_some_handler);
-    socket1.async_read_some(null_buffers(), &read_some_handler);
+    socket1.async_read_some(buffer(mutable_char_buffer), read_some_handler());
+    socket1.async_read_some(mutable_buffers, read_some_handler());
+    socket1.async_read_some(null_buffers(), read_some_handler());
     int i24 = socket1.async_read_some(buffer(mutable_char_buffer), lazy);
     (void)i24;
     int i25 = socket1.async_read_some(mutable_buffers, lazy);
@@ -625,9 +660,16 @@
 
 namespace ip_tcp_acceptor_compile {
 
-void accept_handler(const asio::error_code&)
+struct accept_handler
 {
-}
+  accept_handler() {}
+  void operator()(const asio::error_code&) {}
+#if defined(ASIO_HAS_MOVE)
+  accept_handler(accept_handler&&) {}
+private:
+  accept_handler(const accept_handler&);
+#endif // defined(ASIO_HAS_MOVE)
+};
 
 void test()
 {
@@ -744,8 +786,8 @@
     acceptor1.accept(peer_socket, peer_endpoint);
     acceptor1.accept(peer_socket, peer_endpoint, ec);
 
-    acceptor1.async_accept(peer_socket, &accept_handler);
-    acceptor1.async_accept(peer_socket, peer_endpoint, &accept_handler);
+    acceptor1.async_accept(peer_socket, accept_handler());
+    acceptor1.async_accept(peer_socket, peer_endpoint, accept_handler());
     int i1 = acceptor1.async_accept(peer_socket, lazy);
     (void)i1;
     int i2 = acceptor1.async_accept(peer_socket, peer_endpoint, lazy);
@@ -846,10 +888,17 @@
 
 namespace ip_tcp_resolver_compile {
 
-void resolve_handler(const asio::error_code&,
-    asio::ip::tcp::resolver::iterator)
+struct resolve_handler
 {
-}
+  resolve_handler() {}
+  void operator()(const asio::error_code&,
+      asio::ip::tcp::resolver::iterator) {}
+#if defined(ASIO_HAS_MOVE)
+  resolve_handler(resolve_handler&&) {}
+private:
+  resolve_handler(const resolve_handler&);
+#endif // defined(ASIO_HAS_MOVE)
+};
 
 void test()
 {
@@ -889,11 +938,11 @@
     ip::tcp::resolver::iterator iter4 = resolver.resolve(e, ec);
     (void)iter4;
 
-    resolver.async_resolve(q, &resolve_handler);
+    resolver.async_resolve(q, resolve_handler());
     int i1 = resolver.async_resolve(q, lazy);
     (void)i1;
 
-    resolver.async_resolve(e, &resolve_handler);
+    resolver.async_resolve(e, resolve_handler());
     int i2 = resolver.async_resolve(e, lazy);
     (void)i2;
   }
diff --git a/asio/src/tests/unit/ip/udp.cpp b/asio/src/tests/unit/ip/udp.cpp
index f8b62e0..30ac1dd 100644
--- a/asio/src/tests/unit/ip/udp.cpp
+++ b/asio/src/tests/unit/ip/udp.cpp
@@ -39,17 +39,38 @@
 
 namespace ip_udp_socket_compile {
 
-void connect_handler(const asio::error_code&)
+struct connect_handler
 {
-}
+  connect_handler() {}
+  void operator()(const asio::error_code&) {}
+#if defined(ASIO_HAS_MOVE)
+  connect_handler(connect_handler&&) {}
+private:
+  connect_handler(const connect_handler&);
+#endif // defined(ASIO_HAS_MOVE)
+};
 
-void send_handler(const asio::error_code&, std::size_t)
+struct send_handler
 {
-}
+  send_handler() {}
+  void operator()(const asio::error_code&, std::size_t) {}
+#if defined(ASIO_HAS_MOVE)
+  send_handler(send_handler&&) {}
+private:
+  send_handler(const send_handler&);
+#endif // defined(ASIO_HAS_MOVE)
+};
 
-void receive_handler(const asio::error_code&, std::size_t)
+struct receive_handler
 {
-}
+  receive_handler() {}
+  void operator()(const asio::error_code&, std::size_t) {}
+#if defined(ASIO_HAS_MOVE)
+  receive_handler(receive_handler&&) {}
+private:
+  receive_handler(const receive_handler&);
+#endif // defined(ASIO_HAS_MOVE)
+};
 
 void test()
 {
@@ -159,9 +180,9 @@
     socket1.connect(ip::udp::endpoint(ip::udp::v6(), 0), ec);
 
     socket1.async_connect(ip::udp::endpoint(ip::udp::v4(), 0),
-        &connect_handler);
+        connect_handler());
     socket1.async_connect(ip::udp::endpoint(ip::udp::v6(), 0),
-        &connect_handler);
+        connect_handler());
     int i1 = socket1.async_connect(ip::udp::endpoint(ip::udp::v4(), 0), lazy);
     (void)i1;
     int i2 = socket1.async_connect(ip::udp::endpoint(ip::udp::v6(), 0), lazy);
@@ -215,12 +236,12 @@
     socket1.send(buffer(const_char_buffer), in_flags, ec);
     socket1.send(null_buffers(), in_flags, ec);
 
-    socket1.async_send(buffer(mutable_char_buffer), &send_handler);
-    socket1.async_send(buffer(const_char_buffer), &send_handler);
-    socket1.async_send(null_buffers(), &send_handler);
-    socket1.async_send(buffer(mutable_char_buffer), in_flags, &send_handler);
-    socket1.async_send(buffer(const_char_buffer), in_flags, &send_handler);
-    socket1.async_send(null_buffers(), in_flags, &send_handler);
+    socket1.async_send(buffer(mutable_char_buffer), send_handler());
+    socket1.async_send(buffer(const_char_buffer), send_handler());
+    socket1.async_send(null_buffers(), send_handler());
+    socket1.async_send(buffer(mutable_char_buffer), in_flags, send_handler());
+    socket1.async_send(buffer(const_char_buffer), in_flags, send_handler());
+    socket1.async_send(null_buffers(), in_flags, send_handler());
     int i3 = socket1.async_send(buffer(mutable_char_buffer), lazy);
     (void)i3;
     int i4 = socket1.async_send(buffer(const_char_buffer), lazy);
@@ -272,29 +293,29 @@
         ip::udp::endpoint(ip::udp::v6(), 0), in_flags, ec);
 
     socket1.async_send_to(buffer(mutable_char_buffer),
-        ip::udp::endpoint(ip::udp::v4(), 0), &send_handler);
+        ip::udp::endpoint(ip::udp::v4(), 0), send_handler());
     socket1.async_send_to(buffer(mutable_char_buffer),
-        ip::udp::endpoint(ip::udp::v6(), 0), &send_handler);
+        ip::udp::endpoint(ip::udp::v6(), 0), send_handler());
     socket1.async_send_to(buffer(const_char_buffer),
-        ip::udp::endpoint(ip::udp::v4(), 0), &send_handler);
+        ip::udp::endpoint(ip::udp::v4(), 0), send_handler());
     socket1.async_send_to(buffer(const_char_buffer),
-        ip::udp::endpoint(ip::udp::v6(), 0), &send_handler);
+        ip::udp::endpoint(ip::udp::v6(), 0), send_handler());
     socket1.async_send_to(null_buffers(),
-        ip::udp::endpoint(ip::udp::v4(), 0), &send_handler);
+        ip::udp::endpoint(ip::udp::v4(), 0), send_handler());
     socket1.async_send_to(null_buffers(),
-        ip::udp::endpoint(ip::udp::v6(), 0), &send_handler);
+        ip::udp::endpoint(ip::udp::v6(), 0), send_handler());
     socket1.async_send_to(buffer(mutable_char_buffer),
-        ip::udp::endpoint(ip::udp::v4(), 0), in_flags, &send_handler);
+        ip::udp::endpoint(ip::udp::v4(), 0), in_flags, send_handler());
     socket1.async_send_to(buffer(mutable_char_buffer),
-        ip::udp::endpoint(ip::udp::v6(), 0), in_flags, &send_handler);
+        ip::udp::endpoint(ip::udp::v6(), 0), in_flags, send_handler());
     socket1.async_send_to(buffer(const_char_buffer),
-        ip::udp::endpoint(ip::udp::v4(), 0), in_flags, &send_handler);
+        ip::udp::endpoint(ip::udp::v4(), 0), in_flags, send_handler());
     socket1.async_send_to(buffer(const_char_buffer),
-        ip::udp::endpoint(ip::udp::v6(), 0), in_flags, &send_handler);
+        ip::udp::endpoint(ip::udp::v6(), 0), in_flags, send_handler());
     socket1.async_send_to(null_buffers(),
-        ip::udp::endpoint(ip::udp::v4(), 0), in_flags, &send_handler);
+        ip::udp::endpoint(ip::udp::v4(), 0), in_flags, send_handler());
     socket1.async_send_to(null_buffers(),
-        ip::udp::endpoint(ip::udp::v6(), 0), in_flags, &send_handler);
+        ip::udp::endpoint(ip::udp::v6(), 0), in_flags, send_handler());
     int i9 = socket1.async_send_to(buffer(mutable_char_buffer),
         ip::udp::endpoint(ip::udp::v4(), 0), lazy);
     (void)i9;
@@ -339,11 +360,11 @@
     socket1.receive(buffer(mutable_char_buffer), in_flags, ec);
     socket1.receive(null_buffers(), in_flags, ec);
 
-    socket1.async_receive(buffer(mutable_char_buffer), &receive_handler);
-    socket1.async_receive(null_buffers(), &receive_handler);
+    socket1.async_receive(buffer(mutable_char_buffer), receive_handler());
+    socket1.async_receive(null_buffers(), receive_handler());
     socket1.async_receive(buffer(mutable_char_buffer), in_flags,
-        &receive_handler);
-    socket1.async_receive(null_buffers(), in_flags, &receive_handler);
+        receive_handler());
+    socket1.async_receive(null_buffers(), in_flags, receive_handler());
     int i21 = socket1.async_receive(buffer(mutable_char_buffer), lazy);
     (void)i21;
     int i22 = socket1.async_receive(null_buffers(), lazy);
@@ -363,13 +384,13 @@
     socket1.receive_from(null_buffers(), endpoint, in_flags, ec);
 
     socket1.async_receive_from(buffer(mutable_char_buffer),
-        endpoint, &receive_handler);
+        endpoint, receive_handler());
     socket1.async_receive_from(null_buffers(),
-        endpoint, &receive_handler);
+        endpoint, receive_handler());
     socket1.async_receive_from(buffer(mutable_char_buffer),
-        endpoint, in_flags, &receive_handler);
+        endpoint, in_flags, receive_handler());
     socket1.async_receive_from(null_buffers(),
-        endpoint, in_flags, &receive_handler);
+        endpoint, in_flags, receive_handler());
     int i25 = socket1.async_receive_from(buffer(mutable_char_buffer),
         endpoint, lazy);
     (void)i25;
@@ -470,10 +491,17 @@
 
 namespace ip_udp_resolver_compile {
 
-void resolve_handler(const asio::error_code&,
-    asio::ip::udp::resolver::iterator)
+struct resolve_handler
 {
-}
+  resolve_handler() {}
+  void operator()(const asio::error_code&,
+      asio::ip::udp::resolver::iterator) {}
+#if defined(ASIO_HAS_MOVE)
+  resolve_handler(resolve_handler&&) {}
+private:
+  resolve_handler(const resolve_handler&);
+#endif // defined(ASIO_HAS_MOVE)
+};
 
 void test()
 {
@@ -513,11 +541,11 @@
     ip::udp::resolver::iterator iter4 = resolver.resolve(e, ec);
     (void)iter4;
 
-    resolver.async_resolve(q, &resolve_handler);
+    resolver.async_resolve(q, resolve_handler());
     int i1 = resolver.async_resolve(q, lazy);
     (void)i1;
 
-    resolver.async_resolve(e, &resolve_handler);
+    resolver.async_resolve(e, resolve_handler());
     int i2 = resolver.async_resolve(e, lazy);
     (void)i2;
   }
diff --git a/asio/src/tests/unit/read.cpp b/asio/src/tests/unit/read.cpp
index 027b1ea..e66c4fe 100644
--- a/asio/src/tests/unit/read.cpp
+++ b/asio/src/tests/unit/read.cpp
@@ -20,6 +20,7 @@
 #include <vector>
 #include "archetypes/async_result.hpp"
 #include "asio/io_service.hpp"
+#include "asio/post.hpp"
 #include "asio/streambuf.hpp"
 #include "unit_test.hpp"
 
@@ -42,7 +43,7 @@
 class test_stream
 {
 public:
-  typedef asio::io_service io_service_type;
+  typedef asio::io_service::executor_type executor_type;
 
   test_stream(asio::io_service& io_service)
     : io_service_(io_service),
@@ -52,9 +53,9 @@
   {
   }
 
-  io_service_type& get_io_service()
+  executor_type get_executor() ASIO_NOEXCEPT
   {
-    return io_service_;
+    return io_service_.get_executor();
   }
 
   void reset(const void* data, size_t length)
@@ -117,12 +118,14 @@
   void async_read_some(const Mutable_Buffers& buffers, Handler handler)
   {
     size_t bytes_transferred = read_some(buffers);
-    io_service_.post(asio::detail::bind_handler(
-          handler, asio::error_code(), bytes_transferred));
+    asio::post(get_executor(),
+        asio::detail::bind_handler(
+          ASIO_MOVE_CAST(Handler)(handler),
+          asio::error_code(), bytes_transferred));
   }
 
 private:
-  io_service_type& io_service_;
+  asio::io_service& io_service_;
   enum { max_length = 8192 };
   char data_[max_length];
   size_t length_;
diff --git a/asio/src/tests/unit/read_at.cpp b/asio/src/tests/unit/read_at.cpp
index a4c8c2a..b63cd2e 100644
--- a/asio/src/tests/unit/read_at.cpp
+++ b/asio/src/tests/unit/read_at.cpp
@@ -19,6 +19,7 @@
 #include <cstring>
 #include "archetypes/async_result.hpp"
 #include "asio/io_service.hpp"
+#include "asio/post.hpp"
 #include "asio/streambuf.hpp"
 #include "unit_test.hpp"
 
@@ -41,7 +42,7 @@
 class test_random_access_device
 {
 public:
-  typedef asio::io_service io_service_type;
+  typedef asio::io_service::executor_type executor_type;
 
   test_random_access_device(asio::io_service& io_service)
     : io_service_(io_service),
@@ -50,9 +51,9 @@
   {
   }
 
-  io_service_type& get_io_service()
+  executor_type get_executor() ASIO_NOEXCEPT
   {
-    return io_service_;
+    return io_service_.get_executor();
   }
 
   void reset(const void* data, size_t length)
@@ -120,12 +121,14 @@
       const Mutable_Buffers& buffers, Handler handler)
   {
     size_t bytes_transferred = read_some_at(offset, buffers);
-    io_service_.post(asio::detail::bind_handler(
-          handler, asio::error_code(), bytes_transferred));
+    asio::post(get_executor(),
+        asio::detail::bind_handler(
+          ASIO_MOVE_CAST(Handler)(handler),
+          asio::error_code(), bytes_transferred));
   }
 
 private:
-  io_service_type& io_service_;
+  asio::io_service& io_service_;
   enum { max_length = 8192 };
   char data_[max_length];
   size_t length_;
diff --git a/asio/src/tests/unit/read_until.cpp b/asio/src/tests/unit/read_until.cpp
index 70a415e..f270202 100644
--- a/asio/src/tests/unit/read_until.cpp
+++ b/asio/src/tests/unit/read_until.cpp
@@ -19,6 +19,7 @@
 #include <cstring>
 #include "archetypes/async_result.hpp"
 #include "asio/io_service.hpp"
+#include "asio/post.hpp"
 #include "asio/streambuf.hpp"
 #include "unit_test.hpp"
 
@@ -31,7 +32,7 @@
 class test_stream
 {
 public:
-  typedef asio::io_service io_service_type;
+  typedef asio::io_service::executor_type executor_type;
 
   test_stream(asio::io_service& io_service)
     : io_service_(io_service),
@@ -41,9 +42,9 @@
   {
   }
 
-  io_service_type& get_io_service()
+  executor_type get_executor() ASIO_NOEXCEPT
   {
-    return io_service_;
+    return io_service_.get_executor();
   }
 
   void reset(const void* data, size_t length)
@@ -85,12 +86,14 @@
   void async_read_some(const Mutable_Buffers& buffers, Handler handler)
   {
     size_t bytes_transferred = read_some(buffers);
-    io_service_.post(asio::detail::bind_handler(
-          handler, asio::error_code(), bytes_transferred));
+    asio::post(get_executor(),
+        asio::detail::bind_handler(
+          ASIO_MOVE_CAST(Handler)(handler),
+          asio::error_code(), bytes_transferred));
   }
 
 private:
-  io_service_type& io_service_;
+  asio::io_service& io_service_;
   enum { max_length = 8192 };
   char data_[max_length];
   size_t length_;
diff --git a/asio/src/tests/unit/serial_port.cpp b/asio/src/tests/unit/serial_port.cpp
index 0e4dd2c..4fdcd6b 100644
--- a/asio/src/tests/unit/serial_port.cpp
+++ b/asio/src/tests/unit/serial_port.cpp
@@ -30,13 +30,27 @@
 
 namespace serial_port_compile {
 
-void write_some_handler(const asio::error_code&, std::size_t)
+struct write_some_handler
 {
-}
+  write_some_handler() {}
+  void operator()(const asio::error_code&, std::size_t) {}
+#if defined(ASIO_HAS_MOVE)
+  write_some_handler(write_some_handler&&) {}
+private:
+  write_some_handler(const write_some_handler&);
+#endif // defined(ASIO_HAS_MOVE)
+};
 
-void read_some_handler(const asio::error_code&, std::size_t)
+struct read_some_handler
 {
-}
+  read_some_handler() {}
+  void operator()(const asio::error_code&, std::size_t) {}
+#if defined(ASIO_HAS_MOVE)
+  read_some_handler(read_some_handler&&) {}
+private:
+  read_some_handler(const read_some_handler&);
+#endif // defined(ASIO_HAS_MOVE)
+};
 
 void test()
 {
@@ -118,8 +132,8 @@
     port1.write_some(buffer(mutable_char_buffer), ec);
     port1.write_some(buffer(const_char_buffer), ec);
 
-    port1.async_write_some(buffer(mutable_char_buffer), &write_some_handler);
-    port1.async_write_some(buffer(const_char_buffer), &write_some_handler);
+    port1.async_write_some(buffer(mutable_char_buffer), write_some_handler());
+    port1.async_write_some(buffer(const_char_buffer), write_some_handler());
     int i1 = port1.async_write_some(buffer(mutable_char_buffer), lazy);
     (void)i1;
     int i2 = port1.async_write_some(buffer(const_char_buffer), lazy);
@@ -128,7 +142,7 @@
     port1.read_some(buffer(mutable_char_buffer));
     port1.read_some(buffer(mutable_char_buffer), ec);
 
-    port1.async_read_some(buffer(mutable_char_buffer), &read_some_handler);
+    port1.async_read_some(buffer(mutable_char_buffer), read_some_handler());
     int i3 = port1.async_read_some(buffer(mutable_char_buffer), lazy);
     (void)i3;
   }
diff --git a/asio/src/tests/unit/system_timer.cpp b/asio/src/tests/unit/system_timer.cpp
index 021ee33..605d83e 100644
--- a/asio/src/tests/unit/system_timer.cpp
+++ b/asio/src/tests/unit/system_timer.cpp
@@ -233,9 +233,16 @@
   ASIO_CHECK(expected_end < end || expected_end == end);
 }
 
-void timer_handler(const asio::error_code&)
+struct timer_handler
 {
-}
+  timer_handler() {}
+  void operator()(const asio::error_code&) {}
+#if defined(ASIO_HAS_MOVE)
+  timer_handler(timer_handler&&) {}
+private:
+  timer_handler(const timer_handler&);
+#endif // defined(ASIO_HAS_MOVE)
+};
 
 void system_timer_cancel_test()
 {
@@ -249,10 +256,10 @@
     }
   } timers[50];
 
-  timers[2].t.async_wait(&timer_handler);
-  timers[41].t.async_wait(&timer_handler);
+  timers[2].t.async_wait(timer_handler());
+  timers[41].t.async_wait(timer_handler());
   for (int i = 10; i < 20; ++i)
-    timers[i].t.async_wait(&timer_handler);
+    timers[i].t.async_wait(timer_handler());
 
   ASIO_CHECK(timers[2].t.cancel() == 1);
   ASIO_CHECK(timers[41].t.cancel() == 1);
diff --git a/asio/src/tests/unit/write.cpp b/asio/src/tests/unit/write.cpp
index 1969019..c8843a4 100644
--- a/asio/src/tests/unit/write.cpp
+++ b/asio/src/tests/unit/write.cpp
@@ -20,6 +20,7 @@
 #include <vector>
 #include "archetypes/async_result.hpp"
 #include "asio/io_service.hpp"
+#include "asio/post.hpp"
 #include "asio/streambuf.hpp"
 #include "unit_test.hpp"
 
@@ -42,7 +43,7 @@
 class test_stream
 {
 public:
-  typedef asio::io_service io_service_type;
+  typedef asio::io_service::executor_type executor_type;
 
   test_stream(asio::io_service& io_service)
     : io_service_(io_service),
@@ -53,9 +54,9 @@
     memset(data_, 0, max_length);
   }
 
-  io_service_type& get_io_service()
+  executor_type get_executor() ASIO_NOEXCEPT
   {
-    return io_service_;
+    return io_service_.get_executor();
   }
 
   void reset(size_t length = max_length)
@@ -117,12 +118,14 @@
   void async_write_some(const Const_Buffers& buffers, Handler handler)
   {
     size_t bytes_transferred = write_some(buffers);
-    io_service_.post(asio::detail::bind_handler(
-          handler, asio::error_code(), bytes_transferred));
+    asio::post(get_executor(),
+        asio::detail::bind_handler(
+          ASIO_MOVE_CAST(Handler)(handler),
+          asio::error_code(), bytes_transferred));
   }
 
 private:
-  io_service_type& io_service_;
+  asio::io_service& io_service_;
   enum { max_length = 8192 };
   char data_[max_length];
   size_t length_;
diff --git a/asio/src/tests/unit/write_at.cpp b/asio/src/tests/unit/write_at.cpp
index 6ee1ea1..1f97a39 100644
--- a/asio/src/tests/unit/write_at.cpp
+++ b/asio/src/tests/unit/write_at.cpp
@@ -19,6 +19,7 @@
 #include <cstring>
 #include "archetypes/async_result.hpp"
 #include "asio/io_service.hpp"
+#include "asio/post.hpp"
 #include "asio/streambuf.hpp"
 #include "unit_test.hpp"
 
@@ -41,7 +42,7 @@
 class test_random_access_device
 {
 public:
-  typedef asio::io_service io_service_type;
+  typedef asio::io_service::executor_type executor_type;
 
   test_random_access_device(asio::io_service& io_service)
     : io_service_(io_service),
@@ -51,9 +52,9 @@
     memset(data_, 0, max_length);
   }
 
-  io_service_type& get_io_service()
+  executor_type get_executor() ASIO_NOEXCEPT
   {
-    return io_service_;
+    return io_service_.get_executor();
   }
 
   void reset()
@@ -113,12 +114,14 @@
       const Const_Buffers& buffers, Handler handler)
   {
     size_t bytes_transferred = write_some_at(offset, buffers);
-    io_service_.post(asio::detail::bind_handler(
-          handler, asio::error_code(), bytes_transferred));
+    asio::post(get_executor(),
+        asio::detail::bind_handler(
+          ASIO_MOVE_CAST(Handler)(handler),
+          asio::error_code(), bytes_transferred));
   }
 
 private:
-  io_service_type& io_service_;
+  asio::io_service& io_service_;
   enum { max_length = 8192 };
   char data_[max_length];
   size_t length_;