Add basic_address_iterator and basic_address_range templates.

Class address_iterator_v4 is now typedef address_v4_iterator.
Class address_range_v4 is now typedef address_v4_range.
Class address_iterator_v6 is now typedef address_v6_iterator.
Class address_range_v6 is now typedef address_v6_range.
diff --git a/asio/include/Makefile.am b/asio/include/Makefile.am
index 8defef3..e56250d 100644
--- a/asio/include/Makefile.am
+++ b/asio/include/Makefile.am
@@ -321,12 +321,12 @@
 	asio/io_service_strand.hpp \
 	asio/io_service.hpp \
 	asio/ip/address.hpp \
-	asio/ip/address_iterator_v4.hpp \
-	asio/ip/address_iterator_v6.hpp \
-	asio/ip/address_range_v4.hpp \
-	asio/ip/address_range_v6.hpp \
 	asio/ip/address_v4.hpp \
+	asio/ip/address_v4_iterator.hpp \
+	asio/ip/address_v4_range.hpp \
 	asio/ip/address_v6.hpp \
+	asio/ip/address_v6_iterator.hpp \
+	asio/ip/address_v6_range.hpp \
 	asio/ip/bad_address_cast.hpp \
 	asio/ip/basic_endpoint.hpp \
 	asio/ip/basic_resolver_entry.hpp \
diff --git a/asio/include/asio.hpp b/asio/include/asio.hpp
index 61acc16..4b9e94c 100644
--- a/asio/include/asio.hpp
+++ b/asio/include/asio.hpp
@@ -64,10 +64,12 @@
 #include "asio/io_service.hpp"
 #include "asio/io_service_strand.hpp"
 #include "asio/ip/address.hpp"
-#include "asio/ip/address_iterator_v4.hpp"
-#include "asio/ip/address_range_v4.hpp"
 #include "asio/ip/address_v4.hpp"
+#include "asio/ip/address_v4_iterator.hpp"
+#include "asio/ip/address_v4_range.hpp"
 #include "asio/ip/address_v6.hpp"
+#include "asio/ip/address_v6_iterator.hpp"
+#include "asio/ip/address_v6_range.hpp"
 #include "asio/ip/bad_address_cast.hpp"
 #include "asio/ip/basic_endpoint.hpp"
 #include "asio/ip/basic_resolver.hpp"
diff --git a/asio/include/asio/ip/address_iterator_v4.hpp b/asio/include/asio/ip/address_v4_iterator.hpp
similarity index 68%
rename from asio/include/asio/ip/address_iterator_v4.hpp
rename to asio/include/asio/ip/address_v4_iterator.hpp
index 8ae7869..9defad9 100644
--- a/asio/include/asio/ip/address_iterator_v4.hpp
+++ b/asio/include/asio/ip/address_v4_iterator.hpp
@@ -1,5 +1,5 @@
 //
-// ip/address_iterator_v4.hpp
+// ip/address_v4_iterator.hpp
 // ~~~~~~~~~~~~~~~~~~~~~~~~~~
 //
 // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
@@ -8,8 +8,8 @@
 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 //
 
-#ifndef ASIO_IP_ADDRESS_ITERATOR_V4_HPP
-#define ASIO_IP_ADDRESS_ITERATOR_V4_HPP
+#ifndef ASIO_IP_ADDRESS_V4_ITERATOR_HPP
+#define ASIO_IP_ADDRESS_V4_ITERATOR_HPP
 
 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
 # pragma once
@@ -23,6 +23,8 @@
 namespace asio {
 namespace ip {
 
+template <typename> class basic_address_iterator;
+
 /// An input iterator that can be used for traversing IPv4 addresses.
 /**
  * In addition to satisfying the input iterator requirements, this iterator
@@ -32,7 +34,7 @@
  * @e Distinct @e objects: Safe.@n
  * @e Shared @e objects: Unsafe.
  */
-class address_iterator_v4
+template <> class basic_address_iterator<address_v4>
 {
 public:
   /// The type of the elements pointed to by the iterator.
@@ -51,28 +53,29 @@
   typedef std::input_iterator_tag iterator_category;
 
   /// Construct an iterator that points to the specified address.
-  address_iterator_v4(const address_v4& addr) ASIO_NOEXCEPT
+  basic_address_iterator(const address_v4& addr) ASIO_NOEXCEPT
     : address_(addr)
   {
   }
 
   /// Copy constructor.
-  address_iterator_v4(const address_iterator_v4& other) ASIO_NOEXCEPT
+  basic_address_iterator(
+      const basic_address_iterator& other) ASIO_NOEXCEPT
     : address_(other.address_)
   {
   }
 
 #if defined(ASIO_HAS_MOVE)
   /// Move constructor.
-  address_iterator_v4(address_iterator_v4&& other) ASIO_NOEXCEPT
+  basic_address_iterator(basic_address_iterator&& other) ASIO_NOEXCEPT
     : address_(ASIO_MOVE_CAST(address_v4)(other.address_))
   {
   }
 #endif // defined(ASIO_HAS_MOVE)
 
   /// Assignment operator.
-  address_iterator_v4& operator=(
-      const address_iterator_v4& other) ASIO_NOEXCEPT
+  basic_address_iterator& operator=(
+      const basic_address_iterator& other) ASIO_NOEXCEPT
   {
     address_ = other.address_;
     return *this;
@@ -80,8 +83,8 @@
 
 #if defined(ASIO_HAS_MOVE)
   /// Move assignment operator.
-  address_iterator_v4& operator=(
-      address_iterator_v4&& other) ASIO_NOEXCEPT
+  basic_address_iterator& operator=(
+      basic_address_iterator&& other) ASIO_NOEXCEPT
   {
     address_ = ASIO_MOVE_CAST(address_v4)(other.address_);
     return *this;
@@ -101,45 +104,45 @@
   }
 
   /// Pre-increment operator.
-  address_iterator_v4& operator++() ASIO_NOEXCEPT
+  basic_address_iterator& operator++() ASIO_NOEXCEPT
   {
     address_ = address_v4((address_.to_ulong() + 1) & 0xFFFFFFFF);
     return *this;
   }
 
   /// Post-increment operator.
-  address_iterator_v4 operator++(int) ASIO_NOEXCEPT
+  basic_address_iterator operator++(int) ASIO_NOEXCEPT
   {
-    address_iterator_v4 tmp(*this);
+    basic_address_iterator tmp(*this);
     ++*this;
     return tmp;
   }
 
   /// Pre-decrement operator.
-  address_iterator_v4& operator--() ASIO_NOEXCEPT
+  basic_address_iterator& operator--() ASIO_NOEXCEPT
   {
     address_ = address_v4((address_.to_ulong() - 1) & 0xFFFFFFFF);
     return *this;
   }
 
   /// Post-decrement operator.
-  address_iterator_v4 operator--(int)
+  basic_address_iterator operator--(int)
   {
-    address_iterator_v4 tmp(*this);
+    basic_address_iterator tmp(*this);
     --*this;
     return tmp;
   }
 
   /// Compare two addresses for equality.
-  friend bool operator==(const address_iterator_v4& a,
-      const address_iterator_v4& b)
+  friend bool operator==(const basic_address_iterator& a,
+      const basic_address_iterator& b)
   {
     return a.address_ == b.address_;
   }
 
   /// Compare two addresses for inequality.
-  friend bool operator!=(const address_iterator_v4& a,
-      const address_iterator_v4& b)
+  friend bool operator!=(const basic_address_iterator& a,
+      const basic_address_iterator& b)
   {
     return a.address_ != b.address_;
   }
@@ -148,9 +151,12 @@
   address_v4 address_;
 };
 
+/// An input iterator that can be used for traversing IPv4 addresses.
+typedef basic_address_iterator<address_v4> address_v4_iterator;
+
 } // namespace ip
 } // namespace asio
 
 #include "asio/detail/pop_options.hpp"
 
-#endif // ASIO_IP_ADDRESS_ITERATOR_V4_HPP
+#endif // ASIO_IP_ADDRESS_V4_ITERATOR_HPP
diff --git a/asio/include/asio/ip/address_range_v4.hpp b/asio/include/asio/ip/address_v4_range.hpp
similarity index 65%
rename from asio/include/asio/ip/address_range_v4.hpp
rename to asio/include/asio/ip/address_v4_range.hpp
index 3b07b45..159705e 100644
--- a/asio/include/asio/ip/address_range_v4.hpp
+++ b/asio/include/asio/ip/address_v4_range.hpp
@@ -1,5 +1,5 @@
 //
-// ip/address_range_v4.hpp
+// ip/address_v4_range.hpp
 // ~~~~~~~~~~~~~~~~~~~~~~~
 //
 // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
@@ -8,50 +8,52 @@
 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 //
 
-#ifndef ASIO_IP_ADDRESS_RANGE_V4_HPP
-#define ASIO_IP_ADDRESS_RANGE_V4_HPP
+#ifndef ASIO_IP_ADDRESS_V4_RANGE_HPP
+#define ASIO_IP_ADDRESS_V4_RANGE_HPP
 
 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
 # pragma once
 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
 
 #include "asio/detail/config.hpp"
-#include "asio/ip/address_iterator_v4.hpp"
+#include "asio/ip/address_v4_iterator.hpp"
 
 #include "asio/detail/push_options.hpp"
 
 namespace asio {
 namespace ip {
 
+template <typename> class basic_address_range;
+
 /// Represents a range of IPv4 addresses.
 /**
  * @par Thread Safety
  * @e Distinct @e objects: Safe.@n
  * @e Shared @e objects: Unsafe.
  */
-class address_range_v4
+template <> class basic_address_range<address_v4>
 {
 public:
   /// The type of an iterator that points into the range.
-  typedef address_iterator_v4 iterator;
+  typedef basic_address_iterator<address_v4> iterator;
 
   /// Construct an empty range.
-  address_range_v4() ASIO_NOEXCEPT
+  basic_address_range() ASIO_NOEXCEPT
     : begin_(address_v4()),
       end_(address_v4())
   {
   }
 
   /// Construct an range that represents the given range of addresses.
-  explicit address_range_v4(const address_iterator_v4& first,
-      const address_iterator_v4& last) ASIO_NOEXCEPT
+  explicit basic_address_range(const iterator& first,
+      const iterator& last) ASIO_NOEXCEPT
     : begin_(first),
       end_(last)
   {
   }
 
   /// Copy constructor.
-  address_range_v4(const address_range_v4& other) ASIO_NOEXCEPT
+  basic_address_range(const basic_address_range& other) ASIO_NOEXCEPT
     : begin_(other.begin_),
       end_(other.end_)
   {
@@ -59,16 +61,16 @@
 
 #if defined(ASIO_HAS_MOVE)
   /// Move constructor.
-  address_range_v4(address_range_v4&& other) ASIO_NOEXCEPT
-    : begin_(ASIO_MOVE_CAST(address_iterator_v4)(other.begin_)),
-      end_(ASIO_MOVE_CAST(address_iterator_v4)(other.end_))
+  basic_address_range(basic_address_range&& other) ASIO_NOEXCEPT
+    : begin_(ASIO_MOVE_CAST(iterator)(other.begin_)),
+      end_(ASIO_MOVE_CAST(iterator)(other.end_))
   {
   }
 #endif // defined(ASIO_HAS_MOVE)
 
   /// Assignment operator.
-  address_range_v4& operator=(
-      const address_range_v4& other) ASIO_NOEXCEPT
+  basic_address_range& operator=(
+      const basic_address_range& other) ASIO_NOEXCEPT
   {
     begin_ = other.begin_;
     end_ = other.end_;
@@ -77,11 +79,11 @@
 
 #if defined(ASIO_HAS_MOVE)
   /// Move assignment operator.
-  address_range_v4& operator=(
-      address_range_v4&& other) ASIO_NOEXCEPT
+  basic_address_range& operator=(
+      basic_address_range&& other) ASIO_NOEXCEPT
   {
-    begin_ = ASIO_MOVE_CAST(address_iterator_v4)(other.begin_);
-    end_ = ASIO_MOVE_CAST(address_iterator_v4)(other.end_);
+    begin_ = ASIO_MOVE_CAST(iterator)(other.begin_);
+    end_ = ASIO_MOVE_CAST(iterator)(other.end_);
     return *this;
   }
 #endif // defined(ASIO_HAS_MOVE)
@@ -117,13 +119,16 @@
   }
 
 private:
-  address_iterator_v4 begin_;
-  address_iterator_v4 end_;
+  iterator begin_;
+  iterator end_;
 };
 
+/// Represents a range of IPv4 addresses.
+typedef basic_address_range<address_v4> address_v4_range;
+
 } // namespace ip
 } // namespace asio
 
 #include "asio/detail/pop_options.hpp"
 
-#endif // ASIO_IP_ADDRESS_RANGE_V4_HPP
+#endif // ASIO_IP_ADDRESS_V4_RANGE_HPP
diff --git a/asio/include/asio/ip/address_v6.hpp b/asio/include/asio/ip/address_v6.hpp
index 9930f1e..929bb93 100644
--- a/asio/include/asio/ip/address_v6.hpp
+++ b/asio/include/asio/ip/address_v6.hpp
@@ -32,6 +32,8 @@
 namespace asio {
 namespace ip {
 
+template <typename> class basic_address_iterator;
+
 /// Implements IP version 6 style addresses.
 /**
  * The asio::ip::address_v6 class provides the ability to use and
@@ -218,7 +220,7 @@
 #endif // !defined(ASIO_NO_DEPRECATED)
 
 private:
-  friend class address_iterator_v6;
+  friend class basic_address_iterator<address_v6>;
 
   // The underlying IPv6 address.
   asio::detail::in6_addr_type addr_;
diff --git a/asio/include/asio/ip/address_iterator_v6.hpp b/asio/include/asio/ip/address_v6_iterator.hpp
similarity index 71%
rename from asio/include/asio/ip/address_iterator_v6.hpp
rename to asio/include/asio/ip/address_v6_iterator.hpp
index 4cd9cc0..36ba64d 100644
--- a/asio/include/asio/ip/address_iterator_v6.hpp
+++ b/asio/include/asio/ip/address_v6_iterator.hpp
@@ -1,5 +1,5 @@
 //
-// ip/address_iterator_v6.hpp
+// ip/address_v6_iterator.hpp
 // ~~~~~~~~~~~~~~~~~~~~~~~~~~
 //
 // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
@@ -9,8 +9,8 @@
 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 //
 
-#ifndef ASIO_IP_ADDRESS_ITERATOR_V6_HPP
-#define ASIO_IP_ADDRESS_ITERATOR_V6_HPP
+#ifndef ASIO_IP_ADDRESS_V6_ITERATOR_HPP
+#define ASIO_IP_ADDRESS_V6_ITERATOR_HPP
 
 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
 # pragma once
@@ -24,6 +24,8 @@
 namespace asio {
 namespace ip {
 
+template <typename> class basic_address_iterator;
+
 /// An input iterator that can be used for traversing IPv6 addresses.
 /**
  * In addition to satisfying the input iterator requirements, this iterator
@@ -33,7 +35,7 @@
  * @e Distinct @e objects: Safe.@n
  * @e Shared @e objects: Unsafe.
  */
-class address_iterator_v6
+template <> class basic_address_iterator<address_v6>
 {
 public:
   /// The type of the elements pointed to by the iterator.
@@ -52,28 +54,29 @@
   typedef std::input_iterator_tag iterator_category;
 
   /// Construct an iterator that points to the specified address.
-  address_iterator_v6(const address_v6& addr) ASIO_NOEXCEPT
+  basic_address_iterator(const address_v6& addr) ASIO_NOEXCEPT
     : address_(addr)
   {
   }
 
   /// Copy constructor.
-  address_iterator_v6(const address_iterator_v6& other) ASIO_NOEXCEPT
+  basic_address_iterator(
+      const basic_address_iterator& other) ASIO_NOEXCEPT
     : address_(other.address_)
   {
   }
 
 #if defined(ASIO_HAS_MOVE)
   /// Move constructor.
-  address_iterator_v6(address_iterator_v6&& other) ASIO_NOEXCEPT
+  basic_address_iterator(basic_address_iterator&& other) ASIO_NOEXCEPT
     : address_(ASIO_MOVE_CAST(address_v6)(other.address_))
   {
   }
 #endif // defined(ASIO_HAS_MOVE)
 
   /// Assignment operator.
-  address_iterator_v6& operator=(
-      const address_iterator_v6& other) ASIO_NOEXCEPT
+  basic_address_iterator& operator=(
+      const basic_address_iterator& other) ASIO_NOEXCEPT
   {
     address_ = other.address_;
     return *this;
@@ -81,8 +84,8 @@
 
 #if defined(ASIO_HAS_MOVE)
   /// Move assignment operator.
-  address_iterator_v6& operator=(
-      address_iterator_v6&& other) ASIO_NOEXCEPT
+  basic_address_iterator& operator=(
+      basic_address_iterator&& other) ASIO_NOEXCEPT
   {
     address_ = ASIO_MOVE_CAST(address_v6)(other.address_);
     return *this;
@@ -102,7 +105,7 @@
   }
 
   /// Pre-increment operator.
-  address_iterator_v6& operator++() ASIO_NOEXCEPT
+  basic_address_iterator& operator++() ASIO_NOEXCEPT
   {
     for (int i = 15; i >= 0; --i)
     {
@@ -119,15 +122,15 @@
   }
 
   /// Post-increment operator.
-  address_iterator_v6 operator++(int) ASIO_NOEXCEPT
+  basic_address_iterator operator++(int) ASIO_NOEXCEPT
   {
-    address_iterator_v6 tmp(*this);
+    basic_address_iterator tmp(*this);
     ++*this;
     return tmp;
   }
 
   /// Pre-decrement operator.
-  address_iterator_v6& operator--() ASIO_NOEXCEPT
+  basic_address_iterator& operator--() ASIO_NOEXCEPT
   {
     for (int i = 15; i >= 0; --i)
     {
@@ -144,23 +147,23 @@
   }
 
   /// Post-decrement operator.
-  address_iterator_v6 operator--(int)
+  basic_address_iterator operator--(int)
   {
-    address_iterator_v6 tmp(*this);
+    basic_address_iterator tmp(*this);
     --*this;
     return tmp;
   }
 
   /// Compare two addresses for equality.
-  friend bool operator==(const address_iterator_v6& a,
-      const address_iterator_v6& b)
+  friend bool operator==(const basic_address_iterator& a,
+      const basic_address_iterator& b)
   {
     return a.address_ == b.address_;
   }
 
   /// Compare two addresses for inequality.
-  friend bool operator!=(const address_iterator_v6& a,
-      const address_iterator_v6& b)
+  friend bool operator!=(const basic_address_iterator& a,
+      const basic_address_iterator& b)
   {
     return a.address_ != b.address_;
   }
@@ -169,9 +172,12 @@
   address_v6 address_;
 };
 
+/// An input iterator that can be used for traversing IPv6 addresses.
+typedef basic_address_iterator<address_v6> address_v6_iterator;
+
 } // namespace ip
 } // namespace asio
 
 #include "asio/detail/pop_options.hpp"
 
-#endif // ASIO_IP_ADDRESS_ITERATOR_V6_HPP
+#endif // ASIO_IP_ADDRESS_V6_ITERATOR_HPP
diff --git a/asio/include/asio/ip/address_range_v6.hpp b/asio/include/asio/ip/address_v6_range.hpp
similarity index 64%
rename from asio/include/asio/ip/address_range_v6.hpp
rename to asio/include/asio/ip/address_v6_range.hpp
index e8620db..5f58f0f 100644
--- a/asio/include/asio/ip/address_range_v6.hpp
+++ b/asio/include/asio/ip/address_v6_range.hpp
@@ -1,5 +1,5 @@
 //
-// ip/address_range_v6.hpp
+// ip/address_v6_range.hpp
 // ~~~~~~~~~~~~~~~~~~~~~~~
 //
 // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
@@ -9,50 +9,52 @@
 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 //
 
-#ifndef ASIO_IP_ADDRESS_RANGE_v6_HPP
-#define ASIO_IP_ADDRESS_RANGE_v6_HPP
+#ifndef ASIO_IP_ADDRESS_V6_RANGE_HPP
+#define ASIO_IP_ADDRESS_V6_RANGE_HPP
 
 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
 # pragma once
 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
 
 #include "asio/detail/config.hpp"
-#include "asio/ip/address_iterator_v6.hpp"
+#include "asio/ip/address_v6_iterator.hpp"
 
 #include "asio/detail/push_options.hpp"
 
 namespace asio {
 namespace ip {
 
+template <typename> class basic_address_range;
+
 /// Represents a range of IPv6 addresses.
 /**
  * @par Thread Safety
  * @e Distinct @e objects: Safe.@n
  * @e Shared @e objects: Unsafe.
  */
-class address_range_v6
+template <> class basic_address_range<address_v6>
 {
 public:
   /// The type of an iterator that points into the range.
-  typedef address_iterator_v6 iterator;
+  typedef basic_address_iterator<address_v6> iterator;
 
   /// Construct an empty range.
-  address_range_v6() ASIO_NOEXCEPT
+  basic_address_range() ASIO_NOEXCEPT
     : begin_(address_v6()),
       end_(address_v6())
   {
   }
 
   /// Construct an range that represents the given range of addresses.
-  explicit address_range_v6(const address_iterator_v6& first,
-      const address_iterator_v6& last) ASIO_NOEXCEPT
+  explicit basic_address_range(const iterator& first,
+      const iterator& last) ASIO_NOEXCEPT
     : begin_(first),
       end_(last)
   {
   }
 
   /// Copy constructor.
-  address_range_v6(const address_range_v6& other) ASIO_NOEXCEPT
+  basic_address_range(const basic_address_range& other) ASIO_NOEXCEPT
     : begin_(other.begin_),
       end_(other.end_)
   {
@@ -60,16 +62,16 @@
 
 #if defined(ASIO_HAS_MOVE)
   /// Move constructor.
-  address_range_v6(address_range_v6&& other) ASIO_NOEXCEPT
-    : begin_(ASIO_MOVE_CAST(address_iterator_v6)(other.begin_)),
-      end_(ASIO_MOVE_CAST(address_iterator_v6)(other.end_))
+  basic_address_range(basic_address_range&& other) ASIO_NOEXCEPT
+    : begin_(ASIO_MOVE_CAST(iterator)(other.begin_)),
+      end_(ASIO_MOVE_CAST(iterator)(other.end_))
   {
   }
 #endif // defined(ASIO_HAS_MOVE)
 
   /// Assignment operator.
-  address_range_v6& operator=(
-      const address_range_v6& other) ASIO_NOEXCEPT
+  basic_address_range& operator=(
+      const basic_address_range& other) ASIO_NOEXCEPT
   {
     begin_ = other.begin_;
     end_ = other.end_;
@@ -78,11 +80,11 @@
 
 #if defined(ASIO_HAS_MOVE)
   /// Move assignment operator.
-  address_range_v6& operator=(
-      address_range_v6&& other) ASIO_NOEXCEPT
+  basic_address_range& operator=(
+      basic_address_range&& other) ASIO_NOEXCEPT
   {
-    begin_ = ASIO_MOVE_CAST(address_iterator_v6)(other.begin_);
-    end_ = ASIO_MOVE_CAST(address_iterator_v6)(other.end_);
+    begin_ = ASIO_MOVE_CAST(iterator)(other.begin_);
+    end_ = ASIO_MOVE_CAST(iterator)(other.end_);
     return *this;
   }
 #endif // defined(ASIO_HAS_MOVE)
@@ -112,13 +114,16 @@
   }
 
 private:
-  address_iterator_v6 begin_;
-  address_iterator_v6 end_;
+  iterator begin_;
+  iterator end_;
 };
 
+/// Represents a range of IPv6 addresses.
+typedef basic_address_range<address_v6> address_v6_range;
+
 } // namespace ip
 } // namespace asio
 
 #include "asio/detail/pop_options.hpp"
 
-#endif // ASIO_IP_ADDRESS_RANGE_V6_HPP
+#endif // ASIO_IP_ADDRESS_V6_RANGE_HPP
diff --git a/asio/include/asio/ip/impl/network_v4.ipp b/asio/include/asio/ip/impl/network_v4.ipp
index fb645ab..b508ae2 100644
--- a/asio/include/asio/ip/impl/network_v4.ipp
+++ b/asio/include/asio/ip/impl/network_v4.ipp
@@ -101,11 +101,11 @@
   return address_v4(nmbits);
 }
 
-address_range_v4 network_v4::hosts() const ASIO_NOEXCEPT
+address_v4_range network_v4::hosts() const ASIO_NOEXCEPT
 {
   return is_host()
-    ? address_range_v4(address_, address_v4(address_.to_ulong() + 1))
-    : address_range_v4(address_v4(network().to_ulong() + 1), broadcast());
+    ? address_v4_range(address_, address_v4(address_.to_ulong() + 1))
+    : address_v4_range(address_v4(network().to_ulong() + 1), broadcast());
 }
 
 bool network_v4::is_subnet_of(const network_v4& other) const
diff --git a/asio/include/asio/ip/impl/network_v6.ipp b/asio/include/asio/ip/impl/network_v6.ipp
index b75e6a5..59c17cb 100644
--- a/asio/include/asio/ip/impl/network_v6.ipp
+++ b/asio/include/asio/ip/impl/network_v6.ipp
@@ -55,7 +55,7 @@
   return address_v6(bytes, address_.scope_id());
 }
 
-address_range_v6 network_v6::hosts() const ASIO_NOEXCEPT
+address_v6_range network_v6::hosts() const ASIO_NOEXCEPT
 {
   address_v6::bytes_type begin_bytes(address_.to_bytes());
   address_v6::bytes_type end_bytes(address_.to_bytes());
@@ -72,9 +72,9 @@
       end_bytes[i] |= 0xFF >> (prefix_length_ % 8);
     }
   }
-  return address_range_v6(
-      address_iterator_v6(address_v6(begin_bytes, address_.scope_id())),
-      ++address_iterator_v6(address_v6(end_bytes, address_.scope_id())));
+  return address_v6_range(
+      address_v6_iterator(address_v6(begin_bytes, address_.scope_id())),
+      ++address_v6_iterator(address_v6(end_bytes, address_.scope_id())));
 }
 
 bool network_v6::is_subnet_of(const network_v6& other) const
diff --git a/asio/include/asio/ip/network_v4.hpp b/asio/include/asio/ip/network_v4.hpp
index 7deba5c..103b055 100644
--- a/asio/include/asio/ip/network_v4.hpp
+++ b/asio/include/asio/ip/network_v4.hpp
@@ -19,7 +19,7 @@
 #include "asio/detail/config.hpp"
 #include <string>
 #include "asio/error_code.hpp"
-#include "asio/ip/address_range_v4.hpp"
+#include "asio/ip/address_v4_range.hpp"
 
 #include "asio/detail/push_options.hpp"
 
@@ -116,7 +116,7 @@
   }
 
   /// Obtain an address range corresponding to the hosts in the network.
-  ASIO_DECL address_range_v4 hosts() const ASIO_NOEXCEPT;
+  ASIO_DECL address_v4_range hosts() const ASIO_NOEXCEPT;
 
   /// Obtain the true network address, omitting any host bits.
   network_v4 canonical() const ASIO_NOEXCEPT
diff --git a/asio/include/asio/ip/network_v6.hpp b/asio/include/asio/ip/network_v6.hpp
index d6c5481..b75b9ba 100644
--- a/asio/include/asio/ip/network_v6.hpp
+++ b/asio/include/asio/ip/network_v6.hpp
@@ -19,7 +19,7 @@
 #include "asio/detail/config.hpp"
 #include <string>
 #include "asio/error_code.hpp"
-#include "asio/ip/address_range_v6.hpp"
+#include "asio/ip/address_v6_range.hpp"
 
 #include "asio/detail/push_options.hpp"
 
@@ -100,7 +100,7 @@
   ASIO_DECL address_v6 network() const ASIO_NOEXCEPT;
 
   /// Obtain an address range corresponding to the hosts in the network.
-  ASIO_DECL address_range_v6 hosts() const ASIO_NOEXCEPT;
+  ASIO_DECL address_v6_range hosts() const ASIO_NOEXCEPT;
 
   /// Obtain the true network address, omitting any host bits.
   network_v6 canonical() const ASIO_NOEXCEPT
diff --git a/asio/include/asio/ts/internet.hpp b/asio/include/asio/ts/internet.hpp
index c0b1266..752a38b 100644
--- a/asio/include/asio/ts/internet.hpp
+++ b/asio/include/asio/ts/internet.hpp
@@ -17,7 +17,11 @@
 
 #include "asio/ip/address.hpp"
 #include "asio/ip/address_v4.hpp"
+#include "asio/ip/address_v4_iterator.hpp"
+#include "asio/ip/address_v4_range.hpp"
 #include "asio/ip/address_v6.hpp"
+#include "asio/ip/address_v6_iterator.hpp"
+#include "asio/ip/address_v6_range.hpp"
 #include "asio/ip/bad_address_cast.hpp"
 #include "asio/ip/basic_endpoint.hpp"
 #include "asio/ip/basic_resolver_query.hpp"
diff --git a/asio/src/tests/Makefile.am b/asio/src/tests/Makefile.am
index 09c1a10..083bc2c 100644
--- a/asio/src/tests/Makefile.am
+++ b/asio/src/tests/Makefile.am
@@ -40,12 +40,12 @@
 	unit/high_resolution_timer \
 	unit/io_service \
 	unit/ip/address \
-	unit/ip/address_iterator_v4 \
-	unit/ip/address_iterator_v6 \
-	unit/ip/address_range_v4 \
-	unit/ip/address_range_v6 \
 	unit/ip/address_v4 \
+	unit/ip/address_v4_iterator \
+	unit/ip/address_v4_range \
 	unit/ip/address_v6 \
+	unit/ip/address_v6_iterator \
+	unit/ip/address_v6_range \
 	unit/ip/basic_endpoint \
 	unit/ip/basic_resolver \
 	unit/ip/basic_resolver_entry \
@@ -153,12 +153,12 @@
 	unit/high_resolution_timer \
 	unit/io_service \
 	unit/ip/address \
-	unit/ip/address_iterator_v4 \
-	unit/ip/address_iterator_v6 \
-	unit/ip/address_range_v4 \
-	unit/ip/address_range_v6 \
 	unit/ip/address_v4 \
+	unit/ip/address_v4_iterator \
+	unit/ip/address_v4_range \
 	unit/ip/address_v6 \
+	unit/ip/address_v6_iterator \
+	unit/ip/address_v6_range \
 	unit/ip/basic_endpoint \
 	unit/ip/basic_resolver \
 	unit/ip/basic_resolver_entry \
@@ -279,12 +279,12 @@
 unit_high_resolution_timer_SOURCES = unit/high_resolution_timer.cpp unit/unit_test.cpp
 unit_io_service_SOURCES = unit/io_service.cpp unit/unit_test.cpp
 unit_ip_address_SOURCES = unit/ip/address.cpp unit/unit_test.cpp
-unit_ip_address_iterator_v4_SOURCES = unit/ip/address_iterator_v4.cpp unit/unit_test.cpp
-unit_ip_address_iterator_v6_SOURCES = unit/ip/address_iterator_v6.cpp unit/unit_test.cpp
-unit_ip_address_range_v4_SOURCES = unit/ip/address_range_v4.cpp unit/unit_test.cpp
-unit_ip_address_range_v6_SOURCES = unit/ip/address_range_v6.cpp unit/unit_test.cpp
 unit_ip_address_v4_SOURCES = unit/ip/address_v4.cpp unit/unit_test.cpp
+unit_ip_address_v4_iterator_SOURCES = unit/ip/address_v4_iterator.cpp unit/unit_test.cpp
+unit_ip_address_v4_range_SOURCES = unit/ip/address_v4_range.cpp unit/unit_test.cpp
 unit_ip_address_v6_SOURCES = unit/ip/address_v6.cpp unit/unit_test.cpp
+unit_ip_address_v6_iterator_SOURCES = unit/ip/address_v6_iterator.cpp unit/unit_test.cpp
+unit_ip_address_v6_range_SOURCES = unit/ip/address_v6_range.cpp unit/unit_test.cpp
 unit_ip_basic_endpoint_SOURCES = unit/ip/basic_endpoint.cpp unit/unit_test.cpp
 unit_ip_basic_resolver_SOURCES = unit/ip/basic_resolver.cpp unit/unit_test.cpp
 unit_ip_basic_resolver_entry_SOURCES = unit/ip/basic_resolver_entry.cpp unit/unit_test.cpp
diff --git a/asio/src/tests/unit/ip/.gitignore b/asio/src/tests/unit/ip/.gitignore
index ab157b6..087ad80 100644
--- a/asio/src/tests/unit/ip/.gitignore
+++ b/asio/src/tests/unit/ip/.gitignore
@@ -8,8 +8,8 @@
 *.pdb
 *.tds
 address
-address*_v4
-address*_v6
+address_v4*
+address_v6*
 basic_endpoint
 basic_resolver
 basic_resolver_entry
diff --git a/asio/src/tests/unit/ip/address_iterator_v6.cpp b/asio/src/tests/unit/ip/address_iterator_v6.cpp
deleted file mode 100644
index 98d582a..0000000
--- a/asio/src/tests/unit/ip/address_iterator_v6.cpp
+++ /dev/null
@@ -1,27 +0,0 @@
-//
-// address_iterator_v6.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/ip/address_iterator_v6.hpp"
-
-#include "../unit_test.hpp"
-
-//------------------------------------------------------------------------------
-
-ASIO_TEST_SUITE
-(
-  "ip/address_iterator_v6",
-  ASIO_TEST_CASE(null_test)
-)
diff --git a/asio/src/tests/unit/ip/address_range_v6.cpp b/asio/src/tests/unit/ip/address_range_v6.cpp
deleted file mode 100644
index acbf59f..0000000
--- a/asio/src/tests/unit/ip/address_range_v6.cpp
+++ /dev/null
@@ -1,27 +0,0 @@
-//
-// address_range_v6.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/ip/address_range_v6.hpp"
-
-#include "../unit_test.hpp"
-
-//------------------------------------------------------------------------------
-
-ASIO_TEST_SUITE
-(
-  "ip/address_range_v6",
-  ASIO_TEST_CASE(null_test)
-)
diff --git a/asio/src/tests/unit/ip/address_iterator_v4.cpp b/asio/src/tests/unit/ip/address_v4_iterator.cpp
similarity index 85%
rename from asio/src/tests/unit/ip/address_iterator_v4.cpp
rename to asio/src/tests/unit/ip/address_v4_iterator.cpp
index 56805bf..8d26882 100644
--- a/asio/src/tests/unit/ip/address_iterator_v4.cpp
+++ b/asio/src/tests/unit/ip/address_v4_iterator.cpp
@@ -1,5 +1,5 @@
 //
-// address_iterator_v4.cpp
+// address_v4_iterator.cpp
 // ~~~~~~~~~~~~~~~~~~~~~~~
 //
 // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
@@ -14,7 +14,7 @@
 #endif // !defined(BOOST_ALL_NO_LIB)
 
 // Test that header file is self-contained.
-#include "asio/ip/address_iterator_v4.hpp"
+#include "asio/ip/address_v4_iterator.hpp"
 
 #include "../unit_test.hpp"
 
@@ -22,6 +22,6 @@
 
 ASIO_TEST_SUITE
 (
-  "ip/address_iterator_v4",
+  "ip/address_v4_iterator",
   ASIO_TEST_CASE(null_test)
 )
diff --git a/asio/src/tests/unit/ip/address_range_v4.cpp b/asio/src/tests/unit/ip/address_v4_range.cpp
similarity index 86%
copy from asio/src/tests/unit/ip/address_range_v4.cpp
copy to asio/src/tests/unit/ip/address_v4_range.cpp
index 9a76102..07a9f3c 100644
--- a/asio/src/tests/unit/ip/address_range_v4.cpp
+++ b/asio/src/tests/unit/ip/address_v4_range.cpp
@@ -1,5 +1,5 @@
 //
-// address_range_v4.cpp
+// address_v4_range.cpp
 // ~~~~~~~~~~~~~~~~~~~~
 //
 // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
@@ -14,7 +14,7 @@
 #endif // !defined(BOOST_ALL_NO_LIB)
 
 // Test that header file is self-contained.
-#include "asio/ip/address_range_v4.hpp"
+#include "asio/ip/address_v4_range.hpp"
 
 #include "../unit_test.hpp"
 
@@ -22,6 +22,6 @@
 
 ASIO_TEST_SUITE
 (
-  "ip/address_range_v4",
+  "ip/address_v4_range",
   ASIO_TEST_CASE(null_test)
 )
diff --git a/asio/src/tests/unit/ip/address_iterator_v4.cpp b/asio/src/tests/unit/ip/address_v6_iterator.cpp
similarity index 85%
copy from asio/src/tests/unit/ip/address_iterator_v4.cpp
copy to asio/src/tests/unit/ip/address_v6_iterator.cpp
index 56805bf..5afe141 100644
--- a/asio/src/tests/unit/ip/address_iterator_v4.cpp
+++ b/asio/src/tests/unit/ip/address_v6_iterator.cpp
@@ -1,5 +1,5 @@
 //
-// address_iterator_v4.cpp
+// address_v6_iterator.cpp
 // ~~~~~~~~~~~~~~~~~~~~~~~
 //
 // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
@@ -14,7 +14,7 @@
 #endif // !defined(BOOST_ALL_NO_LIB)
 
 // Test that header file is self-contained.
-#include "asio/ip/address_iterator_v4.hpp"
+#include "asio/ip/address_v6_iterator.hpp"
 
 #include "../unit_test.hpp"
 
@@ -22,6 +22,6 @@
 
 ASIO_TEST_SUITE
 (
-  "ip/address_iterator_v4",
+  "ip/address_v6_iterator",
   ASIO_TEST_CASE(null_test)
 )
diff --git a/asio/src/tests/unit/ip/address_range_v4.cpp b/asio/src/tests/unit/ip/address_v6_range.cpp
similarity index 86%
rename from asio/src/tests/unit/ip/address_range_v4.cpp
rename to asio/src/tests/unit/ip/address_v6_range.cpp
index 9a76102..9bf2643 100644
--- a/asio/src/tests/unit/ip/address_range_v4.cpp
+++ b/asio/src/tests/unit/ip/address_v6_range.cpp
@@ -1,5 +1,5 @@
 //
-// address_range_v4.cpp
+// address_v6_range.cpp
 // ~~~~~~~~~~~~~~~~~~~~
 //
 // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
@@ -14,7 +14,7 @@
 #endif // !defined(BOOST_ALL_NO_LIB)
 
 // Test that header file is self-contained.
-#include "asio/ip/address_range_v4.hpp"
+#include "asio/ip/address_v6_range.hpp"
 
 #include "../unit_test.hpp"
 
@@ -22,6 +22,6 @@
 
 ASIO_TEST_SUITE
 (
-  "ip/address_range_v4",
+  "ip/address_v6_range",
   ASIO_TEST_CASE(null_test)
 )
diff --git a/asio/src/tests/unit/ip/network_v4.cpp b/asio/src/tests/unit/ip/network_v4.cpp
index 9f77a7c..df307a2 100644
--- a/asio/src/tests/unit/ip/network_v4.cpp
+++ b/asio/src/tests/unit/ip/network_v4.cpp
@@ -60,7 +60,7 @@
     ip::address_v4 addr4 = net1.broadcast();
     (void)addr4;
 
-    ip::address_range_v4 hosts = net1.hosts();
+    ip::address_v4_range hosts = net1.hosts();
     (void)hosts;
 
     ip::network_v4 net3 = net1.canonical();
diff --git a/asio/src/tests/unit/ip/network_v6.cpp b/asio/src/tests/unit/ip/network_v6.cpp
index bdfd000..66fa91c 100644
--- a/asio/src/tests/unit/ip/network_v6.cpp
+++ b/asio/src/tests/unit/ip/network_v6.cpp
@@ -53,7 +53,7 @@
     ip::address_v6 addr3 = net1.network();
     (void)addr3;
 
-    ip::address_range_v6 hosts = net1.hosts();
+    ip::address_v6_range hosts = net1.hosts();
     (void)hosts;
 
     ip::network_v6 net3 = net1.canonical();