diff --git a/src/core/iomgr/exec_ctx.c b/src/core/iomgr/exec_ctx.c
index fe8c48a94b0daf6bef9534ff9dce15714e42f74a..74aad6cea3b4f7ed40d0d563cf32b615dba9570f 100644
--- a/src/core/iomgr/exec_ctx.c
+++ b/src/core/iomgr/exec_ctx.c
@@ -35,8 +35,8 @@
 
 void grpc_exec_ctx_flush(grpc_exec_ctx *exec_ctx) {
   while (!grpc_closure_list_empty(exec_ctx->closure_list)) {
-    grpc_closure *c = closure_list->head;
-    closure_list->head = closure_list->tail = NULL;
+    grpc_closure *c = exec_ctx->closure_list.head;
+    exec_ctx->closure_list.head = exec_ctx->closure_list.tail = NULL;
     while (c != NULL) {
       grpc_closure *next = c->next;
       c->cb(exec_ctx, c->cb_arg, c->success);
diff --git a/test/core/channel/channel_stack_test.c b/test/core/channel/channel_stack_test.c
index 178fe2aa87e5f78985513ff5c4ebbd85d0384055..2939027891b8b4a1e6589523f9b207d81ee97fda 100644
--- a/test/core/channel/channel_stack_test.c
+++ b/test/core/channel/channel_stack_test.c
@@ -138,7 +138,7 @@ static void test_create_channel_stack(void) {
 
   grpc_mdctx_unref(metadata_context);
 
-  GPR_ASSERT(grpc_closure_list_empty(closure_list));
+  grpc_exec_ctx_finish(&exec_ctx);
 }
 
 int main(int argc, char **argv) {
diff --git a/test/core/httpcli/httpcli_test.c b/test/core/httpcli/httpcli_test.c
index d3a2f40bd031b125736a2f718a2f07280d18761e..4012f995c7b0c8bc47d619e32c315d0428d82384 100644
--- a/test/core/httpcli/httpcli_test.c
+++ b/test/core/httpcli/httpcli_test.c
@@ -85,13 +85,13 @@ static void test_get(int use_ssl, int port) {
   req.path = "/get";
   req.handshaker = use_ssl ? &grpc_httpcli_ssl : &grpc_httpcli_plaintext;
 
-  grpc_httpcli_get(&g_context, &g_pollset, &req, n_seconds_time(15), on_finish,
-                   (&exec_ctx, void *)42);
+  grpc_httpcli_get(&exec_ctx, &g_context, &g_pollset, &req, n_seconds_time(15),
+                   on_finish, (void *)42);
   gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset));
   while (!g_done) {
     grpc_pollset_worker worker;
-    grpc_pollset_work(&g_pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC),
-                      n_seconds_time(&exec_ctx, 20));
+    grpc_pollset_work(&exec_ctx, &g_pollset, &worker,
+                      gpr_now(GPR_CLOCK_MONOTONIC), n_seconds_time(20));
     gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset));
     grpc_exec_ctx_finish(&exec_ctx);
     gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset));
@@ -116,13 +116,13 @@ static void test_post(int use_ssl, int port) {
   req.path = "/post";
   req.handshaker = use_ssl ? &grpc_httpcli_ssl : &grpc_httpcli_plaintext;
 
-  grpc_httpcli_post(&g_context, &g_pollset, &req, "hello", 5,
-                    n_seconds_time(15), on_finish, (&exec_ctx, void *)42);
+  grpc_httpcli_post(&exec_ctx, &g_context, &g_pollset, &req, "hello", 5,
+                    n_seconds_time(15), on_finish, (void *)42);
   gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset));
   while (!g_done) {
     grpc_pollset_worker worker;
-    grpc_pollset_work(&g_pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC),
-                      n_seconds_time(&exec_ctx, 20));
+    grpc_pollset_work(&exec_ctx, &g_pollset, &worker,
+                      gpr_now(GPR_CLOCK_MONOTONIC), n_seconds_time(20));
     gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset));
     grpc_exec_ctx_finish(&exec_ctx);
     gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset));
diff --git a/test/core/iomgr/fd_posix_test.c b/test/core/iomgr/fd_posix_test.c
index c3d57157ad0aa71621aafc06d51ad100ce47641c..f592f63ba94a3f6461f8ec0bf0e65eee758069ab 100644
--- a/test/core/iomgr/fd_posix_test.c
+++ b/test/core/iomgr/fd_posix_test.c
@@ -117,8 +117,8 @@ typedef struct {
 
 /* Called when an upload session can be safely shutdown.
    Close session FD and start to shutdown listen FD. */
-static void session_shutdown_cb(void *arg, /*session */
-                                int success, grpc_closure_list *closure_list) {
+static void session_shutdown_cb(grpc_exec_ctx *exec_ctx, void *arg, /*session */
+                                int success) {
   session *se = arg;
   server *sv = se->sv;
   grpc_fd_orphan(exec_ctx, se->em_fd, NULL, "a");
@@ -128,8 +128,8 @@ static void session_shutdown_cb(void *arg, /*session */
 }
 
 /* Called when data become readable in a session. */
-static void session_read_cb(void *arg, /*session */
-                            int success, grpc_closure_list *closure_list) {
+static void session_read_cb(grpc_exec_ctx *exec_ctx, void *arg, /*session */
+                            int success) {
   session *se = arg;
   int fd = se->em_fd->fd;
 
@@ -173,8 +173,8 @@ static void session_read_cb(void *arg, /*session */
 
 /* Called when the listen FD can be safely shutdown.
    Close listen FD and signal that server can be shutdown. */
-static void listen_shutdown_cb(void *arg /*server */, int success,
-                               grpc_closure_list *closure_list) {
+static void listen_shutdown_cb(grpc_exec_ctx *exec_ctx, void *arg /*server */,
+                               int success) {
   server *sv = arg;
 
   grpc_fd_orphan(exec_ctx, sv->em_fd, NULL, "b");
@@ -186,8 +186,8 @@ static void listen_shutdown_cb(void *arg /*server */, int success,
 }
 
 /* Called when a new TCP connection request arrives in the listening port. */
-static void listen_cb(void *arg, /*=sv_arg*/
-                      int success, grpc_closure_list *closure_list) {
+static void listen_cb(grpc_exec_ctx *exec_ctx, void *arg, /*=sv_arg*/
+                      int success) {
   server *sv = arg;
   int fd;
   int flags;
@@ -253,8 +253,9 @@ static void server_wait_and_shutdown(server *sv) {
   while (!sv->done) {
     grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
     grpc_pollset_worker worker;
-    grpc_pollset_work(&g_pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC),
-                      gpr_inf_future(&exec_ctx, GPR_CLOCK_MONOTONIC));
+    grpc_pollset_work(&exec_ctx, &g_pollset, &worker,
+                      gpr_now(GPR_CLOCK_MONOTONIC),
+                      gpr_inf_future(GPR_CLOCK_MONOTONIC));
     gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset));
     grpc_exec_ctx_finish(&exec_ctx);
     gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset));
@@ -290,8 +291,8 @@ static void client_init(client *cl) {
 }
 
 /* Called when a client upload session is ready to shutdown. */
-static void client_session_shutdown_cb(void *arg /*client */, int success,
-                                       grpc_closure_list *closure_list) {
+static void client_session_shutdown_cb(grpc_exec_ctx *exec_ctx,
+                                       void *arg /*client */, int success) {
   client *cl = arg;
   grpc_fd_orphan(exec_ctx, cl->em_fd, NULL, "c");
   cl->done = 1;
@@ -299,8 +300,8 @@ static void client_session_shutdown_cb(void *arg /*client */, int success,
 }
 
 /* Write as much as possible, then register notify_on_write. */
-static void client_session_write(void *arg, /*client */
-                                 int success, grpc_closure_list *closure_list) {
+static void client_session_write(grpc_exec_ctx *exec_ctx, void *arg, /*client */
+                                 int success) {
   client *cl = arg;
   int fd = cl->em_fd->fd;
   ssize_t write_once = 0;
@@ -367,8 +368,9 @@ static void client_wait_and_shutdown(client *cl) {
   while (!cl->done) {
     grpc_pollset_worker worker;
     grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-    grpc_pollset_work(&g_pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC),
-                      gpr_inf_future(&exec_ctx, GPR_CLOCK_MONOTONIC));
+    grpc_pollset_work(&exec_ctx, &g_pollset, &worker,
+                      gpr_now(GPR_CLOCK_MONOTONIC),
+                      gpr_inf_future(GPR_CLOCK_MONOTONIC));
     gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset));
     grpc_exec_ctx_finish(&exec_ctx);
     gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset));
@@ -404,8 +406,8 @@ void init_change_data(fd_change_data *fdc) { fdc->cb_that_ran = NULL; }
 
 void destroy_change_data(fd_change_data *fdc) {}
 
-static void first_read_callback(void *arg /* fd_change_data */, int success,
-                                grpc_closure_list *closure_list) {
+static void first_read_callback(grpc_exec_ctx *exec_ctx,
+                                void *arg /* fd_change_data */, int success) {
   fd_change_data *fdc = arg;
 
   gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset));
@@ -414,8 +416,8 @@ static void first_read_callback(void *arg /* fd_change_data */, int success,
   gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset));
 }
 
-static void second_read_callback(void *arg /* fd_change_data */, int success,
-                                 grpc_closure_list *closure_list) {
+static void second_read_callback(grpc_exec_ctx *exec_ctx,
+                                 void *arg /* fd_change_data */, int success) {
   fd_change_data *fdc = arg;
 
   gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset));
@@ -466,8 +468,9 @@ static void test_grpc_fd_change(void) {
   gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset));
   while (a.cb_that_ran == NULL) {
     grpc_pollset_worker worker;
-    grpc_pollset_work(&g_pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC),
-                      gpr_inf_future(&exec_ctx, GPR_CLOCK_MONOTONIC));
+    grpc_pollset_work(&exec_ctx, &g_pollset, &worker,
+                      gpr_now(GPR_CLOCK_MONOTONIC),
+                      gpr_inf_future(GPR_CLOCK_MONOTONIC));
     gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset));
     grpc_exec_ctx_finish(&exec_ctx);
     gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset));
@@ -489,8 +492,9 @@ static void test_grpc_fd_change(void) {
   gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset));
   while (b.cb_that_ran == NULL) {
     grpc_pollset_worker worker;
-    grpc_pollset_work(&g_pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC),
-                      gpr_inf_future(&exec_ctx, GPR_CLOCK_MONOTONIC));
+    grpc_pollset_work(&exec_ctx, &g_pollset, &worker,
+                      gpr_now(GPR_CLOCK_MONOTONIC),
+                      gpr_inf_future(GPR_CLOCK_MONOTONIC));
     gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset));
     grpc_exec_ctx_finish(&exec_ctx);
     gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset));
diff --git a/test/core/iomgr/tcp_client_posix_test.c b/test/core/iomgr/tcp_client_posix_test.c
index a7033f246b20f3bc4bf65a8937124e49706537e2..a61cccdb027ea49d910afebed461243a2b211886 100644
--- a/test/core/iomgr/tcp_client_posix_test.c
+++ b/test/core/iomgr/tcp_client_posix_test.c
@@ -105,9 +105,9 @@ void test_succeeds(void) {
   /* connect to it */
   GPR_ASSERT(getsockname(svr_fd, (struct sockaddr *)&addr, &addr_len) == 0);
   grpc_closure_init(&done, must_succeed, NULL);
-  grpc_tcp_client_connect(&done, &g_connecting, &g_pollset_set,
+  grpc_tcp_client_connect(&exec_ctx, &done, &g_connecting, &g_pollset_set,
                           (struct sockaddr *)&addr, addr_len,
-                          gpr_inf_future(&exec_ctx, GPR_CLOCK_REALTIME));
+                          gpr_inf_future(GPR_CLOCK_REALTIME));
 
   /* await the connection */
   do {
@@ -121,8 +121,9 @@ void test_succeeds(void) {
 
   while (g_connections_complete == connections_complete_before) {
     grpc_pollset_worker worker;
-    grpc_pollset_work(&g_pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC),
-                      GRPC_TIMEOUT_SECONDS_TO_DEADLINE(&exec_ctx, 5));
+    grpc_pollset_work(&exec_ctx, &g_pollset, &worker,
+                      gpr_now(GPR_CLOCK_MONOTONIC),
+                      GRPC_TIMEOUT_SECONDS_TO_DEADLINE(5));
     gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset));
     grpc_exec_ctx_finish(&exec_ctx);
     gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset));
@@ -149,17 +150,17 @@ void test_fails(void) {
 
   /* connect to a broken address */
   grpc_closure_init(&done, must_fail, NULL);
-  grpc_tcp_client_connect(&done, &g_connecting, &g_pollset_set,
+  grpc_tcp_client_connect(&exec_ctx, &done, &g_connecting, &g_pollset_set,
                           (struct sockaddr *)&addr, addr_len,
-                          gpr_inf_future(&exec_ctx, GPR_CLOCK_REALTIME));
+                          gpr_inf_future(GPR_CLOCK_REALTIME));
 
   gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset));
 
   /* wait for the connection callback to finish */
   while (g_connections_complete == connections_complete_before) {
     grpc_pollset_worker worker;
-    grpc_pollset_work(&g_pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC),
-                      test_deadline(&exec_ctx, ));
+    grpc_pollset_work(&exec_ctx, &g_pollset, &worker,
+                      gpr_now(GPR_CLOCK_MONOTONIC), test_deadline());
     gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset));
     grpc_exec_ctx_finish(&exec_ctx);
     gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset));
@@ -214,9 +215,8 @@ void test_times_out(void) {
   gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset));
 
   grpc_closure_init(&done, must_fail, NULL);
-  grpc_tcp_client_connect(&done, &g_connecting, &g_pollset_set,
-                          (&exec_ctx, struct sockaddr *)&addr, addr_len,
-                          connect_deadline);
+  grpc_tcp_client_connect(&exec_ctx, &done, &g_connecting, &g_pollset_set,
+                          (struct sockaddr *)&addr, addr_len, connect_deadline);
 
   /* Make sure the event doesn't trigger early */
   gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset));
@@ -242,8 +242,9 @@ void test_times_out(void) {
       GPR_ASSERT(g_connections_complete ==
                  connections_complete_before + is_after_deadline);
     }
-    grpc_pollset_work(&g_pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC),
-                      GRPC_TIMEOUT_MILLIS_TO_DEADLINE(&exec_ctx, 10));
+    grpc_pollset_work(&exec_ctx, &g_pollset, &worker,
+                      gpr_now(GPR_CLOCK_MONOTONIC),
+                      GRPC_TIMEOUT_MILLIS_TO_DEADLINE(10));
     gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset));
     grpc_exec_ctx_finish(&exec_ctx);
     gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset));
diff --git a/test/core/iomgr/tcp_posix_test.c b/test/core/iomgr/tcp_posix_test.c
index d2471c9668afc200a958d8c57794929e3b617933..f676454b7f79c5d4cddbcd56f83b5040d2309058 100644
--- a/test/core/iomgr/tcp_posix_test.c
+++ b/test/core/iomgr/tcp_posix_test.c
@@ -191,8 +191,8 @@ static void read_test(size_t num_bytes, size_t slice_size) {
   gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset));
   while (state.read_bytes < state.target_read_bytes) {
     grpc_pollset_worker worker;
-    grpc_pollset_work(&g_pollset, &worker,
-                      gpr_now(&exec_ctx, GPR_CLOCK_MONOTONIC), deadline);
+    grpc_pollset_work(&exec_ctx, &g_pollset, &worker,
+                      gpr_now(GPR_CLOCK_MONOTONIC), deadline);
     gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset));
     grpc_exec_ctx_finish(&exec_ctx);
     gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset));
@@ -237,8 +237,8 @@ static void large_read_test(size_t slice_size) {
   gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset));
   while (state.read_bytes < state.target_read_bytes) {
     grpc_pollset_worker worker;
-    grpc_pollset_work(&g_pollset, &worker,
-                      gpr_now(&exec_ctx, GPR_CLOCK_MONOTONIC), deadline);
+    grpc_pollset_work(&exec_ctx, &g_pollset, &worker,
+                      gpr_now(GPR_CLOCK_MONOTONIC), deadline);
     gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset));
     grpc_exec_ctx_finish(&exec_ctx);
     gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset));
@@ -279,8 +279,8 @@ static gpr_slice *allocate_blocks(size_t num_bytes, size_t slice_size,
   return slices;
 }
 
-static void write_done(void *user_data /* write_socket_state */, int success,
-                       grpc_closure_list *closure_list) {
+static void write_done(grpc_exec_ctx *exec_ctx,
+                       void *user_data /* write_socket_state */, int success) {
   struct write_socket_state *state = (struct write_socket_state *)user_data;
   gpr_log(GPR_INFO, "Write done callback called");
   gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset));
@@ -305,8 +305,9 @@ void drain_socket_blocking(int fd, size_t num_bytes, size_t read_size) {
   for (;;) {
     grpc_pollset_worker worker;
     gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset));
-    grpc_pollset_work(&g_pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC),
-                      GRPC_TIMEOUT_MILLIS_TO_DEADLINE(&exec_ctx, 10));
+    grpc_pollset_work(&exec_ctx, &g_pollset, &worker,
+                      gpr_now(GPR_CLOCK_MONOTONIC),
+                      GRPC_TIMEOUT_MILLIS_TO_DEADLINE(10));
     gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset));
     grpc_exec_ctx_finish(&exec_ctx);
     do {
@@ -368,8 +369,8 @@ static void write_test(size_t num_bytes, size_t slice_size) {
     if (state.write_done) {
       break;
     }
-    grpc_pollset_work(&g_pollset, &worker,
-                      gpr_now(&exec_ctx, GPR_CLOCK_MONOTONIC), deadline);
+    grpc_pollset_work(&exec_ctx, &g_pollset, &worker,
+                      gpr_now(GPR_CLOCK_MONOTONIC), deadline);
     gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset));
     grpc_exec_ctx_finish(&exec_ctx);
     gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset));
diff --git a/test/core/iomgr/tcp_server_posix_test.c b/test/core/iomgr/tcp_server_posix_test.c
index dd5fe7875ba6356c1ec95957cd6c5d8e9a737fd3..530381e37feee29ab55b0fd66cc60dc5be930ada 100644
--- a/test/core/iomgr/tcp_server_posix_test.c
+++ b/test/core/iomgr/tcp_server_posix_test.c
@@ -59,8 +59,10 @@ static void on_connect(grpc_exec_ctx *exec_ctx, void *arg, grpc_endpoint *tcp) {
 }
 
 static void test_no_op(void) {
+  grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_tcp_server *s = grpc_tcp_server_create();
-  grpc_tcp_server_destroy(s, NULL, NULL);
+  grpc_tcp_server_destroy(&exec_ctx, s, NULL);
+  grpc_exec_ctx_finish(&exec_ctx);
 }
 
 static void test_no_op_with_start(void) {
@@ -68,7 +70,7 @@ static void test_no_op_with_start(void) {
   grpc_tcp_server *s = grpc_tcp_server_create();
   LOG_TEST("test_no_op_with_start");
   grpc_tcp_server_start(&exec_ctx, s, NULL, 0, on_connect, NULL);
-  grpc_tcp_server_destroy(s, NULL, NULL);
+  grpc_tcp_server_destroy(&exec_ctx, s, NULL);
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
@@ -144,8 +146,8 @@ static void test_connect(int n) {
     while (g_nconnects == nconnects_before &&
            gpr_time_cmp(deadline, gpr_now(deadline.clock_type)) > 0) {
       grpc_pollset_worker worker;
-      grpc_pollset_work(&g_pollset, &worker,
-                        gpr_now(&exec_ctx, GPR_CLOCK_MONOTONIC), deadline);
+      grpc_pollset_work(&exec_ctx, &g_pollset, &worker,
+                        gpr_now(GPR_CLOCK_MONOTONIC), deadline);
       gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset));
       grpc_exec_ctx_finish(&exec_ctx);
       gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset));
diff --git a/test/core/iomgr/udp_server_test.c b/test/core/iomgr/udp_server_test.c
index 0f0cd98a603eca13231e0ba5dc33c482b2f704f1..d56500707c633bbdc0846f9baf96cf512c18585f 100644
--- a/test/core/iomgr/udp_server_test.c
+++ b/test/core/iomgr/udp_server_test.c
@@ -64,8 +64,10 @@ static void on_read(int fd) {
 }
 
 static void test_no_op(void) {
+  grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_udp_server *s = grpc_udp_server_create();
-  grpc_udp_server_destroy(s, NULL, NULL);
+  grpc_udp_server_destroy(&exec_ctx, s, NULL);
+  grpc_exec_ctx_finish(&exec_ctx);
 }
 
 static void test_no_op_with_start(void) {
@@ -73,11 +75,12 @@ static void test_no_op_with_start(void) {
   grpc_udp_server *s = grpc_udp_server_create();
   LOG_TEST("test_no_op_with_start");
   grpc_udp_server_start(&exec_ctx, s, NULL, 0);
-  grpc_udp_server_destroy(s, NULL, NULL);
+  grpc_udp_server_destroy(&exec_ctx, s, NULL);
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
 static void test_no_op_with_port(void) {
+  grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   struct sockaddr_in addr;
   grpc_udp_server *s = grpc_udp_server_create();
   LOG_TEST("test_no_op_with_port");
@@ -87,7 +90,8 @@ static void test_no_op_with_port(void) {
   GPR_ASSERT(grpc_udp_server_add_port(s, (struct sockaddr *)&addr, sizeof(addr),
                                       on_read));
 
-  grpc_udp_server_destroy(s, NULL, NULL);
+  grpc_udp_server_destroy(&exec_ctx, s, NULL);
+  grpc_exec_ctx_finish(&exec_ctx);
 }
 
 static void test_no_op_with_port_and_start(void) {
@@ -149,8 +153,8 @@ static void test_receive(int number_of_clients) {
     while (g_number_of_reads == number_of_reads_before &&
            gpr_time_cmp(deadline, gpr_now(deadline.clock_type)) > 0) {
       grpc_pollset_worker worker;
-      grpc_pollset_work(&g_pollset, &worker,
-                        gpr_now(&exec_ctx, GPR_CLOCK_MONOTONIC), deadline);
+      grpc_pollset_work(&exec_ctx, &g_pollset, &worker,
+                        gpr_now(GPR_CLOCK_MONOTONIC), deadline);
       gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset));
       grpc_exec_ctx_finish(&exec_ctx);
       gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset));
@@ -162,7 +166,8 @@ static void test_receive(int number_of_clients) {
 
   gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset));
 
-  grpc_udp_server_destroy(s, NULL, NULL);
+  grpc_udp_server_destroy(&exec_ctx, s, NULL);
+  grpc_exec_ctx_finish(&exec_ctx);
 }
 
 static void destroy_pollset(grpc_exec_ctx *exec_ctx, void *p, int success) {
diff --git a/test/core/iomgr/workqueue_test.c b/test/core/iomgr/workqueue_test.c
index a7394ae0511f20300ec6af63c9022a580a8289a4..90f7ba7a8346c2a16f8afbf79c0b5ea54bb7eb34 100644
--- a/test/core/iomgr/workqueue_test.c
+++ b/test/core/iomgr/workqueue_test.c
@@ -52,7 +52,7 @@ static void test_add_closure(void) {
   grpc_closure c;
   int done = 0;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_workqueue *wq = grpc_workqueue_create(&closure_list);
+  grpc_workqueue *wq = grpc_workqueue_create(&exec_ctx);
   gpr_timespec deadline = GRPC_TIMEOUT_SECONDS_TO_DEADLINE(5);
   grpc_pollset_worker worker;
   grpc_closure_init(&c, must_succeed, &done);
@@ -62,8 +62,8 @@ static void test_add_closure(void) {
 
   gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset));
   GPR_ASSERT(!done);
-  grpc_pollset_work(&g_pollset, &worker,
-                    gpr_now(&exec_ctx, deadline.clock_type), deadline);
+  grpc_pollset_work(&exec_ctx, &g_pollset, &worker,
+                    gpr_now(deadline.clock_type), deadline);
   gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset));
   grpc_exec_ctx_finish(&exec_ctx);
   GPR_ASSERT(done);
diff --git a/test/core/security/credentials_test.c b/test/core/security/credentials_test.c
index 7d19d5ae85bc212eee110ca7b3b3a1c110a7a70f..e660484fdfe48384f6326314117d1fa54ea7d360 100644
--- a/test/core/security/credentials_test.c
+++ b/test/core/security/credentials_test.c
@@ -554,16 +554,16 @@ static void test_compute_engine_creds_success(void) {
   grpc_httpcli_set_override(compute_engine_httpcli_get_success_override,
                             httpcli_post_should_not_be_called);
   grpc_credentials_get_request_metadata(
-      compute_engine_creds, NULL, test_service_url,
-      on_oauth2_creds_get_metadata_success, (&exec_ctx, void *)test_user_data);
-  grpc_exec_ctx_finish(&exec_ctx);
+      &exec_ctx, compute_engine_creds, NULL, test_service_url,
+      on_oauth2_creds_get_metadata_success, (void *)test_user_data);
+  grpc_exec_ctx_flush(&exec_ctx);
 
   /* Second request: the cached token should be served directly. */
   grpc_httpcli_set_override(httpcli_get_should_not_be_called,
                             httpcli_post_should_not_be_called);
   grpc_credentials_get_request_metadata(
-      compute_engine_creds, NULL, test_service_url,
-      on_oauth2_creds_get_metadata_success, (&exec_ctx, void *)test_user_data);
+      &exec_ctx, compute_engine_creds, NULL, test_service_url,
+      on_oauth2_creds_get_metadata_success, (void *)test_user_data);
   grpc_exec_ctx_finish(&exec_ctx);
 
   grpc_credentials_unref(compute_engine_creds);
@@ -579,8 +579,8 @@ static void test_compute_engine_creds_failure(void) {
   GPR_ASSERT(grpc_credentials_has_request_metadata(compute_engine_creds));
   GPR_ASSERT(grpc_credentials_has_request_metadata_only(compute_engine_creds));
   grpc_credentials_get_request_metadata(
-      compute_engine_creds, NULL, test_service_url,
-      on_oauth2_creds_get_metadata_failure, (&exec_ctx, void *)test_user_data);
+      &exec_ctx, compute_engine_creds, NULL, test_service_url,
+      on_oauth2_creds_get_metadata_failure, (void *)test_user_data);
   grpc_credentials_unref(compute_engine_creds);
   grpc_httpcli_set_override(NULL, NULL);
   grpc_exec_ctx_finish(&exec_ctx);
@@ -641,17 +641,17 @@ static void test_refresh_token_creds_success(void) {
   grpc_httpcli_set_override(httpcli_get_should_not_be_called,
                             refresh_token_httpcli_post_success);
   grpc_credentials_get_request_metadata(
-      refresh_token_creds, NULL, test_service_url,
-      on_oauth2_creds_get_metadata_success, (&exec_ctx, void *)test_user_data);
-  grpc_exec_ctx_finish(&exec_ctx);
+      &exec_ctx, refresh_token_creds, NULL, test_service_url,
+      on_oauth2_creds_get_metadata_success, (void *)test_user_data);
+  grpc_exec_ctx_flush(&exec_ctx);
 
   /* Second request: the cached token should be served directly. */
   grpc_httpcli_set_override(httpcli_get_should_not_be_called,
                             httpcli_post_should_not_be_called);
   grpc_credentials_get_request_metadata(
-      refresh_token_creds, NULL, test_service_url,
-      on_oauth2_creds_get_metadata_success, (&exec_ctx, void *)test_user_data);
-  grpc_exec_ctx_finish(&exec_ctx);
+      &exec_ctx, refresh_token_creds, NULL, test_service_url,
+      on_oauth2_creds_get_metadata_success, (void *)test_user_data);
+  grpc_exec_ctx_flush(&exec_ctx);
 
   grpc_credentials_unref(refresh_token_creds);
   grpc_httpcli_set_override(NULL, NULL);
@@ -668,8 +668,8 @@ static void test_refresh_token_creds_failure(void) {
   GPR_ASSERT(grpc_credentials_has_request_metadata(refresh_token_creds));
   GPR_ASSERT(grpc_credentials_has_request_metadata_only(refresh_token_creds));
   grpc_credentials_get_request_metadata(
-      refresh_token_creds, NULL, test_service_url,
-      on_oauth2_creds_get_metadata_failure, (&exec_ctx, void *)test_user_data);
+      &exec_ctx, refresh_token_creds, NULL, test_service_url,
+      on_oauth2_creds_get_metadata_failure, (void *)test_user_data);
   grpc_credentials_unref(refresh_token_creds);
   grpc_httpcli_set_override(NULL, NULL);
   grpc_exec_ctx_finish(&exec_ctx);
@@ -758,26 +758,26 @@ static void test_jwt_creds_success(void) {
 
   /* First request: jwt_encode_and_sign should be called. */
   grpc_jwt_encode_and_sign_set_override(encode_and_sign_jwt_success);
-  grpc_credentials_get_request_metadata(jwt_creds, NULL, test_service_url,
-                                        on_jwt_creds_get_metadata_success,
-                                        (&exec_ctx, void *)test_user_data);
-  grpc_exec_ctx_finish(&exec_ctx);
+  grpc_credentials_get_request_metadata(
+      &exec_ctx, jwt_creds, NULL, test_service_url,
+      on_jwt_creds_get_metadata_success, (void *)test_user_data);
+  grpc_exec_ctx_flush(&exec_ctx);
 
   /* Second request: the cached token should be served directly. */
   grpc_jwt_encode_and_sign_set_override(
       encode_and_sign_jwt_should_not_be_called);
-  grpc_credentials_get_request_metadata(jwt_creds, NULL, test_service_url,
-                                        on_jwt_creds_get_metadata_success,
-                                        (&exec_ctx, void *)test_user_data);
-  grpc_exec_ctx_finish(&exec_ctx);
+  grpc_credentials_get_request_metadata(
+      &exec_ctx, jwt_creds, NULL, test_service_url,
+      on_jwt_creds_get_metadata_success, (void *)test_user_data);
+  grpc_exec_ctx_flush(&exec_ctx);
 
   /* Third request: Different service url so jwt_encode_and_sign should be
      called again (no caching). */
   grpc_jwt_encode_and_sign_set_override(encode_and_sign_jwt_success);
-  grpc_credentials_get_request_metadata(jwt_creds, NULL, other_test_service_url,
-                                        on_jwt_creds_get_metadata_success,
-                                        (&exec_ctx, void *)test_user_data);
-  grpc_exec_ctx_finish(&exec_ctx);
+  grpc_credentials_get_request_metadata(
+      &exec_ctx, jwt_creds, NULL, other_test_service_url,
+      on_jwt_creds_get_metadata_success, (void *)test_user_data);
+  grpc_exec_ctx_flush(&exec_ctx);
 
   gpr_free(json_key_string);
   grpc_credentials_unref(jwt_creds);
@@ -794,9 +794,9 @@ static void test_jwt_creds_signing_failure(void) {
   GPR_ASSERT(grpc_credentials_has_request_metadata_only(jwt_creds));
 
   grpc_jwt_encode_and_sign_set_override(encode_and_sign_jwt_failure);
-  grpc_credentials_get_request_metadata(jwt_creds, NULL, test_service_url,
-                                        on_jwt_creds_get_metadata_failure,
-                                        (&exec_ctx, void *)test_user_data);
+  grpc_credentials_get_request_metadata(
+      &exec_ctx, jwt_creds, NULL, test_service_url,
+      on_jwt_creds_get_metadata_failure, (void *)test_user_data);
 
   gpr_free(json_key_string);
   grpc_credentials_unref(jwt_creds);
diff --git a/test/core/security/jwt_verifier_test.c b/test/core/security/jwt_verifier_test.c
index 6b24972b4e7cec3fb47e24a96483dfc066e91669..9c526a7b5d56dd654fa72344a99bf6943914e043 100644
--- a/test/core/security/jwt_verifier_test.c
+++ b/test/core/security/jwt_verifier_test.c
@@ -321,9 +321,8 @@ static void test_jwt_verifier_google_email_issuer_success(void) {
                                  NULL);
   grpc_auth_json_key_destruct(&key);
   GPR_ASSERT(jwt != NULL);
-  grpc_jwt_verifier_verify(verifier, NULL, jwt, expected_audience,
-                           on_verification_success,
-                           (&exec_ctx, void *)expected_user_data);
+  grpc_jwt_verifier_verify(&exec_ctx, verifier, NULL, jwt, expected_audience,
+                           on_verification_success, (void *)expected_user_data);
   gpr_free(jwt);
   grpc_jwt_verifier_destroy(verifier);
   grpc_httpcli_set_override(NULL, NULL);
@@ -357,9 +356,8 @@ static void test_jwt_verifier_custom_email_issuer_success(void) {
                                  NULL);
   grpc_auth_json_key_destruct(&key);
   GPR_ASSERT(jwt != NULL);
-  grpc_jwt_verifier_verify(verifier, NULL, jwt, expected_audience,
-                           on_verification_success,
-                           (&exec_ctx, void *)expected_user_data);
+  grpc_jwt_verifier_verify(&exec_ctx, verifier, NULL, jwt, expected_audience,
+                           on_verification_success, (void *)expected_user_data);
   gpr_free(jwt);
   grpc_jwt_verifier_destroy(verifier);
   grpc_httpcli_set_override(NULL, NULL);
@@ -411,9 +409,8 @@ static void test_jwt_verifier_url_issuer_success(void) {
                                  NULL);
   grpc_auth_json_key_destruct(&key);
   GPR_ASSERT(jwt != NULL);
-  grpc_jwt_verifier_verify(verifier, NULL, jwt, expected_audience,
-                           on_verification_success,
-                           (&exec_ctx, void *)expected_user_data);
+  grpc_jwt_verifier_verify(&exec_ctx, verifier, NULL, jwt, expected_audience,
+                           on_verification_success, (void *)expected_user_data);
   gpr_free(jwt);
   grpc_jwt_verifier_destroy(verifier);
   grpc_httpcli_set_override(NULL, NULL);
@@ -455,9 +452,9 @@ static void test_jwt_verifier_url_issuer_bad_config(void) {
                                  NULL);
   grpc_auth_json_key_destruct(&key);
   GPR_ASSERT(jwt != NULL);
-  grpc_jwt_verifier_verify(verifier, NULL, jwt, expected_audience,
+  grpc_jwt_verifier_verify(&exec_ctx, verifier, NULL, jwt, expected_audience,
                            on_verification_key_retrieval_error,
-                           (&exec_ctx, void *)expected_user_data);
+                           (void *)expected_user_data);
   gpr_free(jwt);
   grpc_jwt_verifier_destroy(verifier);
   grpc_httpcli_set_override(NULL, NULL);
@@ -478,9 +475,9 @@ static void test_jwt_verifier_bad_json_key(void) {
                                  NULL);
   grpc_auth_json_key_destruct(&key);
   GPR_ASSERT(jwt != NULL);
-  grpc_jwt_verifier_verify(verifier, NULL, jwt, expected_audience,
+  grpc_jwt_verifier_verify(&exec_ctx, verifier, NULL, jwt, expected_audience,
                            on_verification_key_retrieval_error,
-                           (&exec_ctx, void *)expected_user_data);
+                           (void *)expected_user_data);
   gpr_free(jwt);
   grpc_jwt_verifier_destroy(verifier);
   grpc_httpcli_set_override(NULL, NULL);
@@ -527,9 +524,9 @@ static void test_jwt_verifier_bad_signature(void) {
   grpc_auth_json_key_destruct(&key);
   corrupt_jwt_sig(jwt);
   GPR_ASSERT(jwt != NULL);
-  grpc_jwt_verifier_verify(verifier, NULL, jwt, expected_audience,
+  grpc_jwt_verifier_verify(&exec_ctx, verifier, NULL, jwt, expected_audience,
                            on_verification_bad_signature,
-                           (&exec_ctx, void *)expected_user_data);
+                           (void *)expected_user_data);
   gpr_free(jwt);
   grpc_jwt_verifier_destroy(verifier);
   grpc_httpcli_set_override(NULL, NULL);
@@ -557,9 +554,9 @@ static void test_jwt_verifier_bad_format(void) {
   grpc_jwt_verifier *verifier = grpc_jwt_verifier_create(NULL, 0);
   grpc_httpcli_set_override(httpcli_get_should_not_be_called,
                             httpcli_post_should_not_be_called);
-  grpc_jwt_verifier_verify(verifier, NULL, "bad jwt", expected_audience,
-                           on_verification_bad_format,
-                           (&exec_ctx, void *)expected_user_data);
+  grpc_jwt_verifier_verify(&exec_ctx, verifier, NULL, "bad jwt",
+                           expected_audience, on_verification_bad_format,
+                           (void *)expected_user_data);
   grpc_jwt_verifier_destroy(verifier);
   grpc_httpcli_set_override(NULL, NULL);
   grpc_exec_ctx_finish(&exec_ctx);
diff --git a/test/core/security/print_google_default_creds_token.c b/test/core/security/print_google_default_creds_token.c
index 1e4c1f672020948a02dc2314bea826b1c4d4e1ea..f207e0579473e919014bd59d3bb4598339981249 100644
--- a/test/core/security/print_google_default_creds_token.c
+++ b/test/core/security/print_google_default_creds_token.c
@@ -98,8 +98,9 @@ int main(int argc, char **argv) {
   gpr_mu_lock(GRPC_POLLSET_MU(&sync.pollset));
   while (!sync.is_done) {
     grpc_pollset_worker worker;
-    grpc_pollset_work(&sync.pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC),
-                      gpr_inf_future(&exec_ctx, GPR_CLOCK_MONOTONIC));
+    grpc_pollset_work(&exec_ctx, &sync.pollset, &worker,
+                      gpr_now(GPR_CLOCK_MONOTONIC),
+                      gpr_inf_future(GPR_CLOCK_MONOTONIC));
     gpr_mu_unlock(GRPC_POLLSET_MU(&sync.pollset));
     grpc_exec_ctx_finish(&exec_ctx);
     gpr_mu_lock(GRPC_POLLSET_MU(&sync.pollset));
diff --git a/test/core/security/verify_jwt.c b/test/core/security/verify_jwt.c
index 7750afd426b80ba0e8e69ff005bac9a8315a7287..378a37f26c5e0a692fe562a2a405a4a60ca068c4 100644
--- a/test/core/security/verify_jwt.c
+++ b/test/core/security/verify_jwt.c
@@ -112,8 +112,9 @@ int main(int argc, char **argv) {
   gpr_mu_lock(GRPC_POLLSET_MU(&sync.pollset));
   while (!sync.is_done) {
     grpc_pollset_worker worker;
-    grpc_pollset_work(&sync.pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC),
-                      gpr_inf_future(&exec_ctx, GPR_CLOCK_MONOTONIC));
+    grpc_pollset_work(&exec_ctx, &sync.pollset, &worker,
+                      gpr_now(GPR_CLOCK_MONOTONIC),
+                      gpr_inf_future(GPR_CLOCK_MONOTONIC));
     gpr_mu_unlock(GRPC_POLLSET_MU(&sync.pollset));
     grpc_exec_ctx_finish(&exec_ctx);
     gpr_mu_lock(GRPC_POLLSET_MU(&sync.pollset));
diff --git a/test/core/surface/completion_queue_test.c b/test/core/surface/completion_queue_test.c
index 3209bc5bdf3126521f94ec4339086990830b058b..e3fc7897884b7b8cf8dffb6825405439a85bf16d 100644
--- a/test/core/surface/completion_queue_test.c
+++ b/test/core/surface/completion_queue_test.c
@@ -99,7 +99,7 @@ static void test_cq_end_op(void) {
   GPR_ASSERT(ev.success);
 
   shutdown_and_destroy(cc);
-  GPR_ASSERT(grpc_closure_list_empty(closure_list));
+  grpc_exec_ctx_finish(&exec_ctx);
 }
 
 static void test_shutdown_then_next_polling(void) {
@@ -172,7 +172,7 @@ static void test_pluck(void) {
   }
 
   shutdown_and_destroy(cc);
-  GPR_ASSERT(grpc_closure_list_empty(closure_list));
+  grpc_exec_ctx_finish(&exec_ctx);
 }
 
 #define TEST_THREAD_EVENTS 10000
@@ -217,15 +217,16 @@ static void producer_thread(void *arg) {
 
   gpr_log(GPR_INFO, "producer %d phase 2", opt->id);
   for (i = 0; i < TEST_THREAD_EVENTS; i++) {
-    grpc_cq_end_op(opt->cc, (void *)(gpr_intptr)1, 1, free_completion, NULL,
-                   gpr_malloc(sizeof(&exec_ctx, grpc_cq_completion)));
+    grpc_cq_end_op(&exec_ctx, opt->cc, (void *)(gpr_intptr)1, 1,
+                   free_completion, NULL,
+                   gpr_malloc(sizeof(grpc_cq_completion)));
     opt->events_triggered++;
     grpc_exec_ctx_finish(&exec_ctx);
   }
 
   gpr_log(GPR_INFO, "producer %d phase 2 done", opt->id);
   gpr_event_set(&opt->on_finished, (void *)(gpr_intptr)1);
-  GPR_ASSERT(grpc_closure_list_empty(closure_list));
+  grpc_exec_ctx_finish(&exec_ctx);
 }
 
 static void consumer_thread(void *arg) {