Disable io_context::work when ASIO_NO_DEPRECATED is defined.
diff --git a/asio/include/asio/detail/impl/resolver_service_base.ipp b/asio/include/asio/detail/impl/resolver_service_base.ipp
index 0bafbd1..95ba15f 100644
--- a/asio/include/asio/detail/impl/resolver_service_base.ipp
+++ b/asio/include/asio/detail/impl/resolver_service_base.ipp
@@ -39,7 +39,7 @@
     work_io_context_(new asio::io_context),
     work_io_context_impl_(asio::use_service<
         io_context_impl>(*work_io_context_)),
-    work_(new asio::io_context::work(*work_io_context_)),
+    work_(asio::make_work_guard(*work_io_context_)),
     work_thread_(0)
 {
 }
diff --git a/asio/include/asio/detail/resolver_service_base.hpp b/asio/include/asio/detail/resolver_service_base.hpp
index d74d35c..adf05ae 100644
--- a/asio/include/asio/detail/resolver_service_base.hpp
+++ b/asio/include/asio/detail/resolver_service_base.hpp
@@ -17,6 +17,7 @@
 
 #include "asio/detail/config.hpp"
 #include "asio/error.hpp"
+#include "asio/executor_work_guard.hpp"
 #include "asio/io_context.hpp"
 #include "asio/detail/mutex.hpp"
 #include "asio/detail/noncopyable.hpp"
@@ -120,7 +121,8 @@
   io_context_impl& work_io_context_impl_;
 
   // Work for the private io_context to perform.
-  asio::detail::scoped_ptr<asio::io_context::work> work_;
+  asio::executor_work_guard<
+      asio::io_context::executor_type> work_;
 
   // Thread used for running the work io_context's run loop.
   asio::detail::scoped_ptr<asio::detail::thread> work_thread_;
diff --git a/asio/include/asio/impl/io_context.hpp b/asio/include/asio/impl/io_context.hpp
index 6495568..45805ae 100644
--- a/asio/include/asio/impl/io_context.hpp
+++ b/asio/include/asio/impl/io_context.hpp
@@ -311,6 +311,7 @@
   return io_context_.impl_.can_dispatch();
 }
 
+#if !defined(ASIO_NO_DEPRECATED)
 inline io_context::work::work(asio::io_context& io_context)
   : io_context_impl_(io_context.impl_)
 {
@@ -333,7 +334,6 @@
   return static_cast<asio::io_context&>(io_context_impl_.context());
 }
 
-#if !defined(ASIO_NO_DEPRECATED)
 inline asio::io_context& io_context::work::get_io_service()
 {
   return static_cast<asio::io_context&>(io_context_impl_.context());
diff --git a/asio/include/asio/io_context.hpp b/asio/include/asio/io_context.hpp
index 03d7701..b4d0cb7 100644
--- a/asio/include/asio/io_context.hpp
+++ b/asio/include/asio/io_context.hpp
@@ -123,10 +123,12 @@
  * returning when there is no more work to do. For example, the 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 asio::io_context::work:
+ * creating an object of type
+ * asio::executor_work_guard<io_context::executor_type>:
  *
  * @code asio::io_context io_context;
- * asio::io_context::work work(io_context);
+ * asio::executor_work_guard<asio::io_context::executor_type>
+ *   = asio::make_work_guard(io_context);
  * ... @endcode
  *
  * To effect a shutdown, the application will then need to call the io_context
@@ -135,11 +137,11 @@
  * 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.
+ * be allowed to finish normally, the work object may be explicitly reset.
  *
  * @code asio::io_context io_context;
- * auto_ptr<asio::io_context::work> work(
- *     new asio::io_context::work(io_context));
+ * asio::executor_work_guard<asio::io_context::executor_type>
+ *   = asio::make_work_guard(io_context);
  * ...
  * work.reset(); // Allow run() to exit. @endcode
  */
@@ -156,8 +158,10 @@
   class executor_type;
   friend class executor_type;
 
+#if !defined(ASIO_NO_DEPRECATED)
   class work;
   friend class work;
+#endif // !defined(ASIO_NO_DEPRECATED)
 
   class service;
 
@@ -680,6 +684,7 @@
   io_context& io_context_;
 };
 
+#if !defined(ASIO_NO_DEPRECATED)
 /// (Deprecated: Use executor_work_guard.) Class to inform the io_context when
 /// it has work to do.
 /**
@@ -734,6 +739,7 @@
   // The io_context implementation.
   detail::io_context_impl& io_context_impl_;
 };
+#endif // !defined(ASIO_NO_DEPRECATED)
 
 /// Base class for all io_context services.
 class io_context::service
diff --git a/asio/src/doc/quickref.xml b/asio/src/doc/quickref.xml
index 5a8ff55..860efa2 100644
--- a/asio/src/doc/quickref.xml
+++ b/asio/src/doc/quickref.xml
@@ -38,7 +38,7 @@
             <member><link linkend="asio.reference.io_context__executor_type">io_context::executor_type</link></member>
             <member><link linkend="asio.reference.io_context__service">io_context::service</link></member>
             <member><link linkend="asio.reference.io_context__strand">io_context::strand</link></member>
-            <member><link linkend="asio.reference.io_context__work">io_context::work</link></member>
+            <member><link linkend="asio.reference.io_context__work">io_context::work</link> (deprecated)</member>
             <member><link linkend="asio.reference.service_already_exists">service_already_exists</link></member>
             <member><link linkend="asio.reference.system_error">system_error</link></member>
             <member><link linkend="asio.reference.system_executor">system_executor</link></member>
diff --git a/asio/src/examples/cpp03/http/server2/io_context_pool.cpp b/asio/src/examples/cpp03/http/server2/io_context_pool.cpp
index 9db89e4..9ce0fc4 100644
--- a/asio/src/examples/cpp03/http/server2/io_context_pool.cpp
+++ b/asio/src/examples/cpp03/http/server2/io_context_pool.cpp
@@ -27,7 +27,7 @@
   for (std::size_t i = 0; i < pool_size; ++i)
   {
     io_context_ptr io_context(new asio::io_context);
-    work_ptr work(new asio::io_context::work(*io_context));
+    work_ptr work(new io_context_work(asio::make_work_guard(*io_context)));
     io_contexts_.push_back(io_context);
     work_.push_back(work);
   }
diff --git a/asio/src/examples/cpp03/http/server2/io_context_pool.hpp b/asio/src/examples/cpp03/http/server2/io_context_pool.hpp
index 0c049d4..a20f489 100644
--- a/asio/src/examples/cpp03/http/server2/io_context_pool.hpp
+++ b/asio/src/examples/cpp03/http/server2/io_context_pool.hpp
@@ -38,7 +38,9 @@
 
 private:
   typedef boost::shared_ptr<asio::io_context> io_context_ptr;
-  typedef boost::shared_ptr<asio::io_context::work> work_ptr;
+  typedef asio::executor_work_guard<
+    asio::io_context::executor_type> io_context_work;
+  typedef boost::shared_ptr<io_context_work> work_ptr;
 
   /// The pool of io_contexts.
   std::vector<io_context_ptr> io_contexts_;
diff --git a/asio/src/examples/cpp03/services/logger_service.hpp b/asio/src/examples/cpp03/services/logger_service.hpp
index 7286c0d..9f175df 100644
--- a/asio/src/examples/cpp03/services/logger_service.hpp
+++ b/asio/src/examples/cpp03/services/logger_service.hpp
@@ -44,7 +44,7 @@
   logger_service(asio::io_context& io_context)
     : asio::io_context::service(io_context),
       work_io_context_(),
-      work_(new asio::io_context::work(work_io_context_)),
+      work_(asio::make_work_guard(work_io_context_)),
       work_thread_(new asio::thread(
             boost::bind(&asio::io_context::run, &work_io_context_)))
   {
@@ -130,7 +130,8 @@
   /// Work for the private io_context to perform. If we do not give the
   /// io_context some work to do then the io_context::run() function will exit
   /// immediately.
-  boost::scoped_ptr<asio::io_context::work> work_;
+  asio::executor_work_guard<
+      asio::io_context::executor_type> work_;
 
   /// Thread used for running the work io_context's run loop.
   boost::scoped_ptr<asio::thread> work_thread_;
diff --git a/asio/src/examples/cpp11/futures/daytime_client.cpp b/asio/src/examples/cpp11/futures/daytime_client.cpp
index f1d4650..0004e12 100644
--- a/asio/src/examples/cpp11/futures/daytime_client.cpp
+++ b/asio/src/examples/cpp11/futures/daytime_client.cpp
@@ -77,7 +77,7 @@
     // We run the io_context off in its own thread so that it operates
     // completely asynchronously with respect to the rest of the program.
     asio::io_context io_context;
-    asio::io_context::work work(io_context);
+    auto work = asio::make_work_guard(io_context);
     std::thread thread([&io_context](){ io_context.run(); });
 
     get_daytime(io_context, argv[1]);
diff --git a/asio/src/tests/unit/deadline_timer.cpp b/asio/src/tests/unit/deadline_timer.cpp
index 0e38984..1b6e44a 100644
--- a/asio/src/tests/unit/deadline_timer.cpp
+++ b/asio/src/tests/unit/deadline_timer.cpp
@@ -22,6 +22,7 @@
 
 #include <boost/bind.hpp>
 #include "archetypes/async_result.hpp"
+#include "asio/executor_work_guard.hpp"
 #include "asio/io_context.hpp"
 #include "asio/placeholders.hpp"
 #include "asio/thread.hpp"
@@ -304,7 +305,8 @@
 void deadline_timer_thread_test()
 {
   asio::io_context ioc;
-  asio::io_context::work w(ioc);
+  asio::executor_work_guard<asio::io_context::executor_type> work
+    = asio::make_work_guard(ioc);
   asio::deadline_timer t1(ioc);
   asio::deadline_timer t2(ioc);
   int count = 0;
diff --git a/asio/src/tests/unit/io_context.cpp b/asio/src/tests/unit/io_context.cpp
index cf16489..530d139 100644
--- a/asio/src/tests/unit/io_context.cpp
+++ b/asio/src/tests/unit/io_context.cpp
@@ -150,7 +150,7 @@
 
   count = 0;
   ioc.restart();
-  io_context::work* w = new io_context::work(ioc);
+  executor_work_guard<io_context::executor_type> w = make_work_guard(ioc);
   asio::post(ioc, bindns::bind(&io_context::stop, &ioc));
   ASIO_CHECK(!ioc.stopped());
   ioc.run();
@@ -161,7 +161,7 @@
 
   ioc.restart();
   asio::post(ioc, bindns::bind(increment, &count));
-  delete w;
+  w.reset();
 
   // No handlers can be called until run() is called.
   ASIO_CHECK(!ioc.stopped());
diff --git a/asio/src/tests/unit/system_timer.cpp b/asio/src/tests/unit/system_timer.cpp
index 26d4f4e..3f77a2e 100644
--- a/asio/src/tests/unit/system_timer.cpp
+++ b/asio/src/tests/unit/system_timer.cpp
@@ -25,6 +25,7 @@
 
 #if defined(ASIO_HAS_STD_CHRONO)
 
+#include "asio/executor_work_guard.hpp"
 #include "asio/io_context.hpp"
 #include "asio/thread.hpp"
 
@@ -325,7 +326,8 @@
 void system_timer_thread_test()
 {
   asio::io_context ioc;
-  asio::io_context::work w(ioc);
+  asio::executor_work_guard<asio::io_context::executor_type> work
+    = asio::make_work_guard(ioc);
   asio::system_timer t1(ioc);
   asio::system_timer t2(ioc);
   int count = 0;