using boost::asio::io_service;
 using boost::asio::ip::address;
 using boost::net::dns::a_resource;
+using boost::net::dns::a6_resource;
 using boost::net::dns::resource_base_t;
 using boost::net::dns::message;
 using boost::net::dns::rr_list_t;
  *
  * @param dns_address The DNS address to resolve.
  * @param nameserver The server to consult about name resolution.
+ * @param address_resource_record_type 'A' resource records for the IPv4 addresses, or 'AAAA'
+ * resource records for the IPv6 addresses
  */
 DnsResolver::DnsResolver(
         const string &dns_address,
-        const string &nameserver
+        const string &nameserver,
+        const type_t address_resource_record_type
 ) :
     ResolvedHostAddressList(),
     HostDnsAddress( dns_address ),
-    NameServer( nameserver )
+    NameServer( nameserver ),
+    AddressResourceRecord( address_resource_record_type )
 {
 }
 
 
     try
     {
-        rr_list_t answers_list = fill_answers_list( HostDnsAddress, NameServer, boost::net::dns::type_a );
-
+        rr_list_t answers_list = get_answers_list( HostDnsAddress, NameServer, AddressResourceRecord );
         size_t resolved_ip_count = answers_list.size();
         if ( resolved_ip_count < 1 )
         {
-            GlobalLogger.error() << "Error: host "
-                    << HostDnsAddress << " could not be resolved." << endl;
+            GlobalLogger.error() << "Error: IP host " << HostDnsAddress << " could not be resolved." << endl;
             return false;
         }
 
 
     try
     {
-        // Convert string to IP address
-        // Work with both IPv4 and IPv6
+        // Convert string to IP address, to work with both IPv4 and IPv6
         address addr = address::from_string( HostDnsAddress );
 
         if ( addr.is_v4() || addr.is_v6() )
     return false;
 }
 
-rr_list_t DnsResolver::fill_answers_list(
+rr_list_t DnsResolver::get_answers_list(
         const string &host_dns_address,
         const string &name_server,
         const type_t message_type
                     // 'A' resource records carry IPv4 addresses
                     append_resolved_ipv4( resource_record, resolved_host_address_list );
                     break;
+                case boost::net::dns::type_a6:
+                    // 'AAAA' resource records carry IPv6 addresses
+                    append_resolved_ipv6( resource_record, resolved_host_address_list );
+                    break;
                 default:
                     // other types of resource records
                     break;
         GlobalLogger.info() << "- " << current_ip << " [" << current_ttl << "s]" << endl;
     }
 }
+
+void DnsResolver::append_resolved_ipv6(
+        const shared_ptr<resource_base_t> resource_record,
+        HostAddressList *resolved_host_address_list
+) const
+{
+    BOOST_ASSERT( resource_record->rtype() == boost::net::dns::type_a6 );
+
+    a6_resource *a6_rr = dynamic_cast<a6_resource *> ( resource_record.get() );
+    if ( a6_rr != NULL )
+    {
+        string current_ip = a6_rr->address().to_string();
+        uint32_t current_ttl = a6_rr->ttl();
+
+        HostAddress resolved_host( current_ip, current_ttl );
+        resolved_host_address_list->push_back( resolved_host );
+
+        GlobalLogger.info() << "- " << current_ip << " [" << current_ttl << "s]" << endl;
+    }
+}
 
 #include <string>
 
 #include <boost/net/dns.hpp>
+#include <boost/shared_ptr.hpp>
 
 #include "dns/hostaddress.h"
 
 public:
     DnsResolver(
             const std::string &dns_address,
-            const std::string &nameserver
+            const std::string &nameserver,
+            const boost::net::dns::type_t address_resource_record_type
     );
     ~DnsResolver();
 
     bool resolve();
+
     int get_resolved_ip_count() const;
     std::string get_next_ip();
     bool expired_resolved_ip() const;
 private:
     bool handle_ip_address();
 
-    boost::net::dns::rr_list_t fill_answers_list(
+    boost::net::dns::rr_list_t get_answers_list(
             const std::string &host_dns_address,
             const std::string &name_server,
             const boost::net::dns::type_t message_type
             const shared_ptr<boost::net::dns::resource_base_t> resource_record,
             std::list<HostAddress> *resolved_host_address_list
     ) const;
+    void append_resolved_ipv6(
+            const shared_ptr<boost::net::dns::resource_base_t> resource_record,
+            std::list<HostAddress> *resolved_host_address_list
+    ) const;
 
 private:
     /// The list of IPs available to the host DNS.
     const std::string HostDnsAddress;
     /// The address of the server which can resolve the host address.
     const std::string NameServer;
+    /// 'A' resource records for the IPv4 addresses, or 'AAAA' resource records for the IPv6 addresses
+    boost::net::dns::type_t AddressResourceRecord;
 
 };
 
+//-----------------------------------------------------------------------------
+// DnsResolverItem
+//-----------------------------------------------------------------------------
+
+typedef boost::shared_ptr<DnsResolver> DnsResolverItem;
+
 #endif // DNS_RESOLVER_H