diff --git a/src/core/lib/iomgr/resolve_address.h b/src/core/lib/iomgr/resolve_address.h
index ddbe37575556ccdbf972538a4e582df5331cc59c..7a770662ccf17b0e63bd5b906fcf236ef5c6d988 100644
--- a/src/core/lib/iomgr/resolve_address.h
+++ b/src/core/lib/iomgr/resolve_address.h
@@ -66,4 +66,11 @@ extern grpc_error *(*grpc_blocking_resolve_address)(
     const char *name, const char *default_port,
     grpc_resolved_addresses **addresses);
 
+/* Returns GRPC_ERROR_CANCELLED by default. If it's overriden and returns
+   error other than GRPC_ERROR_CANCELLED, grpc_resolve_address will use its
+   result. Result must be freed with grpc_resolved_addresses_destroy. */
+extern grpc_error *(*grpc_customized_resolve_address)(
+    const char *name, const char *default_port,
+    grpc_resolved_addresses **addresses);
+
 #endif /* GRPC_CORE_LIB_IOMGR_RESOLVE_ADDRESS_H */
diff --git a/src/core/lib/iomgr/resolve_address_posix.c b/src/core/lib/iomgr/resolve_address_posix.c
index 4e9f978584a3b20e8e033c4f623ab94dfdd2d82d..4012dcc61ff5d6434f2baaec8a8af0b51eedd23e 100644
--- a/src/core/lib/iomgr/resolve_address_posix.c
+++ b/src/core/lib/iomgr/resolve_address_posix.c
@@ -149,6 +149,17 @@ grpc_error *(*grpc_blocking_resolve_address)(
     const char *name, const char *default_port,
     grpc_resolved_addresses **addresses) = blocking_resolve_address_impl;
 
+static grpc_error *default_customized_resolve_address_impl(
+    const char *name, const char *default_port,
+    grpc_resolved_addresses **addresses) {
+  return GRPC_ERROR_CANCELLED;
+}
+
+grpc_error *(*grpc_customized_resolve_address)(
+    const char *name, const char *default_port,
+    grpc_resolved_addresses **addresses) =
+    default_customized_resolve_address_impl;
+
 typedef struct {
   char *name;
   char *default_port;
@@ -183,7 +194,16 @@ static void resolve_address_impl(grpc_exec_ctx *exec_ctx, const char *name,
                                  const char *default_port,
                                  grpc_closure *on_done,
                                  grpc_resolved_addresses **addrs) {
-  request *r = gpr_malloc(sizeof(request));
+  request *r;
+  grpc_error *err;
+
+  if ((err = grpc_customized_resolve_address(name, default_port, addrs)) !=
+      GRPC_ERROR_CANCELLED) {
+    grpc_exec_ctx_sched(exec_ctx, on_done, err, NULL);
+    return;
+  }
+
+  r = gpr_malloc(sizeof(request));
   grpc_closure_init(&r->request_closure, do_request_thread, r);
   r->name = gpr_strdup(name);
   r->default_port = gpr_strdup(default_port);
diff --git a/src/core/lib/iomgr/resolve_address_windows.c b/src/core/lib/iomgr/resolve_address_windows.c
index 2af8af82dcb78ede7c1fe7e428beb41c2ed2e118..e28eaac49237347e9b31c1258f94609f73e2734a 100644
--- a/src/core/lib/iomgr/resolve_address_windows.c
+++ b/src/core/lib/iomgr/resolve_address_windows.c
@@ -143,6 +143,17 @@ grpc_error *(*grpc_blocking_resolve_address)(
     const char *name, const char *default_port,
     grpc_resolved_addresses **addresses) = blocking_resolve_address_impl;
 
+static grpc_error *default_customized_resolve_address_impl(
+    const char *name, const char *default_port,
+    grpc_resolved_addresses **addresses) {
+  return GRPC_ERROR_CANCELLED;
+}
+
+grpc_error *(*grpc_customized_resolve_address)(
+    const char *name, const char *default_port,
+    grpc_resolved_addresses **addresses) =
+    default_customized_resolve_address_impl;
+
 /* Callback to be passed to grpc_executor to asynch-ify
  * grpc_blocking_resolve_address */
 static void do_request_thread(grpc_exec_ctx *exec_ctx, void *rp,
@@ -171,7 +182,16 @@ static void resolve_address_impl(grpc_exec_ctx *exec_ctx, const char *name,
                                  const char *default_port,
                                  grpc_closure *on_done,
                                  grpc_resolved_addresses **addresses) {
-  request *r = gpr_malloc(sizeof(request));
+  request *r;
+  grpc_error *err;
+
+  if ((err = grpc_customized_resolve_address(name, default_port, addrs)) !=
+      GRPC_ERROR_CANCELLED) {
+    grpc_exec_ctx_sched(exec_ctx, on_done, err, NULL);
+    return;
+  }
+
+  r = gpr_malloc(sizeof(request));
   grpc_closure_init(&r->request_closure, do_request_thread, r);
   r->name = gpr_strdup(name);
   r->default_port = gpr_strdup(default_port);
diff --git a/test/core/client_config/resolvers/dns_resolver_connectivity_test.c b/test/core/client_config/resolvers/dns_resolver_connectivity_test.c
index 11e6a89cda5ba98d5e08c233510b73b5f37838f5..6002b0b7bb7c57a785abfa1b0837fcc1c9fdbfb8 100644
--- a/test/core/client_config/resolvers/dns_resolver_connectivity_test.c
+++ b/test/core/client_config/resolvers/dns_resolver_connectivity_test.c
@@ -123,7 +123,7 @@ int main(int argc, char **argv) {
 
   grpc_init();
   gpr_mu_init(&g_mu);
-  grpc_blocking_resolve_address = my_resolve_address;
+  grpc_customized_resolve_address = my_resolve_address;
 
   grpc_resolver *resolver = create_resolver("dns:test");
 
diff --git a/test/core/end2end/goaway_server_test.c b/test/core/end2end/goaway_server_test.c
index 67cc24c74c54b8c77d8617c57f997e6b6a7208fb..ed8cc3dd68eb106bbfd9c05f4494130d0efcc66c 100644
--- a/test/core/end2end/goaway_server_test.c
+++ b/test/core/end2end/goaway_server_test.c
@@ -46,9 +46,6 @@ static void *tag(intptr_t i) { return (void *)i; }
 
 static gpr_mu g_mu;
 static int g_resolve_port = -1;
-static grpc_error *(*iomgr_resolve_address)(const char *name,
-                                            const char *default_port,
-                                            grpc_resolved_addresses **addrs);
 
 static void set_resolve_port(int port) {
   gpr_mu_lock(&g_mu);
@@ -59,7 +56,7 @@ static void set_resolve_port(int port) {
 static grpc_error *my_resolve_address(const char *name, const char *addr,
                                       grpc_resolved_addresses **addrs) {
   if (0 != strcmp(name, "test")) {
-    return iomgr_resolve_address(name, addr, addrs);
+    return GRPC_ERROR_CANCELLED;
   }
 
   gpr_mu_lock(&g_mu);
@@ -90,8 +87,7 @@ int main(int argc, char **argv) {
   grpc_test_init(argc, argv);
 
   gpr_mu_init(&g_mu);
-  iomgr_resolve_address = grpc_blocking_resolve_address;
-  grpc_blocking_resolve_address = my_resolve_address;
+  grpc_customized_resolve_address = my_resolve_address;
   grpc_init();
 
   int was_cancelled1;