diff --git a/include/grpc/impl/codegen/port_platform.h b/include/grpc/impl/codegen/port_platform.h
index 7c67bad5ae1af531a55df0e83cc2c1830db76f6b..933c4c97aec4cd6d308974e0437d9099bfff68f7 100644
--- a/include/grpc/impl/codegen/port_platform.h
+++ b/include/grpc/impl/codegen/port_platform.h
@@ -431,6 +431,12 @@ typedef unsigned __int64 uint64_t;
    power of two */
 #define GPR_MAX_ALIGNMENT 16
 
+#ifdef GPR_WINDOWS
+#ifndef GRPC_NATIVE_ADDRESS_RESOLVE
+#define GRPC_NATIVE_ADDRESS_RESOLVE
+#endif
+#endif
+
 #ifndef GRPC_MUST_USE_RESULT
 #ifdef __GNUC__
 #define GRPC_MUST_USE_RESULT __attribute__((warn_unused_result))
diff --git a/package.json b/package.json
index 4b175fe4c5f6996b78146b3f1ddfb78238812e2a..c74dbe45e3c72fdac50dd7fea0c0608a57bb553c 100644
--- a/package.json
+++ b/package.json
@@ -23,7 +23,7 @@
     "test": "./node_modules/.bin/mocha src/node/test && npm run-script lint",
     "gen_docs": "./node_modules/.bin/jsdoc -c src/node/jsdoc_conf.json",
     "coverage": "./node_modules/.bin/istanbul cover ./node_modules/.bin/_mocha src/node/test",
-    "install": "./node_modules/.bin/node-pre-gyp install --fallback-to-build --library='static_library'"
+    "install": "./node_modules/.bin/node-pre-gyp install --fallback-to-build --library=static_library"
   },
   "bundledDependencies": ["node-pre-gyp"],
   "dependencies": {
diff --git a/setup.py b/setup.py
index a408d24ff93052764df37ea611a5fdf8a1af88a8..f7ba8911e22b921f55a2a7fe16f5221c76ff083d 100644
--- a/setup.py
+++ b/setup.py
@@ -148,11 +148,14 @@ if "win32" in sys.platform:
 
 DEFINE_MACROS = (
     ('OPENSSL_NO_ASM', 1), ('_WIN32_WINNT', 0x600),
-    ('GPR_BACKWARDS_COMPATIBILITY_MODE', 1), ('HAVE_CONFIG_H', 1),)
+    ('GPR_BACKWARDS_COMPATIBILITY_MODE', 1),)
 if "win32" in sys.platform:
-  DEFINE_MACROS += (('OPENSSL_WINDOWS', 1), ('WIN32_LEAN_AND_MEAN', 1),)
+  DEFINE_MACROS += (('OPENSSL_WINDOWS', 1), ('WIN32_LEAN_AND_MEAN', 1),
+                    ('CARES_STATICLIB', 1),)
   if '64bit' in platform.architecture()[0]:
     DEFINE_MACROS += (('MS_WIN64', 1),)
+else:
+  DEFINE_MACROS += (('HAVE_CONFIG_H', 1),)
 
 LDFLAGS = tuple(EXTRA_LINK_ARGS)
 CFLAGS = tuple(EXTRA_COMPILE_ARGS)
diff --git a/src/c-ares/gen_build_yaml.py b/src/c-ares/gen_build_yaml.py
index 33ad44eebf10960aeba132a21597018e0865f8a1..ae61c7856aa0aae538740b79d863c96330f3b166 100755
--- a/src/c-ares/gen_build_yaml.py
+++ b/src/c-ares/gen_build_yaml.py
@@ -136,6 +136,7 @@ try:
         "third_party/c-ares/ares_strdup.h",
         "third_party/c-ares/ares_version.h",
         "third_party/c-ares/bitncmp.h",
+        "third_party/c-ares/config-win32.h",
         "third_party/c-ares/setup_once.h",
         "src/c-ares/ares_build.h",
         "src/c-ares/config_linux/ares_config.h",
diff --git a/src/core/ext/resolver/dns/c_ares/dns_resolver.c b/src/core/ext/resolver/dns/c_ares/dns_resolver.c
index 67c094db165b571ebfebc7d98ef6adaeab289966..9f7b15335f1d022b9d229d31587d6c978a442a48 100644
--- a/src/core/ext/resolver/dns/c_ares/dns_resolver.c
+++ b/src/core/ext/resolver/dns/c_ares/dns_resolver.c
@@ -88,8 +88,6 @@ typedef struct {
   /** currently resolving addresses */
   grpc_resolved_addresses *addresses;
 
-  grpc_ares_request *request;
-
   grpc_polling_entity *pollent;
 } dns_resolver;
 
@@ -229,19 +227,25 @@ static void dns_next(grpc_exec_ctx *exec_ctx, grpc_resolver *resolver,
     gpr_log(GPR_ERROR, "dns_start_resolving_locked");
     GRPC_RESOLVER_REF(&r->base, "dns-resolving");
     GPR_ASSERT(!r->resolving);
+    r->resolving = 1;
+    r->addresses = NULL;
+    r->pollent = NULL;
+#ifdef GRPC_NATIVE_ADDRESS_RESOLVE
+    grpc_resolve_address(exec_ctx, r->name, r->default_port,
+                         grpc_closure_create(dns_on_resolved, r),
+                         &r->addresses);
+#else
     if (pollent) {
       r->pollent = pollent;
       grpc_polling_entity_add_to_pollset_set(exec_ctx, pollent,
                                              r->base.pollset_set);
     } else {
       gpr_log(GPR_ERROR, "pollent is NULL");
-      r->pollent = NULL;
     }
-    r->resolving = 1;
-    r->addresses = NULL;
-    r->request = grpc_resolve_address_ares(
+    grpc_resolve_address_ares(
         exec_ctx, r->name, r->default_port, r->base.pollset_set,
         grpc_closure_create(dns_on_resolved, r), &r->addresses);
+#endif
   } else {
     dns_maybe_finish_next_locked(exec_ctx, r);
   }
@@ -255,9 +259,14 @@ static void dns_start_resolving_locked(grpc_exec_ctx *exec_ctx,
   GPR_ASSERT(!r->resolving);
   r->resolving = 1;
   r->addresses = NULL;
-  r->request = grpc_resolve_address_ares(
+#ifdef GRPC_NATIVE_ADDRESS_RESOLVE
+  grpc_resolve_address(exec_ctx, r->name, r->default_port,
+                       grpc_closure_create(dns_on_resolved, r), &r->addresses);
+#else
+  grpc_resolve_address_ares(
       exec_ctx, r->name, r->default_port, r->base.pollset_set,
       grpc_closure_create(dns_on_resolved, r), &r->addresses);
+#endif
   // grpc_resolve_address(exec_ctx, r->name, r->default_port,
   //  grpc_closure_create(dns_on_resolved, r), &r->addresses);
 }
@@ -279,7 +288,9 @@ static void dns_maybe_finish_next_locked(grpc_exec_ctx *exec_ctx,
 static void dns_destroy(grpc_exec_ctx *exec_ctx, grpc_resolver *gr) {
   dns_resolver *r = (dns_resolver *)gr;
   gpr_mu_destroy(&r->mu);
+#ifndef GRPC_NATIVE_ADDRESS_RESOLVE
   grpc_ares_cleanup();
+#endif
   if (r->resolved_config) {
     grpc_client_config_unref(exec_ctx, r->resolved_config);
   }
@@ -294,7 +305,7 @@ static grpc_resolver *dns_create(grpc_resolver_args *args,
                                  const char *default_port,
                                  const char *lb_policy_name) {
   dns_resolver *r;
-  grpc_error *error;
+  grpc_error *error = GRPC_ERROR_NONE;
   const char *path = args->uri->path;
 
   if (0 != strcmp(args->uri->authority, "")) {
@@ -302,7 +313,9 @@ static grpc_resolver *dns_create(grpc_resolver_args *args,
     return NULL;
   }
 
+#ifndef GRPC_NATIVE_ADDRESS_RESOLVE
   error = grpc_ares_init();
+#endif
   if (error != GRPC_ERROR_NONE) {
     GRPC_LOG_IF_ERROR("ares_library_init() failed", error);
     return NULL;
diff --git a/src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver.h b/src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver.h
index 813d5aa6d7b48bc151946da5bef8736058f87b06..25ba5e59de7793b79424ce1b9a619fe413321410 100644
--- a/src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver.h
+++ b/src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver.h
@@ -34,6 +34,9 @@
 #ifndef GRPC_CORE_EXT_RESOLVER_DNS_C_ARES_GRPC_ARES_EV_DRIVER_H
 #define GRPC_CORE_EXT_RESOLVER_DNS_C_ARES_GRPC_ARES_EV_DRIVER_H
 
+#include <grpc/support/port_platform.h>
+#ifndef GRPC_NATIVE_ADDRESS_RESOLVE
+
 #include <ares.h>
 
 #include "src/core/lib/iomgr/exec_ctx.h"
@@ -51,4 +54,6 @@ grpc_error *grpc_ares_ev_driver_create(grpc_ares_ev_driver **ev_driver,
                                        grpc_pollset_set *pollset_set);
 void grpc_ares_ev_driver_destroy(grpc_ares_ev_driver *ev_driver);
 
+#endif /* GRPC_NATIVE_ADDRESS_RESOLVE */
+
 #endif /* GRPC_CORE_EXT_RESOLVER_DNS_C_ARES_GRPC_ARES_EV_DRIVER_H */
diff --git a/src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver_posix.c b/src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver_posix.c
index 3208956dcfa7fbe8eea676ae17914d61d85cdc52..b65974e1bbee44bed82b3240a78841bec22cd8c1 100644
--- a/src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver_posix.c
+++ b/src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver_posix.c
@@ -31,6 +31,7 @@
  *
  */
 #include <grpc/support/port_platform.h>
+#ifndef GRPC_NATIVE_ADDRESS_RESOLVE
 #ifdef GPR_POSIX_SOCKET
 
 #include "src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver.h"
@@ -200,4 +201,5 @@ void grpc_ares_notify_on_event(grpc_exec_ctx *exec_ctx,
   gpr_log(GPR_ERROR, "eof notify_on_event");
 }
 
-#endif
+#endif /* GPR_POSIX_SOCKET */
+#endif /* GRPC_NATIVE_ADDRESS_RESOLVE */
diff --git a/src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.c b/src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.c
index c1b487576aa217e3dea8c1a689f47b857a39f9bb..1898ec8b0b4f907d35d0e490d33633de7a1b1ef9 100644
--- a/src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.c
+++ b/src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.c
@@ -32,18 +32,10 @@
  */
 
 #include <grpc/support/port_platform.h>
-
-#ifdef GPR_POSIX_SOCKET
-#include <arpa/inet.h>
-#endif
-
-#ifdef GPR_WINSOCK_SOCKET
-#include <winsock2.h>
-#endif
+#ifndef GRPC_NATIVE_ADDRESS_RESOLVE
 
 #include "src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.h"
-// #include "src/core/lib/iomgr/ev_posix.h"
-// #include "src/core/lib/iomgr/sockaddr.h"
+#include "src/core/lib/iomgr/sockaddr.h"
 
 #include <string.h>
 #include <sys/types.h>
@@ -67,7 +59,7 @@
 static gpr_once g_basic_init = GPR_ONCE_INIT;
 static gpr_mu g_init_mu;
 
-struct grpc_ares_request {
+typedef struct grpc_ares_request {
   char *name;
   char *host;
   char *port;
@@ -79,7 +71,7 @@ struct grpc_ares_request {
   void *arg;
   int pending_quries;
   grpc_ares_ev_driver *ev_driver;
-};
+} grpc_ares_request;
 
 static void do_basic_init(void) { gpr_mu_init(&g_init_mu); }
 
@@ -237,10 +229,11 @@ static int try_fake_resolve(const char *name, const char *port,
   return 0;
 }
 
-grpc_ares_request *grpc_resolve_address_ares_impl(
-    grpc_exec_ctx *exec_ctx, const char *name, const char *default_port,
-    grpc_pollset_set *pollset_set, grpc_closure *on_done,
-    grpc_resolved_addresses **addrs) {
+void grpc_resolve_address_ares_impl(grpc_exec_ctx *exec_ctx, const char *name,
+                                    const char *default_port,
+                                    grpc_pollset_set *pollset_set,
+                                    grpc_closure *on_done,
+                                    grpc_resolved_addresses **addrs) {
   char *host;
   char *port;
   grpc_error *err;
@@ -250,7 +243,7 @@ grpc_ares_request *grpc_resolve_address_ares_impl(
   if ((err = grpc_customized_resolve_address(name, default_port, addrs)) !=
       GRPC_ERROR_CANCELLED) {
     grpc_exec_ctx_sched(exec_ctx, on_done, err, NULL);
-    return NULL;
+    return;
   }
 
   if (name[0] == 'u' && name[1] == 'n' && name[2] == 'i' && name[3] == 'x' &&
@@ -258,7 +251,7 @@ grpc_ares_request *grpc_resolve_address_ares_impl(
     grpc_exec_ctx_sched(exec_ctx, on_done,
                         grpc_resolve_unix_domain_address(name + 5, addrs),
                         NULL);
-    return NULL;
+    return;
   }
 
   /* parse name, splitting it into host and port parts */
@@ -284,7 +277,7 @@ grpc_ares_request *grpc_resolve_address_ares_impl(
     err = grpc_ares_ev_driver_create(&ev_driver, pollset_set);
     if (err != GRPC_ERROR_NONE) {
       grpc_exec_ctx_sched(exec_ctx, on_done, err, NULL);
-      return NULL;
+      return;
     }
     r = gpr_malloc(sizeof(grpc_ares_request));
     r->ev_driver = ev_driver;
@@ -302,10 +295,9 @@ grpc_ares_request *grpc_resolve_address_ares_impl(
 done:
   gpr_free(host);
   gpr_free(port);
-  return r;
 }
 
-grpc_ares_request *(*grpc_resolve_address_ares)(
+void (*grpc_resolve_address_ares)(
     grpc_exec_ctx *exec_ctx, const char *name, const char *default_port,
     grpc_pollset_set *pollset_set, grpc_closure *on_done,
     grpc_resolved_addresses **addrs) = grpc_resolve_address_ares_impl;
@@ -327,3 +319,5 @@ void grpc_ares_cleanup(void) {
   ares_library_cleanup();
   gpr_mu_unlock(&g_init_mu);
 }
+
+#endif /* GRPC_NATIVE_ADDRESS_RESOLVE */
diff --git a/src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.h b/src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.h
index 5ff324e2b969abd548e079ab43a799a60b3ec648..753eb12b96b1c124ffbe1e89533fe160acb34b2c 100644
--- a/src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.h
+++ b/src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.h
@@ -34,21 +34,28 @@
 #ifndef GRPC_CORE_EXT_RESOLVER_DNS_C_ARES_GRPC_ARES_WRAPPER_H
 #define GRPC_CORE_EXT_RESOLVER_DNS_C_ARES_GRPC_ARES_WRAPPER_H
 
+#include <grpc/support/port_platform.h>
+#ifndef GRPC_NATIVE_ADDRESS_RESOLVE
+
 #include <stddef.h>
 #include "src/core/lib/iomgr/exec_ctx.h"
 #include "src/core/lib/iomgr/iomgr.h"
 #include "src/core/lib/iomgr/polling_entity.h"
 #include "src/core/lib/iomgr/resolve_address.h"
 
-typedef struct grpc_ares_request grpc_ares_request;
+// typedef struct grpc_ares_request grpc_ares_request;
 
-extern grpc_ares_request *(*grpc_resolve_address_ares)(
-    grpc_exec_ctx *exec_ctx, const char *addr, const char *default_port,
-    grpc_pollset_set *pollset_set, grpc_closure *on_done,
-    grpc_resolved_addresses **addresses);
+extern void (*grpc_resolve_address_ares)(grpc_exec_ctx *exec_ctx,
+                                         const char *addr,
+                                         const char *default_port,
+                                         grpc_pollset_set *pollset_set,
+                                         grpc_closure *on_done,
+                                         grpc_resolved_addresses **addresses);
 
 grpc_error *grpc_ares_init(void);
 
 void grpc_ares_cleanup(void);
 
+#endif /* GRPC_NATIVE_ADDRESS_RESOLVE */
+
 #endif /* GRPC_CORE_EXT_RESOLVER_DNS_C_ARES_GRPC_ARES_WRAPPER_H */
diff --git a/templates/package.json.template b/templates/package.json.template
index 6891e163174f9e49ad8488a4785b8e3811ae1662..d0150f6bf802aaf74ff2f197b0c21363715693b4 100644
--- a/templates/package.json.template
+++ b/templates/package.json.template
@@ -25,7 +25,7 @@
       "test": "./node_modules/.bin/mocha src/node/test && npm run-script lint",
       "gen_docs": "./node_modules/.bin/jsdoc -c src/node/jsdoc_conf.json",
       "coverage": "./node_modules/.bin/istanbul cover ./node_modules/.bin/_mocha src/node/test",
-      "install": "./node_modules/.bin/node-pre-gyp install --fallback-to-build --library='static_library'"
+      "install": "./node_modules/.bin/node-pre-gyp install --fallback-to-build --library=static_library"
     },
     "bundledDependencies": ["node-pre-gyp"],
     "dependencies": {
diff --git a/test/core/end2end/fuzzers/api_fuzzer.c b/test/core/end2end/fuzzers/api_fuzzer.c
index 5231105c5420f03f770da5572a5dccb7d84c978d..a7f4ca55b044bbb11370bb276950014b114cb5ff 100644
--- a/test/core/end2end/fuzzers/api_fuzzer.c
+++ b/test/core/end2end/fuzzers/api_fuzzer.c
@@ -226,12 +226,12 @@ void my_resolve_address(grpc_exec_ctx *exec_ctx, const char *addr,
                   finish_resolve, r, gpr_now(GPR_CLOCK_MONOTONIC));
 }
 
-grpc_ares_request *my_resolve_address_async(
-    grpc_exec_ctx *exec_ctx, const char *addr, const char *default_port,
-    grpc_pollset_set *pollset_set, grpc_closure *on_done,
-    grpc_resolved_addresses **addresses) {
+void my_resolve_address_async(grpc_exec_ctx *exec_ctx, const char *addr,
+                              const char *default_port,
+                              grpc_pollset_set *pollset_set,
+                              grpc_closure *on_done,
+                              grpc_resolved_addresses **addresses) {
   my_resolve_address(exec_ctx, addr, default_port, on_done, addresses);
-  return NULL;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -516,7 +516,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
   if (squelch) gpr_set_log_function(dont_log);
   input_stream inp = {data, data + size};
   grpc_resolve_address = my_resolve_address;
+#ifndef GRPC_NATIVE_ADDRESS_RESOLVE
   grpc_resolve_address_ares = my_resolve_address_async;
+#endif
   grpc_tcp_client_connect_impl = my_tcp_client_connect;
   gpr_now_impl = now_impl;
   grpc_init();
diff --git a/tools/run_tests/sources_and_headers.json b/tools/run_tests/sources_and_headers.json
index a1ab743c69c4dbd66027c42daaf0613242dd8a31..4103ff7b92e828f41d2c328ce962ed0df25029fa 100644
--- a/tools/run_tests/sources_and_headers.json
+++ b/tools/run_tests/sources_and_headers.json
@@ -5409,7 +5409,7 @@
       "third_party/c-ares/ares_strdup.h", 
       "third_party/c-ares/ares_version.h", 
       "third_party/c-ares/bitncmp.h", 
-      "third_party/c-ares/selectbridge.h", 
+      "third_party/c-ares/config-win32.h", 
       "third_party/c-ares/setup_once.h"
     ], 
     "language": "c", 
diff --git a/vsprojects/vcxproj/ares/ares.vcxproj b/vsprojects/vcxproj/ares/ares.vcxproj
index d6ad8edf28ff1b335afc9fbaa8baa0ad3894da05..3a0b1796840da391a88efbe953180bf2054a191c 100644
--- a/vsprojects/vcxproj/ares/ares.vcxproj
+++ b/vsprojects/vcxproj/ares/ares.vcxproj
@@ -166,7 +166,7 @@
     <ClInclude Include="$(SolutionDir)\..\third_party\c-ares\ares_strdup.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\c-ares\ares_version.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\c-ares\bitncmp.h" />
-    <ClInclude Include="$(SolutionDir)\..\third_party\c-ares\selectbridge.h" />
+    <ClInclude Include="$(SolutionDir)\..\third_party\c-ares\config-win32.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\c-ares\setup_once.h" />
     <ClInclude Include="$(SolutionDir)\..\src\c-ares\ares_build.h" />
     <ClInclude Include="$(SolutionDir)\..\src\c-ares\config_linux\ares_config.h" />
diff --git a/vsprojects/vcxproj/ares/ares.vcxproj.filters b/vsprojects/vcxproj/ares/ares.vcxproj.filters
index e935e211feaf9361e2da1b09409ff08854987464..47378f17ce8d8e5ea9393ad0f41d9bd72a79429d 100644
--- a/vsprojects/vcxproj/ares/ares.vcxproj.filters
+++ b/vsprojects/vcxproj/ares/ares.vcxproj.filters
@@ -207,7 +207,7 @@
     <ClInclude Include="$(SolutionDir)\..\third_party\c-ares\bitncmp.h">
       <Filter>third_party\c-ares</Filter>
     </ClInclude>
-    <ClInclude Include="$(SolutionDir)\..\third_party\c-ares\selectbridge.h">
+    <ClInclude Include="$(SolutionDir)\..\third_party\c-ares\config-win32.h">
       <Filter>third_party\c-ares</Filter>
     </ClInclude>
     <ClInclude Include="$(SolutionDir)\..\third_party\c-ares\setup_once.h">