Add forward declaration header as specified by TS.
diff --git a/asio/include/Makefile.am b/asio/include/Makefile.am
index 02cf03e..8b1fb27 100644
--- a/asio/include/Makefile.am
+++ b/asio/include/Makefile.am
@@ -440,6 +440,7 @@
 	asio/ts/executor.hpp \
 	asio/ts/internet.hpp \
 	asio/ts/io_context.hpp \
+	asio/ts/netfwd.hpp \
 	asio/ts/networking.hpp \
 	asio/ts/socket.hpp \
 	asio/ts/thread_pool.hpp \
diff --git a/asio/include/asio/basic_socket_iostream.hpp b/asio/include/asio/basic_socket_iostream.hpp
index e1778bc..836e2cf 100644
--- a/asio/include/asio/basic_socket_iostream.hpp
+++ b/asio/include/asio/basic_socket_iostream.hpp
@@ -93,19 +93,34 @@
 
 } // namespace detail
 
-/// Iostream interface for a socket.
+#if !defined(ASIO_BASIC_SOCKET_IOSTREAM_FWD_DECL)
+#define ASIO_BASIC_SOCKET_IOSTREAM_FWD_DECL
+
+// Forward declaration with defaulted arguments.
 template <typename Protocol
     ASIO_SVC_TPARAM_DEF1(= stream_socket_service<Protocol>),
-#if defined(ASIO_HAS_BOOST_DATE_TIME) \
-  || defined(GENERATING_DOCUMENTATION)
+#if defined(ASIO_HAS_BOOST_DATE_TIME)
     typename Time = boost::posix_time::ptime,
-    typename TimeTraits = asio::time_traits<Time>
+    typename TimeTraits = 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 Time = chrono::steady_clock,
+    typename TimeTraits = wait_traits<Time>
     ASIO_SVC_TPARAM1_DEF1(= steady_timer::service_type)>
 #endif
+class basic_socket_iostream;
+
+#endif // !defined(ASIO_BASIC_SOCKET_IOSTREAM_FWD_DECL)
+
+/// Iostream interface for a socket.
+#if defined(GENERATING_DOCUMENTATION)
+template <typename Protocol,
+    typename Time = chrono::steady_clock,
+    typename TimeTraits = wait_traits<Time> >
+#else // defined(GENERATING_DOCUMENTATION)
+template <typename Protocol ASIO_SVC_TPARAM,
+    typename Time, typename TimeTraits ASIO_SVC_TPARAM1>
+#endif // defined(GENERATING_DOCUMENTATION)
 class basic_socket_iostream
   : private detail::socket_iostream_base<Protocol
         ASIO_SVC_TARG, Time, TimeTraits ASIO_SVC_TARG1>,
diff --git a/asio/include/asio/basic_socket_streambuf.hpp b/asio/include/asio/basic_socket_streambuf.hpp
index 6f12696..bae1abe 100644
--- a/asio/include/asio/basic_socket_streambuf.hpp
+++ b/asio/include/asio/basic_socket_streambuf.hpp
@@ -22,6 +22,7 @@
 #include <streambuf>
 #include "asio/basic_socket.hpp"
 #include "asio/detail/array.hpp"
+#include "asio/detail/deadline_timer_service.hpp"
 #include "asio/detail/throw_error.hpp"
 #include "asio/io_context.hpp"
 #include "asio/stream_socket_service.hpp"
@@ -85,19 +86,34 @@
 
 } // namespace detail
 
-/// Iostream streambuf for a socket.
+#if !defined(ASIO_BASIC_SOCKET_STREAMBUF_FWD_DECL)
+#define ASIO_BASIC_SOCKET_STREAMBUF_FWD_DECL
+
+// Forward declaration with defaulted arguments.
 template <typename Protocol
     ASIO_SVC_TPARAM_DEF1(= stream_socket_service<Protocol>),
-#if defined(ASIO_HAS_BOOST_DATE_TIME) \
-  || defined(GENERATING_DOCUMENTATION)
+#if defined(ASIO_HAS_BOOST_DATE_TIME)
     typename Time = boost::posix_time::ptime,
-    typename TimeTraits = asio::time_traits<Time>
+    typename TimeTraits = 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 Time = chrono::steady_clock,
+    typename TimeTraits = wait_traits<Time>
     ASIO_SVC_TPARAM1_DEF1(= steady_timer::service_type)>
 #endif
+class basic_socket_streambuf;
+
+#endif // !defined(ASIO_BASIC_SOCKET_STREAMBUF_FWD_DECL)
+
+/// Iostream streambuf for a socket.
+#if defined(GENERATING_DOCUMENTATION)
+template <typename Protocol,
+    typename Time = chrono::steady_clock,
+    typename TimeTraits = wait_traits<Time> >
+#else // defined(GENERATING_DOCUMENTATION)
+template <typename Protocol ASIO_SVC_TPARAM,
+    typename Time, typename TimeTraits ASIO_SVC_TPARAM1>
+#endif // defined(GENERATING_DOCUMENTATION)
 class basic_socket_streambuf
   : public std::streambuf,
     private detail::socket_streambuf_base,
diff --git a/asio/include/asio/basic_waitable_timer.hpp b/asio/include/asio/basic_waitable_timer.hpp
index e38d39e..7d3a09e 100644
--- a/asio/include/asio/basic_waitable_timer.hpp
+++ b/asio/include/asio/basic_waitable_timer.hpp
@@ -40,6 +40,17 @@
 
 namespace asio {
 
+#if !defined(ASIO_BASIC_WAITABLE_TIMER_FWD_DECL)
+#define ASIO_BASIC_WAITABLE_TIMER_FWD_DECL
+
+// Forward declaration with defaulted arguments.
+template <typename Clock,
+    typename WaitTraits = asio::wait_traits<Clock>
+    ASIO_SVC_TPARAM_DEF2(= waitable_timer_service<Clock, WaitTraits>)>
+class basic_waitable_timer;
+
+#endif // !defined(ASIO_BASIC_WAITABLE_TIMER_FWD_DECL)
+
 /// Provides waitable timer functionality.
 /**
  * The basic_waitable_timer class template provides the ability to perform a
@@ -132,9 +143,7 @@
  * @li If a wait handler is cancelled, the asio::error_code passed to
  * it contains the value asio::error::operation_aborted.
  */
-template <typename Clock,
-    typename WaitTraits = asio::wait_traits<Clock>
-    ASIO_SVC_TPARAM_DEF2(= waitable_timer_service<Clock, WaitTraits>)>
+template <typename Clock, typename WaitTraits ASIO_SVC_TPARAM>
 class basic_waitable_timer
   : ASIO_SVC_ACCESS basic_io_object<ASIO_SVC_T>
 {
diff --git a/asio/include/asio/ts/netfwd.hpp b/asio/include/asio/ts/netfwd.hpp
new file mode 100644
index 0000000..a5e94ed
--- /dev/null
+++ b/asio/include/asio/ts/netfwd.hpp
@@ -0,0 +1,197 @@
+//
+// ts/netfwd.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_TS_NETFWD_HPP
+#define ASIO_TS_NETFWD_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_HAS_CHRONO)
+# include "asio/detail/chrono.hpp"
+#endif // defined(ASIO_HAS_CHRONO)
+
+#if defined(ASIO_HAS_BOOST_DATE_TIME)
+# include "asio/detail/date_time_fwd.hpp"
+#endif // defined(ASIO_HAS_BOOST_DATE_TIME)
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+class execution_context;
+
+template <typename T, typename Executor>
+class executor_binder;
+
+template <typename Executor>
+class executor_work_guard;
+
+class system_executor;
+
+class executor;
+
+template <typename Executor>
+class strand;
+
+class io_context;
+
+template <typename Clock>
+struct wait_traits;
+
+#if defined(ASIO_HAS_BOOST_DATE_TIME)
+
+template <typename Time>
+struct time_traits;
+
+#endif // defined(ASIO_HAS_BOOST_DATE_TIME)
+
+#if defined(ASIO_ENABLE_OLD_SERVICES)
+
+template <typename Clock, typename WaitTraits>
+class waitable_timer_service;
+
+#if defined(ASIO_HAS_BOOST_DATE_TIME)
+
+template <typename TimeType, typename TimeTraits>
+class deadline_timer_service;
+
+#endif // defined(ASIO_HAS_BOOST_DATE_TIME)
+
+#endif // defined(ASIO_ENABLE_OLD_SERVICES)
+
+#if !defined(ASIO_BASIC_WAITABLE_TIMER_FWD_DECL)
+#define ASIO_BASIC_WAITABLE_TIMER_FWD_DECL
+
+template <typename Clock,
+    typename WaitTraits = asio::wait_traits<Clock>
+    ASIO_SVC_TPARAM_DEF2(= waitable_timer_service<Clock, WaitTraits>)>
+class basic_waitable_timer;
+
+#endif // !defined(ASIO_BASIC_WAITABLE_TIMER_FWD_DECL)
+
+#if defined(ASIO_HAS_CHRONO)
+
+typedef basic_waitable_timer<chrono::system_clock> system_timer;
+
+typedef basic_waitable_timer<chrono::steady_clock> steady_timer;
+
+typedef basic_waitable_timer<chrono::high_resolution_clock>
+  high_resolution_timer;
+
+#endif // defined(ASIO_HAS_CHRONO)
+
+template <class Protocol ASIO_SVC_TPARAM>
+class basic_socket;
+
+template <typename Protocol ASIO_SVC_TPARAM>
+class basic_datagram_socket;
+
+template <typename Protocol ASIO_SVC_TPARAM>
+class basic_stream_socket;
+
+template <typename Protocol ASIO_SVC_TPARAM>
+class basic_socket_acceptor;
+
+#if !defined(ASIO_BASIC_SOCKET_STREAMBUF_FWD_DECL)
+#define ASIO_BASIC_SOCKET_STREAMBUF_FWD_DECL
+
+// Forward declaration with defaulted arguments.
+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 = time_traits<Time>
+    ASIO_SVC_TPARAM1_DEF2(= deadline_timer_service<Time, TimeTraits>)>
+#else
+    typename Time = chrono::steady_clock,
+    typename TimeTraits = wait_traits<Time>
+    ASIO_SVC_TPARAM1_DEF1(= steady_timer::service_type)>
+#endif
+class basic_socket_streambuf;
+
+#endif // !defined(ASIO_BASIC_SOCKET_STREAMBUF_FWD_DECL)
+
+#if !defined(ASIO_BASIC_SOCKET_IOSTREAM_FWD_DECL)
+#define ASIO_BASIC_SOCKET_IOSTREAM_FWD_DECL
+
+// Forward declaration with defaulted arguments.
+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 = time_traits<Time>
+    ASIO_SVC_TPARAM1_DEF2(= deadline_timer_service<Time, TimeTraits>)>
+#else
+    typename Time = chrono::steady_clock,
+    typename TimeTraits = wait_traits<Time>
+    ASIO_SVC_TPARAM1_DEF1(= steady_timer::service_type)>
+#endif
+class basic_socket_iostream;
+
+#endif // !defined(ASIO_BASIC_SOCKET_IOSTREAM_FWD_DECL)
+
+namespace ip {
+
+class address;
+
+class address_v4;
+
+class address_v6;
+
+template <typename Address>
+class basic_address_iterator;
+
+typedef basic_address_iterator<address_v4> address_v4_iterator;
+
+typedef basic_address_iterator<address_v6> address_v6_iterator;
+
+template <typename Address>
+class basic_address_range;
+
+typedef basic_address_range<address_v4> address_v4_range;
+
+typedef basic_address_range<address_v6> address_v6_range;
+
+class network_v4;
+
+class network_v6;
+
+template <typename InternetProtocol>
+class basic_endpoint;
+
+template <typename InternetProtocol>
+class basic_resolver_entry;
+
+template <typename InternetProtocol>
+class basic_resolver_results;
+
+template <typename InternetProtocol ASIO_SVC_TPARAM>
+class basic_resolver;
+
+class tcp;
+
+class udp;
+
+} // namespace ip
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+#endif // ASIO_TS_NETFWD_HPP
diff --git a/asio/include/asio/ts/networking.hpp b/asio/include/asio/ts/networking.hpp
index 75ac6e8..94f677d 100644
--- a/asio/include/asio/ts/networking.hpp
+++ b/asio/include/asio/ts/networking.hpp
@@ -15,6 +15,7 @@
 # pragma once
 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
 
+#include "asio/ts/netfwd.hpp"
 #include "asio/ts/executor.hpp"
 #include "asio/ts/io_context.hpp"
 #include "asio/ts/timer.hpp"