diff --git a/cef_paths.gypi b/cef_paths.gypi
index f0ae6ebdb..d5afc1864 100644
--- a/cef_paths.gypi
+++ b/cef_paths.gypi
@@ -252,6 +252,8 @@
       'libcef_dll/ctocpp/request_context_handler_ctocpp.h',
       'libcef_dll/ctocpp/request_handler_ctocpp.cc',
       'libcef_dll/ctocpp/request_handler_ctocpp.h',
+      'libcef_dll/ctocpp/resolve_callback_ctocpp.cc',
+      'libcef_dll/ctocpp/resolve_callback_ctocpp.h',
       'libcef_dll/cpptoc/resource_bundle_cpptoc.cc',
       'libcef_dll/cpptoc/resource_bundle_cpptoc.h',
       'libcef_dll/ctocpp/resource_bundle_handler_ctocpp.cc',
@@ -452,6 +454,8 @@
       'libcef_dll/cpptoc/request_context_handler_cpptoc.h',
       'libcef_dll/cpptoc/request_handler_cpptoc.cc',
       'libcef_dll/cpptoc/request_handler_cpptoc.h',
+      'libcef_dll/cpptoc/resolve_callback_cpptoc.cc',
+      'libcef_dll/cpptoc/resolve_callback_cpptoc.h',
       'libcef_dll/ctocpp/resource_bundle_ctocpp.cc',
       'libcef_dll/ctocpp/resource_bundle_ctocpp.h',
       'libcef_dll/cpptoc/resource_bundle_handler_cpptoc.cc',
diff --git a/include/capi/cef_request_context_capi.h b/include/capi/cef_request_context_capi.h
index e2f1247f9..54b3db31f 100644
--- a/include/capi/cef_request_context_capi.h
+++ b/include/capi/cef_request_context_capi.h
@@ -49,6 +49,26 @@ extern "C" {
 
 struct _cef_scheme_handler_factory_t;
 
+///
+// Callback structure for cef_request_tContext::ResolveHost.
+///
+typedef struct _cef_resolve_callback_t {
+  ///
+  // Base structure.
+  ///
+  cef_base_t base;
+
+  ///
+  // Called after the ResolveHost request has completed. |result| will be the
+  // result code. |resolved_ips| will be the list of resolved IP addresses or
+  // NULL if the resolution failed.
+  ///
+  void (CEF_CALLBACK *on_resolve_completed)(
+      struct _cef_resolve_callback_t* self, cef_errorcode_t result,
+      cef_string_list_t resolved_ips);
+} cef_resolve_callback_t;
+
+
 ///
 // A request context provides request handling for a set of related browser or
 // URL request objects. A request context can be specified when creating a new
@@ -222,6 +242,23 @@ typedef struct _cef_request_context_t {
   void (CEF_CALLBACK *close_all_connections)(
       struct _cef_request_context_t* self,
       struct _cef_completion_callback_t* callback);
+
+  ///
+  // Attempts to resolve |origin| to a list of associated IP addresses.
+  // |callback| will be executed on the UI thread after completion.
+  ///
+  void (CEF_CALLBACK *resolve_host)(struct _cef_request_context_t* self,
+      const cef_string_t* origin, struct _cef_resolve_callback_t* callback);
+
+  ///
+  // Attempts to resolve |origin| to a list of associated IP addresses using
+  // cached data. |resolved_ips| will be populated with the list of resolved IP
+  // addresses or NULL if no cached data is available. Returns ERR_NONE on
+  // success. This function must be called on the browser process IO thread.
+  ///
+  cef_errorcode_t (CEF_CALLBACK *resolve_host_cached)(
+      struct _cef_request_context_t* self, const cef_string_t* origin,
+      cef_string_list_t resolved_ips);
 } cef_request_context_t;
 
 
diff --git a/include/cef_request_context.h b/include/cef_request_context.h
index f448f74be..d8cd5581e 100644
--- a/include/cef_request_context.h
+++ b/include/cef_request_context.h
@@ -38,6 +38,8 @@
 #define CEF_INCLUDE_CEF_REQUEST_CONTEXT_H_
 #pragma once
 
+#include <vector>
+
 #include "include/cef_callback.h"
 #include "include/cef_cookie.h"
 #include "include/cef_request_context_handler.h"
@@ -45,6 +47,25 @@
 
 class CefSchemeHandlerFactory;
 
+
+///
+// Callback interface for CefRequestContext::ResolveHost.
+///
+/*--cef(source=client)--*/
+class CefResolveCallback : public virtual CefBase {
+ public:
+  ///
+  // Called after the ResolveHost request has completed. |result| will be the
+  // result code. |resolved_ips| will be the list of resolved IP addresses or
+  // empty if the resolution failed.
+  ///
+  /*--cef(optional_param=resolved_ips)--*/
+  virtual void OnResolveCompleted(
+      cef_errorcode_t result,
+      const std::vector<CefString>& resolved_ips) =0;
+};
+
+
 ///
 // A request context provides request handling for a set of related browser
 // or URL request objects. A request context can be specified when creating a
@@ -240,6 +261,26 @@ class CefRequestContext : public virtual CefBase {
   /*--cef(optional_param=callback)--*/
   virtual void CloseAllConnections(
       CefRefPtr<CefCompletionCallback> callback) =0;
+
+  ///
+  // Attempts to resolve |origin| to a list of associated IP addresses.
+  // |callback| will be executed on the UI thread after completion.
+  ///
+  /*--cef()--*/
+  virtual void ResolveHost(
+      const CefString& origin,
+      CefRefPtr<CefResolveCallback> callback) =0;
+
+  ///
+  // Attempts to resolve |origin| to a list of associated IP addresses using
+  // cached data. |resolved_ips| will be populated with the list of resolved IP
+  // addresses or empty if no cached data is available. Returns ERR_NONE on
+  // success. This method must be called on the browser process IO thread.
+  ///
+  /*--cef(default_retval=ERR_FAILED)--*/
+  virtual cef_errorcode_t ResolveHostCached(
+      const CefString& origin,
+      std::vector<CefString>& resolved_ips) =0;
 };
 
 #endif  // CEF_INCLUDE_CEF_REQUEST_CONTEXT_H_
diff --git a/libcef/browser/request_context_impl.cc b/libcef/browser/request_context_impl.cc
index d92749087..7aa8228f1 100644
--- a/libcef/browser/request_context_impl.cc
+++ b/libcef/browser/request_context_impl.cc
@@ -50,6 +50,30 @@ const char* GetTypeString(base::Value::Type type) {
   return "UNKNOWN";
 }
 
+// Helper for HostResolver::Resolve.
+struct ResolveHostHelper {
+  explicit ResolveHostHelper(CefRefPtr<CefResolveCallback> callback)
+      : callback_(callback) {
+  }
+
+  void OnResolveCompleted(int result) {
+    std::vector<CefString> resolved_ips;
+
+    net::AddressList::const_iterator iter = address_list_.begin();
+    for (; iter != address_list_.end(); ++iter)
+      resolved_ips.push_back(iter->ToStringWithoutPort());
+
+    CEF_POST_TASK(CEF_UIT,
+        base::Bind(&CefResolveCallback::OnResolveCompleted, callback_.get(),
+                   static_cast<cef_errorcode_t>(result), resolved_ips));
+
+    delete this;
+  }
+
+  CefRefPtr<CefResolveCallback> callback_;
+  net::AddressList address_list_;
+};
+
 }  // namespace
 
 
@@ -463,6 +487,47 @@ void CefRequestContextImpl::CloseAllConnections(
                  callback));
 }
 
+void CefRequestContextImpl::ResolveHost(
+    const CefString& origin,
+    CefRefPtr<CefResolveCallback> callback) {
+  GetRequestContextImpl(
+      BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO),
+      base::Bind(&CefRequestContextImpl::ResolveHostInternal, this, origin,
+                 callback));
+}
+
+cef_errorcode_t CefRequestContextImpl::ResolveHostCached(
+    const CefString& origin,
+    std::vector<CefString>& resolved_ips) {
+  resolved_ips.clear();
+
+  if (!CEF_CURRENTLY_ON_IOT()) {
+    NOTREACHED() << "called on invalid thread";
+    return ERR_FAILED;
+  }
+
+  if (!request_context_impl_)
+    return ERR_FAILED;
+
+  int retval = ERR_FAILED;
+
+  net::HostResolver* host_resolver = request_context_impl_->GetHostResolver();
+  if (host_resolver) {
+    net::HostResolver::RequestInfo request_info(
+        net::HostPortPair::FromURL(GURL(origin.ToString())));
+    net::AddressList address_list;
+    retval = host_resolver->ResolveFromCache(request_info, &address_list,
+                                             net::BoundNetLog());
+    if (retval == net::OK) {
+      net::AddressList::const_iterator iter = address_list.begin();
+      for (; iter != address_list.end(); ++iter)
+        resolved_ips.push_back(iter->ToString());
+    }
+  }
+
+  return static_cast<cef_errorcode_t>(retval);
+}
+
 CefRequestContextImpl::CefRequestContextImpl(
     scoped_refptr<CefBrowserContext> browser_context)
     : browser_context_(browser_context),
@@ -605,3 +670,33 @@ void CefRequestContextImpl::CloseAllConnectionsInternal(
         base::Bind(&CefCompletionCallback::OnComplete, callback.get()));
   }
 }
+
+void CefRequestContextImpl::ResolveHostInternal(
+    const CefString& origin,
+    CefRefPtr<CefResolveCallback> callback,
+    scoped_refptr<CefURLRequestContextGetterImpl> request_context) {
+  CEF_REQUIRE_IOT();
+
+  int retval = ERR_FAILED;
+
+  // |helper| will be deleted in ResolveHostHelper::OnResolveCompleted().
+  ResolveHostHelper* helper = new ResolveHostHelper(callback);
+
+  net::HostResolver* host_resolver = request_context->GetHostResolver();
+  if (host_resolver) {
+    net::HostResolver::RequestInfo request_info(
+        net::HostPortPair::FromURL(GURL(origin.ToString())));
+    retval = host_resolver->Resolve(
+        request_info, net::DEFAULT_PRIORITY,
+        &helper->address_list_,
+        base::Bind(&ResolveHostHelper::OnResolveCompleted,
+                   base::Unretained(helper)),
+        NULL, net::BoundNetLog());
+    if (retval == net::ERR_IO_PENDING) {
+      // The result will be delivered asynchronously via the callback.
+      return;
+    }
+  }
+
+  helper->OnResolveCompleted(retval);
+}
diff --git a/libcef/browser/request_context_impl.h b/libcef/browser/request_context_impl.h
index d72beaf10..e8cb02038 100644
--- a/libcef/browser/request_context_impl.h
+++ b/libcef/browser/request_context_impl.h
@@ -72,6 +72,12 @@ class CefRequestContextImpl : public CefRequestContext {
   void ClearCertificateExceptions(
       CefRefPtr<CefCompletionCallback> callback) override;
   void CloseAllConnections(CefRefPtr<CefCompletionCallback> callback) override;
+  void ResolveHost(
+      const CefString& origin,
+      CefRefPtr<CefResolveCallback> callback) override;
+  cef_errorcode_t ResolveHostCached(
+      const CefString& origin,
+      std::vector<CefString>& resolved_ips) override;
 
   const CefRequestContextSettings& settings() const { return settings_; }
 
@@ -112,6 +118,10 @@ class CefRequestContextImpl : public CefRequestContext {
   void CloseAllConnectionsInternal(
       CefRefPtr<CefCompletionCallback> callback,
       scoped_refptr<CefURLRequestContextGetterImpl> request_context);
+  void ResolveHostInternal(
+      const CefString& origin,
+      CefRefPtr<CefResolveCallback> callback,
+      scoped_refptr<CefURLRequestContextGetterImpl> request_context);
 
   scoped_refptr<CefBrowserContext> browser_context_;
   CefRequestContextSettings settings_;
diff --git a/libcef_dll/cpptoc/request_context_cpptoc.cc b/libcef_dll/cpptoc/request_context_cpptoc.cc
index 62e49a555..e3e7959e7 100644
--- a/libcef_dll/cpptoc/request_context_cpptoc.cc
+++ b/libcef_dll/cpptoc/request_context_cpptoc.cc
@@ -16,7 +16,9 @@
 #include "libcef_dll/cpptoc/value_cpptoc.h"
 #include "libcef_dll/ctocpp/completion_callback_ctocpp.h"
 #include "libcef_dll/ctocpp/request_context_handler_ctocpp.h"
+#include "libcef_dll/ctocpp/resolve_callback_ctocpp.h"
 #include "libcef_dll/ctocpp/scheme_handler_factory_ctocpp.h"
+#include "libcef_dll/transfer_util.h"
 
 
 // GLOBAL FUNCTIONS - Body may be edited by hand.
@@ -378,6 +380,64 @@ void CEF_CALLBACK request_context_close_all_connections(
       CefCompletionCallbackCToCpp::Wrap(callback));
 }
 
+void CEF_CALLBACK request_context_resolve_host(
+    struct _cef_request_context_t* self, const cef_string_t* origin,
+    cef_resolve_callback_t* callback) {
+  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
+
+  DCHECK(self);
+  if (!self)
+    return;
+  // Verify param: origin; type: string_byref_const
+  DCHECK(origin);
+  if (!origin)
+    return;
+  // Verify param: callback; type: refptr_diff
+  DCHECK(callback);
+  if (!callback)
+    return;
+
+  // Execute
+  CefRequestContextCppToC::Get(self)->ResolveHost(
+      CefString(origin),
+      CefResolveCallbackCToCpp::Wrap(callback));
+}
+
+cef_errorcode_t CEF_CALLBACK request_context_resolve_host_cached(
+    struct _cef_request_context_t* self, const cef_string_t* origin,
+    cef_string_list_t resolved_ips) {
+  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
+
+  DCHECK(self);
+  if (!self)
+    return ERR_FAILED;
+  // Verify param: origin; type: string_byref_const
+  DCHECK(origin);
+  if (!origin)
+    return ERR_FAILED;
+  // Verify param: resolved_ips; type: string_vec_byref
+  DCHECK(resolved_ips);
+  if (!resolved_ips)
+    return ERR_FAILED;
+
+  // Translate param: resolved_ips; type: string_vec_byref
+  std::vector<CefString> resolved_ipsList;
+  transfer_string_list_contents(resolved_ips, resolved_ipsList);
+
+  // Execute
+  cef_errorcode_t _retval = CefRequestContextCppToC::Get(
+      self)->ResolveHostCached(
+      CefString(origin),
+      resolved_ipsList);
+
+  // Restore param: resolved_ips; type: string_vec_byref
+  cef_string_list_clear(resolved_ips);
+  transfer_string_list_contents(resolved_ipsList, resolved_ips);
+
+  // Return type: simple
+  return _retval;
+}
+
 }  // namespace
 
 
@@ -405,6 +465,8 @@ CefRequestContextCppToC::CefRequestContextCppToC() {
   GetStruct()->clear_certificate_exceptions =
       request_context_clear_certificate_exceptions;
   GetStruct()->close_all_connections = request_context_close_all_connections;
+  GetStruct()->resolve_host = request_context_resolve_host;
+  GetStruct()->resolve_host_cached = request_context_resolve_host_cached;
 }
 
 template<> CefRefPtr<CefRequestContext> CefCppToC<CefRequestContextCppToC,
diff --git a/libcef_dll/cpptoc/resolve_callback_cpptoc.cc b/libcef_dll/cpptoc/resolve_callback_cpptoc.cc
new file mode 100644
index 000000000..ba2153f97
--- /dev/null
+++ b/libcef_dll/cpptoc/resolve_callback_cpptoc.cc
@@ -0,0 +1,64 @@
+// Copyright (c) 2016 The Chromium Embedded Framework Authors. All rights
+// reserved. Use of this source code is governed by a BSD-style license that
+// can be found in the LICENSE file.
+//
+// ---------------------------------------------------------------------------
+//
+// This file was generated by the CEF translator tool. If making changes by
+// hand only do so within the body of existing method and function
+// implementations. See the translator.README.txt file in the tools directory
+// for more information.
+//
+
+#include "libcef_dll/cpptoc/resolve_callback_cpptoc.h"
+#include "libcef_dll/transfer_util.h"
+
+
+namespace {
+
+// MEMBER FUNCTIONS - Body may be edited by hand.
+
+void CEF_CALLBACK resolve_callback_on_resolve_completed(
+    struct _cef_resolve_callback_t* self, cef_errorcode_t result,
+    cef_string_list_t resolved_ips) {
+  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
+
+  DCHECK(self);
+  if (!self)
+    return;
+  // Unverified params: resolved_ips
+
+  // Translate param: resolved_ips; type: string_vec_byref_const
+  std::vector<CefString> resolved_ipsList;
+  transfer_string_list_contents(resolved_ips, resolved_ipsList);
+
+  // Execute
+  CefResolveCallbackCppToC::Get(self)->OnResolveCompleted(
+      result,
+      resolved_ipsList);
+}
+
+}  // namespace
+
+
+// CONSTRUCTOR - Do not edit by hand.
+
+CefResolveCallbackCppToC::CefResolveCallbackCppToC() {
+  GetStruct()->on_resolve_completed = resolve_callback_on_resolve_completed;
+}
+
+template<> CefRefPtr<CefResolveCallback> CefCppToC<CefResolveCallbackCppToC,
+    CefResolveCallback, cef_resolve_callback_t>::UnwrapDerived(
+    CefWrapperType type, cef_resolve_callback_t* s) {
+  NOTREACHED() << "Unexpected class type: " << type;
+  return NULL;
+}
+
+#ifndef NDEBUG
+template<> base::AtomicRefCount CefCppToC<CefResolveCallbackCppToC,
+    CefResolveCallback, cef_resolve_callback_t>::DebugObjCt = 0;
+#endif
+
+template<> CefWrapperType CefCppToC<CefResolveCallbackCppToC,
+    CefResolveCallback, cef_resolve_callback_t>::kWrapperType =
+    WT_RESOLVE_CALLBACK;
diff --git a/libcef_dll/cpptoc/resolve_callback_cpptoc.h b/libcef_dll/cpptoc/resolve_callback_cpptoc.h
new file mode 100644
index 000000000..954c0a475
--- /dev/null
+++ b/libcef_dll/cpptoc/resolve_callback_cpptoc.h
@@ -0,0 +1,37 @@
+// Copyright (c) 2016 The Chromium Embedded Framework Authors. All rights
+// reserved. Use of this source code is governed by a BSD-style license that
+// can be found in the LICENSE file.
+//
+// ---------------------------------------------------------------------------
+//
+// This file was generated by the CEF translator tool. If making changes by
+// hand only do so within the body of existing method and function
+// implementations. See the translator.README.txt file in the tools directory
+// for more information.
+//
+
+#ifndef CEF_LIBCEF_DLL_CPPTOC_RESOLVE_CALLBACK_CPPTOC_H_
+#define CEF_LIBCEF_DLL_CPPTOC_RESOLVE_CALLBACK_CPPTOC_H_
+#pragma once
+
+#ifndef USING_CEF_SHARED
+#pragma message("Warning: "__FILE__" may be accessed wrapper-side only")
+#else  // USING_CEF_SHARED
+
+#include "include/cef_request_context.h"
+#include "include/capi/cef_request_context_capi.h"
+#include "include/cef_scheme.h"
+#include "include/capi/cef_scheme_capi.h"
+#include "libcef_dll/cpptoc/cpptoc.h"
+
+// Wrap a C++ class with a C structure.
+// This class may be instantiated and accessed wrapper-side only.
+class CefResolveCallbackCppToC
+    : public CefCppToC<CefResolveCallbackCppToC, CefResolveCallback,
+        cef_resolve_callback_t> {
+ public:
+  CefResolveCallbackCppToC();
+};
+
+#endif  // USING_CEF_SHARED
+#endif  // CEF_LIBCEF_DLL_CPPTOC_RESOLVE_CALLBACK_CPPTOC_H_
diff --git a/libcef_dll/ctocpp/request_context_ctocpp.cc b/libcef_dll/ctocpp/request_context_ctocpp.cc
index db777300b..0a44369d3 100644
--- a/libcef_dll/ctocpp/request_context_ctocpp.cc
+++ b/libcef_dll/ctocpp/request_context_ctocpp.cc
@@ -12,11 +12,13 @@
 
 #include "libcef_dll/cpptoc/completion_callback_cpptoc.h"
 #include "libcef_dll/cpptoc/request_context_handler_cpptoc.h"
+#include "libcef_dll/cpptoc/resolve_callback_cpptoc.h"
 #include "libcef_dll/cpptoc/scheme_handler_factory_cpptoc.h"
 #include "libcef_dll/ctocpp/cookie_manager_ctocpp.h"
 #include "libcef_dll/ctocpp/dictionary_value_ctocpp.h"
 #include "libcef_dll/ctocpp/request_context_ctocpp.h"
 #include "libcef_dll/ctocpp/value_ctocpp.h"
+#include "libcef_dll/transfer_util.h"
 
 
 // STATIC METHODS - Body may be edited by hand.
@@ -355,6 +357,64 @@ void CefRequestContextCToCpp::CloseAllConnections(
       CefCompletionCallbackCppToC::Wrap(callback));
 }
 
+void CefRequestContextCToCpp::ResolveHost(const CefString& origin,
+    CefRefPtr<CefResolveCallback> callback) {
+  cef_request_context_t* _struct = GetStruct();
+  if (CEF_MEMBER_MISSING(_struct, resolve_host))
+    return;
+
+  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
+
+  // Verify param: origin; type: string_byref_const
+  DCHECK(!origin.empty());
+  if (origin.empty())
+    return;
+  // Verify param: callback; type: refptr_diff
+  DCHECK(callback.get());
+  if (!callback.get())
+    return;
+
+  // Execute
+  _struct->resolve_host(_struct,
+      origin.GetStruct(),
+      CefResolveCallbackCppToC::Wrap(callback));
+}
+
+cef_errorcode_t CefRequestContextCToCpp::ResolveHostCached(
+    const CefString& origin, std::vector<CefString>& resolved_ips) {
+  cef_request_context_t* _struct = GetStruct();
+  if (CEF_MEMBER_MISSING(_struct, resolve_host_cached))
+    return ERR_FAILED;
+
+  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
+
+  // Verify param: origin; type: string_byref_const
+  DCHECK(!origin.empty());
+  if (origin.empty())
+    return ERR_FAILED;
+
+  // Translate param: resolved_ips; type: string_vec_byref
+  cef_string_list_t resolved_ipsList = cef_string_list_alloc();
+  DCHECK(resolved_ipsList);
+  if (resolved_ipsList)
+    transfer_string_list_contents(resolved_ips, resolved_ipsList);
+
+  // Execute
+  cef_errorcode_t _retval = _struct->resolve_host_cached(_struct,
+      origin.GetStruct(),
+      resolved_ipsList);
+
+  // Restore param:resolved_ips; type: string_vec_byref
+  if (resolved_ipsList) {
+    resolved_ips.clear();
+    transfer_string_list_contents(resolved_ipsList, resolved_ips);
+    cef_string_list_free(resolved_ipsList);
+  }
+
+  // Return type: simple
+  return _retval;
+}
+
 
 // CONSTRUCTOR - Do not edit by hand.
 
diff --git a/libcef_dll/ctocpp/request_context_ctocpp.h b/libcef_dll/ctocpp/request_context_ctocpp.h
index fee86fd57..bbce628c1 100644
--- a/libcef_dll/ctocpp/request_context_ctocpp.h
+++ b/libcef_dll/ctocpp/request_context_ctocpp.h
@@ -18,6 +18,7 @@
 #pragma message("Warning: "__FILE__" may be accessed wrapper-side only")
 #else  // USING_CEF_SHARED
 
+#include <vector>
 #include "include/cef_request_context.h"
 #include "include/capi/cef_request_context_capi.h"
 #include "include/cef_scheme.h"
@@ -55,6 +56,10 @@ class CefRequestContextCToCpp
   void ClearCertificateExceptions(
       CefRefPtr<CefCompletionCallback> callback) OVERRIDE;
   void CloseAllConnections(CefRefPtr<CefCompletionCallback> callback) OVERRIDE;
+  void ResolveHost(const CefString& origin,
+      CefRefPtr<CefResolveCallback> callback) OVERRIDE;
+  cef_errorcode_t ResolveHostCached(const CefString& origin,
+      std::vector<CefString>& resolved_ips) OVERRIDE;
 };
 
 #endif  // USING_CEF_SHARED
diff --git a/libcef_dll/ctocpp/resolve_callback_ctocpp.cc b/libcef_dll/ctocpp/resolve_callback_ctocpp.cc
new file mode 100644
index 000000000..440bc9cf8
--- /dev/null
+++ b/libcef_dll/ctocpp/resolve_callback_ctocpp.cc
@@ -0,0 +1,65 @@
+// Copyright (c) 2016 The Chromium Embedded Framework Authors. All rights
+// reserved. Use of this source code is governed by a BSD-style license that
+// can be found in the LICENSE file.
+//
+// ---------------------------------------------------------------------------
+//
+// This file was generated by the CEF translator tool. If making changes by
+// hand only do so within the body of existing method and function
+// implementations. See the translator.README.txt file in the tools directory
+// for more information.
+//
+
+#include "libcef_dll/ctocpp/resolve_callback_ctocpp.h"
+#include "libcef_dll/transfer_util.h"
+
+
+// VIRTUAL METHODS - Body may be edited by hand.
+
+void CefResolveCallbackCToCpp::OnResolveCompleted(cef_errorcode_t result,
+    const std::vector<CefString>& resolved_ips) {
+  cef_resolve_callback_t* _struct = GetStruct();
+  if (CEF_MEMBER_MISSING(_struct, on_resolve_completed))
+    return;
+
+  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
+
+  // Unverified params: resolved_ips
+
+  // Translate param: resolved_ips; type: string_vec_byref_const
+  cef_string_list_t resolved_ipsList = cef_string_list_alloc();
+  DCHECK(resolved_ipsList);
+  if (resolved_ipsList)
+    transfer_string_list_contents(resolved_ips, resolved_ipsList);
+
+  // Execute
+  _struct->on_resolve_completed(_struct,
+      result,
+      resolved_ipsList);
+
+  // Restore param:resolved_ips; type: string_vec_byref_const
+  if (resolved_ipsList)
+    cef_string_list_free(resolved_ipsList);
+}
+
+
+// CONSTRUCTOR - Do not edit by hand.
+
+CefResolveCallbackCToCpp::CefResolveCallbackCToCpp() {
+}
+
+template<> cef_resolve_callback_t* CefCToCpp<CefResolveCallbackCToCpp,
+    CefResolveCallback, cef_resolve_callback_t>::UnwrapDerived(
+    CefWrapperType type, CefResolveCallback* c) {
+  NOTREACHED() << "Unexpected class type: " << type;
+  return NULL;
+}
+
+#ifndef NDEBUG
+template<> base::AtomicRefCount CefCToCpp<CefResolveCallbackCToCpp,
+    CefResolveCallback, cef_resolve_callback_t>::DebugObjCt = 0;
+#endif
+
+template<> CefWrapperType CefCToCpp<CefResolveCallbackCToCpp,
+    CefResolveCallback, cef_resolve_callback_t>::kWrapperType =
+    WT_RESOLVE_CALLBACK;
diff --git a/libcef_dll/ctocpp/resolve_callback_ctocpp.h b/libcef_dll/ctocpp/resolve_callback_ctocpp.h
new file mode 100644
index 000000000..d8384fbc4
--- /dev/null
+++ b/libcef_dll/ctocpp/resolve_callback_ctocpp.h
@@ -0,0 +1,42 @@
+// Copyright (c) 2016 The Chromium Embedded Framework Authors. All rights
+// reserved. Use of this source code is governed by a BSD-style license that
+// can be found in the LICENSE file.
+//
+// ---------------------------------------------------------------------------
+//
+// This file was generated by the CEF translator tool. If making changes by
+// hand only do so within the body of existing method and function
+// implementations. See the translator.README.txt file in the tools directory
+// for more information.
+//
+
+#ifndef CEF_LIBCEF_DLL_CTOCPP_RESOLVE_CALLBACK_CTOCPP_H_
+#define CEF_LIBCEF_DLL_CTOCPP_RESOLVE_CALLBACK_CTOCPP_H_
+#pragma once
+
+#ifndef BUILDING_CEF_SHARED
+#pragma message("Warning: "__FILE__" may be accessed DLL-side only")
+#else  // BUILDING_CEF_SHARED
+
+#include <vector>
+#include "include/cef_request_context.h"
+#include "include/capi/cef_request_context_capi.h"
+#include "include/cef_scheme.h"
+#include "include/capi/cef_scheme_capi.h"
+#include "libcef_dll/ctocpp/ctocpp.h"
+
+// Wrap a C structure with a C++ class.
+// This class may be instantiated and accessed DLL-side only.
+class CefResolveCallbackCToCpp
+    : public CefCToCpp<CefResolveCallbackCToCpp, CefResolveCallback,
+        cef_resolve_callback_t> {
+ public:
+  CefResolveCallbackCToCpp();
+
+  // CefResolveCallback methods.
+  void OnResolveCompleted(cef_errorcode_t result,
+      const std::vector<CefString>& resolved_ips) override;
+};
+
+#endif  // BUILDING_CEF_SHARED
+#endif  // CEF_LIBCEF_DLL_CTOCPP_RESOLVE_CALLBACK_CTOCPP_H_
diff --git a/libcef_dll/libcef_dll.cc b/libcef_dll/libcef_dll.cc
index cc3a97ea9..ce52e8b5d 100644
--- a/libcef_dll/libcef_dll.cc
+++ b/libcef_dll/libcef_dll.cc
@@ -102,6 +102,7 @@
 #include "libcef_dll/ctocpp/render_handler_ctocpp.h"
 #include "libcef_dll/ctocpp/render_process_handler_ctocpp.h"
 #include "libcef_dll/ctocpp/request_handler_ctocpp.h"
+#include "libcef_dll/ctocpp/resolve_callback_ctocpp.h"
 #include "libcef_dll/ctocpp/resource_bundle_handler_ctocpp.h"
 #include "libcef_dll/ctocpp/resource_handler_ctocpp.h"
 #include "libcef_dll/ctocpp/response_filter_ctocpp.h"
@@ -247,6 +248,7 @@ CEF_EXPORT void cef_shutdown() {
       &CefRenderProcessHandlerCToCpp::DebugObjCt));
   DCHECK(base::AtomicRefCountIsZero(&CefRequestCallbackCppToC::DebugObjCt));
   DCHECK(base::AtomicRefCountIsZero(&CefRequestHandlerCToCpp::DebugObjCt));
+  DCHECK(base::AtomicRefCountIsZero(&CefResolveCallbackCToCpp::DebugObjCt));
   DCHECK(base::AtomicRefCountIsZero(
       &CefResourceBundleHandlerCToCpp::DebugObjCt));
   DCHECK(base::AtomicRefCountIsZero(&CefResourceHandlerCToCpp::DebugObjCt));
diff --git a/libcef_dll/wrapper/libcef_dll_wrapper.cc b/libcef_dll/wrapper/libcef_dll_wrapper.cc
index 72513bbd1..7ec79f2ee 100644
--- a/libcef_dll/wrapper/libcef_dll_wrapper.cc
+++ b/libcef_dll/wrapper/libcef_dll_wrapper.cc
@@ -60,6 +60,7 @@
 #include "libcef_dll/cpptoc/render_handler_cpptoc.h"
 #include "libcef_dll/cpptoc/render_process_handler_cpptoc.h"
 #include "libcef_dll/cpptoc/request_handler_cpptoc.h"
+#include "libcef_dll/cpptoc/resolve_callback_cpptoc.h"
 #include "libcef_dll/cpptoc/resource_bundle_handler_cpptoc.h"
 #include "libcef_dll/cpptoc/resource_handler_cpptoc.h"
 #include "libcef_dll/cpptoc/response_filter_cpptoc.h"
@@ -239,6 +240,7 @@ CEF_GLOBAL void CefShutdown() {
       &CefRenderProcessHandlerCppToC::DebugObjCt));
   DCHECK(base::AtomicRefCountIsZero(&CefRequestCallbackCToCpp::DebugObjCt));
   DCHECK(base::AtomicRefCountIsZero(&CefRequestHandlerCppToC::DebugObjCt));
+  DCHECK(base::AtomicRefCountIsZero(&CefResolveCallbackCppToC::DebugObjCt));
   DCHECK(base::AtomicRefCountIsZero(
       &CefResourceBundleHandlerCppToC::DebugObjCt));
   DCHECK(base::AtomicRefCountIsZero(&CefResourceHandlerCppToC::DebugObjCt));
diff --git a/libcef_dll/wrapper_types.h b/libcef_dll/wrapper_types.h
index df0de796d..5f89e8d88 100644
--- a/libcef_dll/wrapper_types.h
+++ b/libcef_dll/wrapper_types.h
@@ -76,6 +76,7 @@ enum CefWrapperType {
   WT_REQUEST_CONTEXT,
   WT_REQUEST_CONTEXT_HANDLER,
   WT_REQUEST_HANDLER,
+  WT_RESOLVE_CALLBACK,
   WT_RESOURCE_BUNDLE,
   WT_RESOURCE_BUNDLE_HANDLER,
   WT_RESOURCE_HANDLER,
diff --git a/tests/unittests/request_context_unittest.cc b/tests/unittests/request_context_unittest.cc
index d67423729..d8811e8b3 100644
--- a/tests/unittests/request_context_unittest.cc
+++ b/tests/unittests/request_context_unittest.cc
@@ -654,17 +654,23 @@ TEST(RequestContextTest, NoReferrerLinkDifferentOrigin) {
 
 namespace {
 
+const char kResolveOrigin[] = "http://www.google.com";
+
 class MethodTestHandler : public TestHandler {
  public:
   enum Method {
     METHOD_CLEAR_CERTIFICATE_EXCEPTIONS,
     METHOD_CLOSE_ALL_CONNECTIONS,
+    METHOD_RESOLVE_HOST,
   };
 
-  class CompletionCallback : public CefCompletionCallback {
+  class CompletionCallback : public CefCompletionCallback,
+                             public CefResolveCallback {
    public:
-    explicit CompletionCallback(MethodTestHandler* test_handler)
-      : test_handler_(test_handler) {
+    CompletionCallback(MethodTestHandler* test_handler,
+                       CefRefPtr<CefBrowser> browser)
+      : test_handler_(test_handler),
+        browser_(browser) {
     }
 
     ~CompletionCallback() override {
@@ -679,12 +685,22 @@ class MethodTestHandler : public TestHandler {
 
       // OnComplete should be executed only one time.
       EXPECT_TRUE(test_handler_);
-      test_handler_->OnCompleteCallback();
+      test_handler_->OnCompleteCallback(browser_);
       test_handler_ = nullptr;
+      browser_ = nullptr;
+    }
+
+    void OnResolveCompleted(
+        cef_errorcode_t result,
+        const std::vector<CefString>& resolved_ips) override {
+      EXPECT_EQ(ERR_NONE, result);
+      EXPECT_TRUE(!resolved_ips.empty());
+      OnComplete();
     }
 
    private:
     MethodTestHandler* test_handler_;
+    CefRefPtr<CefBrowser> browser_;
 
     IMPLEMENT_REFCOUNTING(CompletionCallback);
   };
@@ -717,18 +733,42 @@ class MethodTestHandler : public TestHandler {
                  int httpStatusCode) override {
     CefRefPtr<CefRequestContext> context =
         browser->GetHost()->GetRequestContext();
-    CefRefPtr<CefCompletionCallback> callback = new CompletionCallback(this);
+    CefRefPtr<CompletionCallback> callback =
+        new CompletionCallback(this, browser);
     if (method_ == METHOD_CLEAR_CERTIFICATE_EXCEPTIONS)
       context->ClearCertificateExceptions(callback);
     else if (method_ == METHOD_CLOSE_ALL_CONNECTIONS)
       context->CloseAllConnections(callback);
+    else if (method_ == METHOD_RESOLVE_HOST)
+      context->ResolveHost(kResolveOrigin, callback);
   }
 
-  void OnCompleteCallback() {
+  void OnCompleteCallback(CefRefPtr<CefBrowser> browser) {
     EXPECT_UI_THREAD();
     EXPECT_FALSE(got_completion_callback_);
     got_completion_callback_.yes();
-    DestroyTest();
+
+    if (method_ == METHOD_RESOLVE_HOST) {
+      // Now try a cached request.
+      CefPostTask(TID_IO,
+          base::Bind(&MethodTestHandler::ResolveHostCached, this, browser));
+    } else {
+      DestroyTest();
+    }
+  }
+
+  void ResolveHostCached(CefRefPtr<CefBrowser> browser) {
+    EXPECT_IO_THREAD();
+
+    CefRefPtr<CefRequestContext> context =
+        browser->GetHost()->GetRequestContext();
+    std::vector<CefString> resolved_ips;
+    cef_errorcode_t result =
+        context->ResolveHostCached(kResolveOrigin, resolved_ips);
+    EXPECT_EQ(ERR_NONE, result);
+    EXPECT_TRUE(!resolved_ips.empty());
+
+    CefPostTask(TID_UI, base::Bind(&MethodTestHandler::DestroyTest, this));
   }
 
  private:
@@ -781,4 +821,22 @@ TEST(RequestContextTest, CloseAllConnectionsCustom) {
           MethodTestHandler::METHOD_CLOSE_ALL_CONNECTIONS);
   handler->ExecuteTest();
   ReleaseAndWaitForDestructor(handler);
-}
\ No newline at end of file
+}
+
+// Test CefRequestContext::ResolveHost with the global context.
+TEST(RequestContextTest, ResolveHostGlobal) {
+  CefRefPtr<MethodTestHandler> handler =
+      new MethodTestHandler(true,
+          MethodTestHandler::METHOD_RESOLVE_HOST);
+  handler->ExecuteTest();
+  ReleaseAndWaitForDestructor(handler);
+}
+
+// Test CefRequestContext::ResolveHost with a custom context.
+TEST(RequestContextTest, ResolveHostCustom) {
+  CefRefPtr<MethodTestHandler> handler =
+      new MethodTestHandler(false,
+          MethodTestHandler::METHOD_RESOLVE_HOST);
+  handler->ExecuteTest();
+  ReleaseAndWaitForDestructor(handler);
+}