diff --git a/.gitignore b/.gitignore
index 18b42811b280f41afda7aaf51de05f0cd219e1c1..bfbc3934649057244dec7384e2f6b68605f95358 100644
--- a/.gitignore
+++ b/.gitignore
@@ -37,10 +37,11 @@ cache.mk
 
 # Temporary test reports
 report.xml
+latency_trace.txt
 
 # port server log
 portlog.txt
 
 # gyp generated make files
 *-gyp.mk
-out
\ No newline at end of file
+out
diff --git a/src/node/.istanbul.yml b/.istanbul.yml
similarity index 100%
rename from src/node/.istanbul.yml
rename to .istanbul.yml
diff --git a/BUILD b/BUILD
index e1734a1edf85b939c5290b08ef8c35c37201b02d..47a5e9bb8ed7ab6f5301d96e7d86afa53bca7c31 100644
--- a/BUILD
+++ b/BUILD
@@ -44,6 +44,7 @@ package(default_visibility = ["//visibility:public"])
 cc_library(
   name = "gpr",
   srcs = [
+    "src/core/profiling/timers.h",
     "src/core/support/block_annotate.h",
     "src/core/support/env.h",
     "src/core/support/file.h",
@@ -53,6 +54,8 @@ cc_library(
     "src/core/support/string_win32.h",
     "src/core/support/thd_internal.h",
     "src/core/support/time_precise.h",
+    "src/core/profiling/basic_timers.c",
+    "src/core/profiling/stap_timers.c",
     "src/core/support/alloc.c",
     "src/core/support/cmdline.c",
     "src/core/support/cpu_iphone.c",
@@ -88,6 +91,7 @@ cc_library(
     "src/core/support/thd_win32.c",
     "src/core/support/time.c",
     "src/core/support/time_posix.c",
+    "src/core/support/time_precise.c",
     "src/core/support/time_win32.c",
     "src/core/support/tls_pthread.c",
   ],
@@ -218,12 +222,12 @@ cc_library(
     "src/core/json/json_common.h",
     "src/core/json/json_reader.h",
     "src/core/json/json_writer.h",
-    "src/core/profiling/timers.h",
     "src/core/statistics/census_interface.h",
     "src/core/statistics/census_rpc_stats.h",
     "src/core/surface/api_trace.h",
     "src/core/surface/byte_buffer_queue.h",
     "src/core/surface/call.h",
+    "src/core/surface/call_test_only.h",
     "src/core/surface/channel.h",
     "src/core/surface/completion_queue.h",
     "src/core/surface/event_string.h",
@@ -357,8 +361,6 @@ cc_library(
     "src/core/json/json_reader.c",
     "src/core/json/json_string.c",
     "src/core/json/json_writer.c",
-    "src/core/profiling/basic_timers.c",
-    "src/core/profiling/stap_timers.c",
     "src/core/surface/api_trace.c",
     "src/core/surface/byte_buffer.c",
     "src/core/surface/byte_buffer_queue.c",
@@ -506,12 +508,12 @@ cc_library(
     "src/core/json/json_common.h",
     "src/core/json/json_reader.h",
     "src/core/json/json_writer.h",
-    "src/core/profiling/timers.h",
     "src/core/statistics/census_interface.h",
     "src/core/statistics/census_rpc_stats.h",
     "src/core/surface/api_trace.h",
     "src/core/surface/byte_buffer_queue.h",
     "src/core/surface/call.h",
+    "src/core/surface/call_test_only.h",
     "src/core/surface/channel.h",
     "src/core/surface/completion_queue.h",
     "src/core/surface/event_string.h",
@@ -625,8 +627,6 @@ cc_library(
     "src/core/json/json_reader.c",
     "src/core/json/json_string.c",
     "src/core/json/json_writer.c",
-    "src/core/profiling/basic_timers.c",
-    "src/core/profiling/stap_timers.c",
     "src/core/surface/api_trace.c",
     "src/core/surface/byte_buffer.c",
     "src/core/surface/byte_buffer_queue.c",
@@ -964,6 +964,8 @@ cc_library(
 objc_library(
   name = "gpr_objc",
   srcs = [
+    "src/core/profiling/basic_timers.c",
+    "src/core/profiling/stap_timers.c",
     "src/core/support/alloc.c",
     "src/core/support/cmdline.c",
     "src/core/support/cpu_iphone.c",
@@ -999,6 +1001,7 @@ objc_library(
     "src/core/support/thd_win32.c",
     "src/core/support/time.c",
     "src/core/support/time_posix.c",
+    "src/core/support/time_precise.c",
     "src/core/support/time_win32.c",
     "src/core/support/tls_pthread.c",
   ],
@@ -1030,6 +1033,7 @@ objc_library(
     "include/grpc/support/tls_msvc.h",
     "include/grpc/support/tls_pthread.h",
     "include/grpc/support/useful.h",
+    "src/core/profiling/timers.h",
     "src/core/support/block_annotate.h",
     "src/core/support/env.h",
     "src/core/support/file.h",
@@ -1150,8 +1154,6 @@ objc_library(
     "src/core/json/json_reader.c",
     "src/core/json/json_string.c",
     "src/core/json/json_writer.c",
-    "src/core/profiling/basic_timers.c",
-    "src/core/profiling/stap_timers.c",
     "src/core/surface/api_trace.c",
     "src/core/surface/byte_buffer.c",
     "src/core/surface/byte_buffer_queue.c",
@@ -1296,12 +1298,12 @@ objc_library(
     "src/core/json/json_common.h",
     "src/core/json/json_reader.h",
     "src/core/json/json_writer.h",
-    "src/core/profiling/timers.h",
     "src/core/statistics/census_interface.h",
     "src/core/statistics/census_rpc_stats.h",
     "src/core/surface/api_trace.h",
     "src/core/surface/byte_buffer_queue.h",
     "src/core/surface/call.h",
+    "src/core/surface/call_test_only.h",
     "src/core/surface/channel.h",
     "src/core/surface/completion_queue.h",
     "src/core/surface/event_string.h",
diff --git a/Makefile b/Makefile
index b4e2ba4654a4397b454f17e0d719877ed271f344..183823c0a66052b2d2d8917c1db008e2e7771fe5 100644
--- a/Makefile
+++ b/Makefile
@@ -4088,6 +4088,8 @@ clean:
 
 
 LIBGPR_SRC = \
+    src/core/profiling/basic_timers.c \
+    src/core/profiling/stap_timers.c \
     src/core/support/alloc.c \
     src/core/support/cmdline.c \
     src/core/support/cpu_iphone.c \
@@ -4123,6 +4125,7 @@ LIBGPR_SRC = \
     src/core/support/thd_win32.c \
     src/core/support/time.c \
     src/core/support/time_posix.c \
+    src/core/support/time_precise.c \
     src/core/support/time_win32.c \
     src/core/support/tls_pthread.c \
 
@@ -4313,8 +4316,6 @@ LIBGRPC_SRC = \
     src/core/json/json_reader.c \
     src/core/json/json_string.c \
     src/core/json/json_writer.c \
-    src/core/profiling/basic_timers.c \
-    src/core/profiling/stap_timers.c \
     src/core/surface/api_trace.c \
     src/core/surface/byte_buffer.c \
     src/core/surface/byte_buffer_queue.c \
@@ -4596,8 +4597,6 @@ LIBGRPC_UNSECURE_SRC = \
     src/core/json/json_reader.c \
     src/core/json/json_string.c \
     src/core/json/json_writer.c \
-    src/core/profiling/basic_timers.c \
-    src/core/profiling/stap_timers.c \
     src/core/surface/api_trace.c \
     src/core/surface/byte_buffer.c \
     src/core/surface/byte_buffer_queue.c \
diff --git a/binding.gyp b/binding.gyp
new file mode 100644
index 0000000000000000000000000000000000000000..39036b3b2a836ab498ff1479563dc0e227e1df3c
--- /dev/null
+++ b/binding.gyp
@@ -0,0 +1,326 @@
+# GRPC Node gyp file
+# This currently builds the Node extension and dependencies
+# This file has been automatically generated from a template file.
+# Please look at the templates directory instead.
+# This file can be regenerated from the template by running
+# tools/buildgen/generate_projects.sh
+
+# Copyright 2015, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Some of this file is built with the help of
+# https://n8.io/converting-a-c-library-to-gyp/
+{
+  'variables': {
+    'config': '<!(echo $CONFIG)'
+  },
+  # TODO: Finish windows support
+  'target_defaults': {
+      # Empirically, Node only exports ALPN symbols if its major version is >0.
+      # io.js always reports versions >0 and always exports ALPN symbols.
+      # Therefore, Node's major version will be truthy if and only if it
+      # supports ALPN. The output of "node -v" is v[major].[minor].[patch],
+      # like "v4.1.1" in a recent version. We use grep to extract just the
+      # major version. "4", would be the output for the example.
+    'defines': [
+      'TSI_OPENSSL_ALPN_SUPPORT=<!(node -v | grep -oP "(?<=v)(\d+)(?=\.\d+\.\d+)")'
+    ],
+    'include_dirs': [
+      '.',
+      'include'
+    ]
+  },
+  'targets': [
+    {
+      'target_name': 'gpr',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+      ],
+      'sources': [
+        'src/core/profiling/basic_timers.c',
+        'src/core/profiling/stap_timers.c',
+        'src/core/support/alloc.c',
+        'src/core/support/cmdline.c',
+        'src/core/support/cpu_iphone.c',
+        'src/core/support/cpu_linux.c',
+        'src/core/support/cpu_posix.c',
+        'src/core/support/cpu_windows.c',
+        'src/core/support/env_linux.c',
+        'src/core/support/env_posix.c',
+        'src/core/support/env_win32.c',
+        'src/core/support/file.c',
+        'src/core/support/file_posix.c',
+        'src/core/support/file_win32.c',
+        'src/core/support/histogram.c',
+        'src/core/support/host_port.c',
+        'src/core/support/log.c',
+        'src/core/support/log_android.c',
+        'src/core/support/log_linux.c',
+        'src/core/support/log_posix.c',
+        'src/core/support/log_win32.c',
+        'src/core/support/murmur_hash.c',
+        'src/core/support/slice.c',
+        'src/core/support/slice_buffer.c',
+        'src/core/support/stack_lockfree.c',
+        'src/core/support/string.c',
+        'src/core/support/string_posix.c',
+        'src/core/support/string_win32.c',
+        'src/core/support/subprocess_posix.c',
+        'src/core/support/sync.c',
+        'src/core/support/sync_posix.c',
+        'src/core/support/sync_win32.c',
+        'src/core/support/thd.c',
+        'src/core/support/thd_posix.c',
+        'src/core/support/thd_win32.c',
+        'src/core/support/time.c',
+        'src/core/support/time_posix.c',
+        'src/core/support/time_precise.c',
+        'src/core/support/time_win32.c',
+        'src/core/support/tls_pthread.c',
+      ],
+    },
+    {
+      'target_name': 'grpc',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'gpr',
+      ],
+      'sources': [
+        'src/core/httpcli/httpcli_security_connector.c',
+        'src/core/security/base64.c',
+        'src/core/security/client_auth_filter.c',
+        'src/core/security/credentials.c',
+        'src/core/security/credentials_metadata.c',
+        'src/core/security/credentials_posix.c',
+        'src/core/security/credentials_win32.c',
+        'src/core/security/google_default_credentials.c',
+        'src/core/security/handshake.c',
+        'src/core/security/json_token.c',
+        'src/core/security/jwt_verifier.c',
+        'src/core/security/secure_endpoint.c',
+        'src/core/security/security_connector.c',
+        'src/core/security/security_context.c',
+        'src/core/security/server_auth_filter.c',
+        'src/core/security/server_secure_chttp2.c',
+        'src/core/surface/init_secure.c',
+        'src/core/surface/secure_channel_create.c',
+        'src/core/tsi/fake_transport_security.c',
+        'src/core/tsi/ssl_transport_security.c',
+        'src/core/tsi/transport_security.c',
+        'src/core/census/grpc_context.c',
+        'src/core/census/grpc_filter.c',
+        'src/core/channel/channel_args.c',
+        'src/core/channel/channel_stack.c',
+        'src/core/channel/client_channel.c',
+        'src/core/channel/compress_filter.c',
+        'src/core/channel/connected_channel.c',
+        'src/core/channel/http_client_filter.c',
+        'src/core/channel/http_server_filter.c',
+        'src/core/channel/noop_filter.c',
+        'src/core/client_config/client_config.c',
+        'src/core/client_config/connector.c',
+        'src/core/client_config/lb_policies/pick_first.c',
+        'src/core/client_config/lb_policies/round_robin.c',
+        'src/core/client_config/lb_policy.c',
+        'src/core/client_config/lb_policy_factory.c',
+        'src/core/client_config/lb_policy_registry.c',
+        'src/core/client_config/resolver.c',
+        'src/core/client_config/resolver_factory.c',
+        'src/core/client_config/resolver_registry.c',
+        'src/core/client_config/resolvers/dns_resolver.c',
+        'src/core/client_config/resolvers/sockaddr_resolver.c',
+        'src/core/client_config/subchannel.c',
+        'src/core/client_config/subchannel_factory.c',
+        'src/core/client_config/subchannel_factory_decorators/add_channel_arg.c',
+        'src/core/client_config/subchannel_factory_decorators/merge_channel_args.c',
+        'src/core/client_config/uri_parser.c',
+        'src/core/compression/algorithm.c',
+        'src/core/compression/message_compress.c',
+        'src/core/debug/trace.c',
+        'src/core/httpcli/format_request.c',
+        'src/core/httpcli/httpcli.c',
+        'src/core/httpcli/parser.c',
+        'src/core/iomgr/alarm.c',
+        'src/core/iomgr/alarm_heap.c',
+        'src/core/iomgr/closure.c',
+        'src/core/iomgr/endpoint.c',
+        'src/core/iomgr/endpoint_pair_posix.c',
+        'src/core/iomgr/endpoint_pair_windows.c',
+        'src/core/iomgr/exec_ctx.c',
+        'src/core/iomgr/fd_posix.c',
+        'src/core/iomgr/iocp_windows.c',
+        'src/core/iomgr/iomgr.c',
+        'src/core/iomgr/iomgr_posix.c',
+        'src/core/iomgr/iomgr_windows.c',
+        'src/core/iomgr/pollset_multipoller_with_epoll.c',
+        'src/core/iomgr/pollset_multipoller_with_poll_posix.c',
+        'src/core/iomgr/pollset_posix.c',
+        'src/core/iomgr/pollset_set_posix.c',
+        'src/core/iomgr/pollset_set_windows.c',
+        'src/core/iomgr/pollset_windows.c',
+        'src/core/iomgr/resolve_address_posix.c',
+        'src/core/iomgr/resolve_address_windows.c',
+        'src/core/iomgr/sockaddr_utils.c',
+        'src/core/iomgr/socket_utils_common_posix.c',
+        'src/core/iomgr/socket_utils_linux.c',
+        'src/core/iomgr/socket_utils_posix.c',
+        'src/core/iomgr/socket_windows.c',
+        'src/core/iomgr/tcp_client_posix.c',
+        'src/core/iomgr/tcp_client_windows.c',
+        'src/core/iomgr/tcp_posix.c',
+        'src/core/iomgr/tcp_server_posix.c',
+        'src/core/iomgr/tcp_server_windows.c',
+        'src/core/iomgr/tcp_windows.c',
+        'src/core/iomgr/time_averaged_stats.c',
+        'src/core/iomgr/udp_server.c',
+        'src/core/iomgr/wakeup_fd_eventfd.c',
+        'src/core/iomgr/wakeup_fd_nospecial.c',
+        'src/core/iomgr/wakeup_fd_pipe.c',
+        'src/core/iomgr/wakeup_fd_posix.c',
+        'src/core/iomgr/workqueue_posix.c',
+        'src/core/iomgr/workqueue_windows.c',
+        'src/core/json/json.c',
+        'src/core/json/json_reader.c',
+        'src/core/json/json_string.c',
+        'src/core/json/json_writer.c',
+        'src/core/surface/api_trace.c',
+        'src/core/surface/byte_buffer.c',
+        'src/core/surface/byte_buffer_queue.c',
+        'src/core/surface/byte_buffer_reader.c',
+        'src/core/surface/call.c',
+        'src/core/surface/call_details.c',
+        'src/core/surface/call_log_batch.c',
+        'src/core/surface/channel.c',
+        'src/core/surface/channel_connectivity.c',
+        'src/core/surface/channel_create.c',
+        'src/core/surface/completion_queue.c',
+        'src/core/surface/event_string.c',
+        'src/core/surface/init.c',
+        'src/core/surface/lame_client.c',
+        'src/core/surface/metadata_array.c',
+        'src/core/surface/server.c',
+        'src/core/surface/server_chttp2.c',
+        'src/core/surface/server_create.c',
+        'src/core/surface/version.c',
+        'src/core/transport/chttp2/alpn.c',
+        'src/core/transport/chttp2/bin_encoder.c',
+        'src/core/transport/chttp2/frame_data.c',
+        'src/core/transport/chttp2/frame_goaway.c',
+        'src/core/transport/chttp2/frame_ping.c',
+        'src/core/transport/chttp2/frame_rst_stream.c',
+        'src/core/transport/chttp2/frame_settings.c',
+        'src/core/transport/chttp2/frame_window_update.c',
+        'src/core/transport/chttp2/hpack_parser.c',
+        'src/core/transport/chttp2/hpack_table.c',
+        'src/core/transport/chttp2/huffsyms.c',
+        'src/core/transport/chttp2/incoming_metadata.c',
+        'src/core/transport/chttp2/parsing.c',
+        'src/core/transport/chttp2/status_conversion.c',
+        'src/core/transport/chttp2/stream_encoder.c',
+        'src/core/transport/chttp2/stream_lists.c',
+        'src/core/transport/chttp2/stream_map.c',
+        'src/core/transport/chttp2/timeout_encoding.c',
+        'src/core/transport/chttp2/varint.c',
+        'src/core/transport/chttp2/writing.c',
+        'src/core/transport/chttp2_transport.c',
+        'src/core/transport/connectivity_state.c',
+        'src/core/transport/metadata.c',
+        'src/core/transport/stream_op.c',
+        'src/core/transport/transport.c',
+        'src/core/transport/transport_op_string.c',
+        'src/core/census/context.c',
+        'src/core/census/initialize.c',
+        'src/core/census/operation.c',
+        'src/core/census/tracing.c',
+      ],
+    },
+    {
+      'include_dirs': [
+        "<!(node -e \"require('nan')\")"
+      ],
+      'cflags': [
+        '-std=c++0x',
+        '-Wall',
+        '-pthread',
+        '-g',
+        '-zdefs',
+        '-Werror',
+        '-Wno-error=deprecated-declarations'
+      ],
+      'ldflags': [
+        '-g'
+      ],
+      "conditions": [
+        ['OS != "win"', {
+          'conditions': [
+            ['config=="gcov"', {
+              'cflags': [
+                '-ftest-coverage',
+                '-fprofile-arcs',
+                '-O0'
+              ],
+              'ldflags': [
+                '-ftest-coverage',
+                '-fprofile-arcs'
+              ]
+            }
+           ]
+          ]
+        }],
+        ['OS == "mac"', {
+          'xcode_settings': {
+            'MACOSX_DEPLOYMENT_TARGET': '10.9',
+            'OTHER_CFLAGS': [
+              '-std=c++11',
+              '-stdlib=libc++'
+            ]
+          }
+        }]
+      ],
+      "target_name": "grpc_node",
+      "sources": [
+        "src/node/ext/byte_buffer.cc",
+        "src/node/ext/call.cc",
+        "src/node/ext/call_credentials.cc",
+        "src/node/ext/channel.cc",
+        "src/node/ext/channel_credentials.cc",
+        "src/node/ext/completion_queue_async_worker.cc",
+        "src/node/ext/node_grpc.cc",
+        "src/node/ext/server.cc",
+        "src/node/ext/server_credentials.cc",
+        "src/node/ext/timeval.cc"
+      ],
+      "dependencies": [
+        "grpc"
+      ]
+    }
+  ]
+}
diff --git a/build.json b/build.json
deleted file mode 100644
index 0a4248c7a8da834c1a605fc3c88fe436ef82b438..0000000000000000000000000000000000000000
--- a/build.json
+++ /dev/null
@@ -1,2729 +0,0 @@
-{
-  "#1": "This file describes the list of targets and dependencies.",
-  "#2": "It is used among other things to generate all of our project files.",
-  "#3": "Please refer to the templates directory for more information.",
-  "settings": {
-    "#": "The public version number of the library.",
-    "version": {
-      "major": 0,
-      "minor": 10,
-      "micro": 1,
-      "build": 0
-    }
-  },
-  "filegroups": [
-    {
-      "name": "census",
-      "public_headers": [
-        "include/grpc/census.h"
-      ],
-      "headers": [
-        "src/core/census/context.h",
-        "src/core/census/rpc_stat_id.h"
-      ],
-      "src": [
-        "src/core/census/context.c",
-        "src/core/census/initialize.c",
-        "src/core/census/record_stat.c"
-      ]
-    },
-    {
-      "name": "grpc++_base",
-      "public_headers": [
-        "include/grpc++/channel.h",
-        "include/grpc++/client_context.h",
-        "include/grpc++/completion_queue.h",
-        "include/grpc++/create_channel.h",
-        "include/grpc++/credentials.h",
-        "include/grpc++/generic/async_generic_service.h",
-        "include/grpc++/generic/generic_stub.h",
-        "include/grpc++/impl/call.h",
-        "include/grpc++/impl/client_unary_call.h",
-        "include/grpc++/impl/grpc_library.h",
-        "include/grpc++/impl/proto_utils.h",
-        "include/grpc++/impl/rpc_method.h",
-        "include/grpc++/impl/rpc_service_method.h",
-        "include/grpc++/impl/serialization_traits.h",
-        "include/grpc++/impl/service_type.h",
-        "include/grpc++/impl/sync.h",
-        "include/grpc++/impl/sync_cxx11.h",
-        "include/grpc++/impl/sync_no_cxx11.h",
-        "include/grpc++/impl/thd.h",
-        "include/grpc++/impl/thd_cxx11.h",
-        "include/grpc++/impl/thd_no_cxx11.h",
-        "include/grpc++/server.h",
-        "include/grpc++/server_builder.h",
-        "include/grpc++/server_context.h",
-        "include/grpc++/server_credentials.h",
-        "include/grpc++/support/async_stream.h",
-        "include/grpc++/support/async_unary_call.h",
-        "include/grpc++/support/auth_context.h",
-        "include/grpc++/support/byte_buffer.h",
-        "include/grpc++/support/channel_arguments.h",
-        "include/grpc++/support/config.h",
-        "include/grpc++/support/config_protobuf.h",
-        "include/grpc++/support/slice.h",
-        "include/grpc++/support/status.h",
-        "include/grpc++/support/status_code_enum.h",
-        "include/grpc++/support/string_ref.h",
-        "include/grpc++/support/stub_options.h",
-        "include/grpc++/support/sync_stream.h",
-        "include/grpc++/support/time.h"
-      ],
-      "headers": [
-        "src/cpp/client/create_channel_internal.h",
-        "src/cpp/common/create_auth_context.h",
-        "src/cpp/server/dynamic_thread_pool.h",
-        "src/cpp/server/fixed_size_thread_pool.h",
-        "src/cpp/server/thread_pool_interface.h"
-      ],
-      "src": [
-        "src/cpp/client/channel.cc",
-        "src/cpp/client/channel_arguments.cc",
-        "src/cpp/client/client_context.cc",
-        "src/cpp/client/create_channel.cc",
-        "src/cpp/client/create_channel_internal.cc",
-        "src/cpp/client/credentials.cc",
-        "src/cpp/client/generic_stub.cc",
-        "src/cpp/client/insecure_credentials.cc",
-        "src/cpp/common/call.cc",
-        "src/cpp/common/completion_queue.cc",
-        "src/cpp/common/rpc_method.cc",
-        "src/cpp/proto/proto_utils.cc",
-        "src/cpp/server/async_generic_service.cc",
-        "src/cpp/server/create_default_thread_pool.cc",
-        "src/cpp/server/dynamic_thread_pool.cc",
-        "src/cpp/server/fixed_size_thread_pool.cc",
-        "src/cpp/server/insecure_server_credentials.cc",
-        "src/cpp/server/server.cc",
-        "src/cpp/server/server_builder.cc",
-        "src/cpp/server/server_context.cc",
-        "src/cpp/server/server_credentials.cc",
-        "src/cpp/util/byte_buffer.cc",
-        "src/cpp/util/slice.cc",
-        "src/cpp/util/status.cc",
-        "src/cpp/util/string_ref.cc",
-        "src/cpp/util/time.cc"
-      ]
-    },
-    {
-      "name": "grpc_base",
-      "public_headers": [
-        "include/grpc/byte_buffer.h",
-        "include/grpc/byte_buffer_reader.h",
-        "include/grpc/compression.h",
-        "include/grpc/grpc.h",
-        "include/grpc/status.h"
-      ],
-      "headers": [
-        "src/core/census/grpc_filter.h",
-        "src/core/channel/channel_args.h",
-        "src/core/channel/channel_stack.h",
-        "src/core/channel/client_channel.h",
-        "src/core/channel/compress_filter.h",
-        "src/core/channel/connected_channel.h",
-        "src/core/channel/context.h",
-        "src/core/channel/http_client_filter.h",
-        "src/core/channel/http_server_filter.h",
-        "src/core/channel/noop_filter.h",
-        "src/core/client_config/client_config.h",
-        "src/core/client_config/connector.h",
-        "src/core/client_config/lb_policies/pick_first.h",
-        "src/core/client_config/lb_policy.h",
-        "src/core/client_config/resolver.h",
-        "src/core/client_config/resolver_factory.h",
-        "src/core/client_config/resolver_registry.h",
-        "src/core/client_config/resolvers/dns_resolver.h",
-        "src/core/client_config/resolvers/sockaddr_resolver.h",
-        "src/core/client_config/subchannel.h",
-        "src/core/client_config/subchannel_factory.h",
-        "src/core/client_config/subchannel_factory_decorators/add_channel_arg.h",
-        "src/core/client_config/subchannel_factory_decorators/merge_channel_args.h",
-        "src/core/client_config/uri_parser.h",
-        "src/core/compression/message_compress.h",
-        "src/core/debug/trace.h",
-        "src/core/httpcli/format_request.h",
-        "src/core/httpcli/httpcli.h",
-        "src/core/httpcli/parser.h",
-        "src/core/iomgr/alarm.h",
-        "src/core/iomgr/alarm_heap.h",
-        "src/core/iomgr/alarm_internal.h",
-        "src/core/iomgr/endpoint.h",
-        "src/core/iomgr/endpoint_pair.h",
-        "src/core/iomgr/fd_posix.h",
-        "src/core/iomgr/iocp_windows.h",
-        "src/core/iomgr/iomgr.h",
-        "src/core/iomgr/iomgr_internal.h",
-        "src/core/iomgr/iomgr_posix.h",
-        "src/core/iomgr/pollset.h",
-        "src/core/iomgr/pollset_posix.h",
-        "src/core/iomgr/pollset_set.h",
-        "src/core/iomgr/pollset_set_posix.h",
-        "src/core/iomgr/pollset_set_windows.h",
-        "src/core/iomgr/pollset_windows.h",
-        "src/core/iomgr/resolve_address.h",
-        "src/core/iomgr/sockaddr.h",
-        "src/core/iomgr/sockaddr_posix.h",
-        "src/core/iomgr/sockaddr_utils.h",
-        "src/core/iomgr/sockaddr_win32.h",
-        "src/core/iomgr/socket_utils_posix.h",
-        "src/core/iomgr/socket_windows.h",
-        "src/core/iomgr/tcp_client.h",
-        "src/core/iomgr/tcp_posix.h",
-        "src/core/iomgr/tcp_server.h",
-        "src/core/iomgr/tcp_windows.h",
-        "src/core/iomgr/time_averaged_stats.h",
-        "src/core/iomgr/udp_server.h",
-        "src/core/iomgr/wakeup_fd_pipe.h",
-        "src/core/iomgr/wakeup_fd_posix.h",
-        "src/core/json/json.h",
-        "src/core/json/json_common.h",
-        "src/core/json/json_reader.h",
-        "src/core/json/json_writer.h",
-        "src/core/profiling/timers.h",
-        "src/core/profiling/timers_preciseclock.h",
-        "src/core/statistics/census_interface.h",
-        "src/core/statistics/census_rpc_stats.h",
-        "src/core/surface/api_trace.h",
-        "src/core/surface/byte_buffer_queue.h",
-        "src/core/surface/call.h",
-        "src/core/surface/channel.h",
-        "src/core/surface/completion_queue.h",
-        "src/core/surface/event_string.h",
-        "src/core/surface/init.h",
-        "src/core/surface/server.h",
-        "src/core/surface/surface_trace.h",
-        "src/core/transport/chttp2/alpn.h",
-        "src/core/transport/chttp2/bin_encoder.h",
-        "src/core/transport/chttp2/frame.h",
-        "src/core/transport/chttp2/frame_data.h",
-        "src/core/transport/chttp2/frame_goaway.h",
-        "src/core/transport/chttp2/frame_ping.h",
-        "src/core/transport/chttp2/frame_rst_stream.h",
-        "src/core/transport/chttp2/frame_settings.h",
-        "src/core/transport/chttp2/frame_window_update.h",
-        "src/core/transport/chttp2/hpack_parser.h",
-        "src/core/transport/chttp2/hpack_table.h",
-        "src/core/transport/chttp2/http2_errors.h",
-        "src/core/transport/chttp2/huffsyms.h",
-        "src/core/transport/chttp2/incoming_metadata.h",
-        "src/core/transport/chttp2/internal.h",
-        "src/core/transport/chttp2/status_conversion.h",
-        "src/core/transport/chttp2/stream_encoder.h",
-        "src/core/transport/chttp2/stream_map.h",
-        "src/core/transport/chttp2/timeout_encoding.h",
-        "src/core/transport/chttp2/varint.h",
-        "src/core/transport/chttp2_transport.h",
-        "src/core/transport/connectivity_state.h",
-        "src/core/transport/metadata.h",
-        "src/core/transport/stream_op.h",
-        "src/core/transport/transport.h",
-        "src/core/transport/transport_impl.h"
-      ],
-      "src": [
-        "src/core/census/grpc_context.c",
-        "src/core/census/grpc_filter.c",
-        "src/core/channel/channel_args.c",
-        "src/core/channel/channel_stack.c",
-        "src/core/channel/client_channel.c",
-        "src/core/channel/compress_filter.c",
-        "src/core/channel/connected_channel.c",
-        "src/core/channel/http_client_filter.c",
-        "src/core/channel/http_server_filter.c",
-        "src/core/channel/noop_filter.c",
-        "src/core/client_config/client_config.c",
-        "src/core/client_config/connector.c",
-        "src/core/client_config/lb_policies/pick_first.c",
-        "src/core/client_config/lb_policy.c",
-        "src/core/client_config/resolver.c",
-        "src/core/client_config/resolver_factory.c",
-        "src/core/client_config/resolver_registry.c",
-        "src/core/client_config/resolvers/dns_resolver.c",
-        "src/core/client_config/resolvers/sockaddr_resolver.c",
-        "src/core/client_config/subchannel.c",
-        "src/core/client_config/subchannel_factory.c",
-        "src/core/client_config/subchannel_factory_decorators/add_channel_arg.c",
-        "src/core/client_config/subchannel_factory_decorators/merge_channel_args.c",
-        "src/core/client_config/uri_parser.c",
-        "src/core/compression/algorithm.c",
-        "src/core/compression/message_compress.c",
-        "src/core/debug/trace.c",
-        "src/core/httpcli/format_request.c",
-        "src/core/httpcli/httpcli.c",
-        "src/core/httpcli/parser.c",
-        "src/core/iomgr/alarm.c",
-        "src/core/iomgr/alarm_heap.c",
-        "src/core/iomgr/endpoint.c",
-        "src/core/iomgr/endpoint_pair_posix.c",
-        "src/core/iomgr/endpoint_pair_windows.c",
-        "src/core/iomgr/fd_posix.c",
-        "src/core/iomgr/iocp_windows.c",
-        "src/core/iomgr/iomgr.c",
-        "src/core/iomgr/iomgr_posix.c",
-        "src/core/iomgr/iomgr_windows.c",
-        "src/core/iomgr/pollset_multipoller_with_epoll.c",
-        "src/core/iomgr/pollset_multipoller_with_poll_posix.c",
-        "src/core/iomgr/pollset_posix.c",
-        "src/core/iomgr/pollset_set_posix.c",
-        "src/core/iomgr/pollset_set_windows.c",
-        "src/core/iomgr/pollset_windows.c",
-        "src/core/iomgr/resolve_address_posix.c",
-        "src/core/iomgr/resolve_address_windows.c",
-        "src/core/iomgr/sockaddr_utils.c",
-        "src/core/iomgr/socket_utils_common_posix.c",
-        "src/core/iomgr/socket_utils_linux.c",
-        "src/core/iomgr/socket_utils_posix.c",
-        "src/core/iomgr/socket_windows.c",
-        "src/core/iomgr/tcp_client_posix.c",
-        "src/core/iomgr/tcp_client_windows.c",
-        "src/core/iomgr/tcp_posix.c",
-        "src/core/iomgr/tcp_server_posix.c",
-        "src/core/iomgr/tcp_server_windows.c",
-        "src/core/iomgr/tcp_windows.c",
-        "src/core/iomgr/time_averaged_stats.c",
-        "src/core/iomgr/udp_server.c",
-        "src/core/iomgr/wakeup_fd_eventfd.c",
-        "src/core/iomgr/wakeup_fd_nospecial.c",
-        "src/core/iomgr/wakeup_fd_pipe.c",
-        "src/core/iomgr/wakeup_fd_posix.c",
-        "src/core/json/json.c",
-        "src/core/json/json_reader.c",
-        "src/core/json/json_string.c",
-        "src/core/json/json_writer.c",
-        "src/core/profiling/basic_timers.c",
-        "src/core/profiling/stap_timers.c",
-        "src/core/surface/api_trace.c",
-        "src/core/surface/byte_buffer.c",
-        "src/core/surface/byte_buffer_queue.c",
-        "src/core/surface/byte_buffer_reader.c",
-        "src/core/surface/call.c",
-        "src/core/surface/call_details.c",
-        "src/core/surface/call_log_batch.c",
-        "src/core/surface/channel.c",
-        "src/core/surface/channel_connectivity.c",
-        "src/core/surface/channel_create.c",
-        "src/core/surface/completion_queue.c",
-        "src/core/surface/event_string.c",
-        "src/core/surface/init.c",
-        "src/core/surface/lame_client.c",
-        "src/core/surface/metadata_array.c",
-        "src/core/surface/server.c",
-        "src/core/surface/server_chttp2.c",
-        "src/core/surface/server_create.c",
-        "src/core/surface/version.c",
-        "src/core/transport/chttp2/alpn.c",
-        "src/core/transport/chttp2/bin_encoder.c",
-        "src/core/transport/chttp2/frame_data.c",
-        "src/core/transport/chttp2/frame_goaway.c",
-        "src/core/transport/chttp2/frame_ping.c",
-        "src/core/transport/chttp2/frame_rst_stream.c",
-        "src/core/transport/chttp2/frame_settings.c",
-        "src/core/transport/chttp2/frame_window_update.c",
-        "src/core/transport/chttp2/hpack_parser.c",
-        "src/core/transport/chttp2/hpack_table.c",
-        "src/core/transport/chttp2/huffsyms.c",
-        "src/core/transport/chttp2/incoming_metadata.c",
-        "src/core/transport/chttp2/parsing.c",
-        "src/core/transport/chttp2/status_conversion.c",
-        "src/core/transport/chttp2/stream_encoder.c",
-        "src/core/transport/chttp2/stream_lists.c",
-        "src/core/transport/chttp2/stream_map.c",
-        "src/core/transport/chttp2/timeout_encoding.c",
-        "src/core/transport/chttp2/varint.c",
-        "src/core/transport/chttp2/writing.c",
-        "src/core/transport/chttp2_transport.c",
-        "src/core/transport/connectivity_state.c",
-        "src/core/transport/metadata.c",
-        "src/core/transport/stream_op.c",
-        "src/core/transport/transport.c",
-        "src/core/transport/transport_op_string.c"
-      ]
-    },
-    {
-      "name": "grpc_test_util_base",
-      "headers": [
-        "test/core/end2end/cq_verifier.h",
-        "test/core/end2end/fixtures/proxy.h",
-        "test/core/iomgr/endpoint_tests.h",
-        "test/core/security/oauth2_utils.h",
-        "test/core/util/grpc_profiler.h",
-        "test/core/util/parse_hexstring.h",
-        "test/core/util/port.h",
-        "test/core/util/slice_splitter.h"
-      ],
-      "src": [
-        "test/core/end2end/cq_verifier.c",
-        "test/core/end2end/fixtures/proxy.c",
-        "test/core/iomgr/endpoint_tests.c",
-        "test/core/security/oauth2_utils.c",
-        "test/core/util/grpc_profiler.c",
-        "test/core/util/parse_hexstring.c",
-        "test/core/util/port_posix.c",
-        "test/core/util/port_windows.c",
-        "test/core/util/slice_splitter.c"
-      ]
-    }
-  ],
-  "libs": [
-    {
-      "name": "gpr",
-      "build": "all",
-      "language": "c",
-      "public_headers": [
-        "include/grpc/support/alloc.h",
-        "include/grpc/support/atm.h",
-        "include/grpc/support/atm_gcc_atomic.h",
-        "include/grpc/support/atm_gcc_sync.h",
-        "include/grpc/support/atm_win32.h",
-        "include/grpc/support/cmdline.h",
-        "include/grpc/support/cpu.h",
-        "include/grpc/support/histogram.h",
-        "include/grpc/support/host_port.h",
-        "include/grpc/support/log.h",
-        "include/grpc/support/log_win32.h",
-        "include/grpc/support/port_platform.h",
-        "include/grpc/support/slice.h",
-        "include/grpc/support/slice_buffer.h",
-        "include/grpc/support/string_util.h",
-        "include/grpc/support/subprocess.h",
-        "include/grpc/support/sync.h",
-        "include/grpc/support/sync_generic.h",
-        "include/grpc/support/sync_posix.h",
-        "include/grpc/support/sync_win32.h",
-        "include/grpc/support/thd.h",
-        "include/grpc/support/time.h",
-        "include/grpc/support/tls.h",
-        "include/grpc/support/tls_gcc.h",
-        "include/grpc/support/tls_msvc.h",
-        "include/grpc/support/tls_pthread.h",
-        "include/grpc/support/useful.h"
-      ],
-      "headers": [
-        "src/core/support/env.h",
-        "src/core/support/file.h",
-        "src/core/support/murmur_hash.h",
-        "src/core/support/stack_lockfree.h",
-        "src/core/support/string.h",
-        "src/core/support/string_win32.h",
-        "src/core/support/thd_internal.h"
-      ],
-      "src": [
-        "src/core/support/alloc.c",
-        "src/core/support/cmdline.c",
-        "src/core/support/cpu_iphone.c",
-        "src/core/support/cpu_linux.c",
-        "src/core/support/cpu_posix.c",
-        "src/core/support/cpu_windows.c",
-        "src/core/support/env_linux.c",
-        "src/core/support/env_posix.c",
-        "src/core/support/env_win32.c",
-        "src/core/support/file.c",
-        "src/core/support/file_posix.c",
-        "src/core/support/file_win32.c",
-        "src/core/support/histogram.c",
-        "src/core/support/host_port.c",
-        "src/core/support/log.c",
-        "src/core/support/log_android.c",
-        "src/core/support/log_linux.c",
-        "src/core/support/log_posix.c",
-        "src/core/support/log_win32.c",
-        "src/core/support/murmur_hash.c",
-        "src/core/support/slice.c",
-        "src/core/support/slice_buffer.c",
-        "src/core/support/stack_lockfree.c",
-        "src/core/support/string.c",
-        "src/core/support/string_posix.c",
-        "src/core/support/string_win32.c",
-        "src/core/support/subprocess_posix.c",
-        "src/core/support/sync.c",
-        "src/core/support/sync_posix.c",
-        "src/core/support/sync_win32.c",
-        "src/core/support/thd.c",
-        "src/core/support/thd_posix.c",
-        "src/core/support/thd_win32.c",
-        "src/core/support/time.c",
-        "src/core/support/time_posix.c",
-        "src/core/support/time_win32.c",
-        "src/core/support/tls_pthread.c"
-      ],
-      "secure": "no",
-      "vs_project_guid": "{B23D3D1A-9438-4EDA-BEB6-9A0A03D17792}"
-    },
-    {
-      "name": "gpr_test_util",
-      "build": "private",
-      "language": "c",
-      "headers": [
-        "test/core/util/test_config.h"
-      ],
-      "src": [
-        "test/core/util/test_config.c"
-      ],
-      "deps": [
-        "gpr"
-      ],
-      "secure": "no",
-      "vs_project_guid": "{EAB0A629-17A9-44DB-B5FF-E91A721FE037}"
-    },
-    {
-      "name": "grpc",
-      "build": "all",
-      "language": "c",
-      "public_headers": [
-        "include/grpc/grpc_security.h"
-      ],
-      "headers": [
-        "src/core/security/auth_filters.h",
-        "src/core/security/base64.h",
-        "src/core/security/credentials.h",
-        "src/core/security/json_token.h",
-        "src/core/security/jwt_verifier.h",
-        "src/core/security/secure_endpoint.h",
-        "src/core/security/secure_transport_setup.h",
-        "src/core/security/security_connector.h",
-        "src/core/security/security_context.h",
-        "src/core/tsi/fake_transport_security.h",
-        "src/core/tsi/ssl_transport_security.h",
-        "src/core/tsi/transport_security.h",
-        "src/core/tsi/transport_security_interface.h"
-      ],
-      "src": [
-        "src/core/httpcli/httpcli_security_connector.c",
-        "src/core/security/base64.c",
-        "src/core/security/client_auth_filter.c",
-        "src/core/security/credentials.c",
-        "src/core/security/credentials_metadata.c",
-        "src/core/security/credentials_posix.c",
-        "src/core/security/credentials_win32.c",
-        "src/core/security/google_default_credentials.c",
-        "src/core/security/json_token.c",
-        "src/core/security/jwt_verifier.c",
-        "src/core/security/secure_endpoint.c",
-        "src/core/security/secure_transport_setup.c",
-        "src/core/security/security_connector.c",
-        "src/core/security/security_context.c",
-        "src/core/security/server_auth_filter.c",
-        "src/core/security/server_secure_chttp2.c",
-        "src/core/surface/init_secure.c",
-        "src/core/surface/secure_channel_create.c",
-        "src/core/tsi/fake_transport_security.c",
-        "src/core/tsi/ssl_transport_security.c",
-        "src/core/tsi/transport_security.c"
-      ],
-      "deps": [
-        "gpr"
-      ],
-      "baselib": true,
-      "dll": "yes",
-      "filegroups": [
-        "grpc_base",
-        "census"
-      ],
-      "secure": "yes",
-      "vs_project_guid": "{29D16885-7228-4C31-81ED-5F9187C7F2A9}"
-    },
-    {
-      "name": "grpc_test_util",
-      "build": "private",
-      "language": "c",
-      "headers": [
-        "test/core/end2end/data/ssl_test_data.h"
-      ],
-      "src": [
-        "test/core/end2end/data/server1_cert.c",
-        "test/core/end2end/data/server1_key.c",
-        "test/core/end2end/data/test_root_cert.c"
-      ],
-      "deps": [
-        "gpr",
-        "gpr_test_util",
-        "grpc"
-      ],
-      "filegroups": [
-        "grpc_test_util_base"
-      ],
-      "vs_project_guid": "{17BCAFC0-5FDC-4C94-AEB9-95F3E220614B}"
-    },
-    {
-      "name": "grpc_test_util_unsecure",
-      "build": "private",
-      "language": "c",
-      "deps": [
-        "gpr",
-        "gpr_test_util",
-        "grpc"
-      ],
-      "filegroups": [
-        "grpc_test_util_base"
-      ],
-      "secure": "no",
-      "vs_project_guid": "{0A7E7F92-FDEA-40F1-A9EC-3BA484F98BBF}"
-    },
-    {
-      "name": "grpc_unsecure",
-      "build": "all",
-      "language": "c",
-      "src": [
-        "src/core/surface/init_unsecure.c"
-      ],
-      "deps": [
-        "gpr"
-      ],
-      "baselib": true,
-      "dll": "yes",
-      "filegroups": [
-        "grpc_base",
-        "census"
-      ],
-      "secure": "no",
-      "vs_project_guid": "{46CEDFFF-9692-456A-AA24-38B5D6BCF4C5}"
-    },
-    {
-      "name": "grpc_zookeeper",
-      "build": "all",
-      "language": "c",
-      "public_headers": [
-        "include/grpc/grpc_zookeeper.h"
-      ],
-      "headers": [
-        "src/core/client_config/resolvers/zookeeper_resolver.h"
-      ],
-      "src": [
-        "src/core/client_config/resolvers/zookeeper_resolver.c"
-      ],
-      "deps": [
-        "gpr",
-        "grpc"
-      ],
-      "external_deps": [
-        "zookeeper"
-      ],
-      "secure": "no"
-    },
-    {
-      "name": "reconnect_server",
-      "build": "private",
-      "language": "c",
-      "headers": [
-        "test/core/util/reconnect_server.h"
-      ],
-      "src": [
-        "test/core/util/reconnect_server.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "grpc++",
-      "build": "all",
-      "language": "c++",
-      "headers": [
-        "src/cpp/client/secure_credentials.h",
-        "src/cpp/common/secure_auth_context.h",
-        "src/cpp/server/secure_server_credentials.h"
-      ],
-      "src": [
-        "src/cpp/client/secure_channel_arguments.cc",
-        "src/cpp/client/secure_credentials.cc",
-        "src/cpp/common/auth_property_iterator.cc",
-        "src/cpp/common/secure_auth_context.cc",
-        "src/cpp/common/secure_create_auth_context.cc",
-        "src/cpp/server/secure_server_credentials.cc"
-      ],
-      "deps": [
-        "gpr",
-        "grpc"
-      ],
-      "baselib": true,
-      "dll": "yes",
-      "filegroups": [
-        "grpc++_base"
-      ],
-      "secure": "check",
-      "vs_project_guid": "{C187A093-A0FE-489D-A40A-6E33DE0F9FEB}"
-    },
-    {
-      "name": "grpc++_test_config",
-      "build": "private",
-      "language": "c++",
-      "headers": [
-        "test/cpp/util/test_config.h"
-      ],
-      "src": [
-        "test/cpp/util/test_config.cc"
-      ]
-    },
-    {
-      "name": "grpc++_test_util",
-      "build": "private",
-      "language": "c++",
-      "headers": [
-        "test/cpp/util/cli_call.h",
-        "test/cpp/util/create_test_channel.h",
-        "test/cpp/util/subprocess.h"
-      ],
-      "src": [
-        "test/cpp/util/messages.proto",
-        "test/cpp/util/echo.proto",
-        "test/cpp/util/echo_duplicate.proto",
-        "test/cpp/util/cli_call.cc",
-        "test/cpp/util/create_test_channel.cc",
-        "test/cpp/util/subprocess.cc"
-      ],
-      "deps": [
-        "grpc++",
-        "grpc_test_util"
-      ]
-    },
-    {
-      "name": "grpc++_unsecure",
-      "build": "all",
-      "language": "c++",
-      "src": [
-        "src/cpp/common/insecure_create_auth_context.cc"
-      ],
-      "deps": [
-        "gpr",
-        "grpc_unsecure"
-      ],
-      "baselib": true,
-      "dll": "yes",
-      "filegroups": [
-        "grpc++_base"
-      ],
-      "secure": "no",
-      "vs_project_guid": "{6EE56155-DF7C-4F6E-BFC4-F6F776BEB211}"
-    },
-    {
-      "name": "grpc_plugin_support",
-      "build": "protoc",
-      "language": "c++",
-      "headers": [
-        "include/grpc++/support/config.h",
-        "include/grpc++/support/config_protobuf.h",
-        "src/compiler/config.h",
-        "src/compiler/cpp_generator.h",
-        "src/compiler/cpp_generator_helpers.h",
-        "src/compiler/csharp_generator.h",
-        "src/compiler/csharp_generator_helpers.h",
-        "src/compiler/generator_helpers.h",
-        "src/compiler/objective_c_generator.h",
-        "src/compiler/objective_c_generator_helpers.h",
-        "src/compiler/python_generator.h",
-        "src/compiler/ruby_generator.h",
-        "src/compiler/ruby_generator_helpers-inl.h",
-        "src/compiler/ruby_generator_map-inl.h",
-        "src/compiler/ruby_generator_string-inl.h"
-      ],
-      "src": [
-        "src/compiler/cpp_generator.cc",
-        "src/compiler/csharp_generator.cc",
-        "src/compiler/objective_c_generator.cc",
-        "src/compiler/python_generator.cc",
-        "src/compiler/ruby_generator.cc"
-      ],
-      "deps": [],
-      "secure": "no",
-      "vs_project_guid": "{B6E81D84-2ACB-41B8-8781-493A944C7817}"
-    },
-    {
-      "name": "interop_client_helper",
-      "build": "private",
-      "language": "c++",
-      "headers": [
-        "test/cpp/interop/client_helper.h"
-      ],
-      "src": [
-        "test/proto/messages.proto",
-        "test/cpp/interop/client_helper.cc"
-      ],
-      "deps": [
-        "grpc++_test_util",
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr"
-      ]
-    },
-    {
-      "name": "interop_client_main",
-      "build": "private",
-      "language": "c++",
-      "headers": [
-        "test/cpp/interop/interop_client.h"
-      ],
-      "src": [
-        "test/proto/empty.proto",
-        "test/proto/messages.proto",
-        "test/proto/test.proto",
-        "test/cpp/interop/client.cc",
-        "test/cpp/interop/interop_client.cc"
-      ],
-      "deps": [
-        "interop_client_helper",
-        "grpc++_test_util",
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr_test_util",
-        "gpr",
-        "grpc++_test_config"
-      ]
-    },
-    {
-      "name": "interop_server_helper",
-      "build": "private",
-      "language": "c++",
-      "headers": [
-        "test/cpp/interop/server_helper.h"
-      ],
-      "src": [
-        "test/cpp/interop/server_helper.cc"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr"
-      ]
-    },
-    {
-      "name": "interop_server_main",
-      "build": "private",
-      "language": "c++",
-      "src": [
-        "test/proto/empty.proto",
-        "test/proto/messages.proto",
-        "test/proto/test.proto",
-        "test/cpp/interop/server.cc"
-      ],
-      "deps": [
-        "interop_server_helper",
-        "grpc++_test_util",
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr_test_util",
-        "gpr",
-        "grpc++_test_config"
-      ]
-    },
-    {
-      "name": "pubsub_client_lib",
-      "build": "do_not_build",
-      "language": "c++",
-      "headers": [
-        "examples/pubsub/publisher.h",
-        "examples/pubsub/subscriber.h"
-      ],
-      "src": [
-        "examples/pubsub/label.proto",
-        "examples/pubsub/empty.proto",
-        "examples/pubsub/pubsub.proto",
-        "examples/pubsub/publisher.cc",
-        "examples/pubsub/subscriber.cc"
-      ],
-      "deps": [
-        "grpc++",
-        "grpc",
-        "gpr"
-      ]
-    },
-    {
-      "name": "qps",
-      "build": "private",
-      "language": "c++",
-      "headers": [
-        "test/cpp/qps/client.h",
-        "test/cpp/qps/driver.h",
-        "test/cpp/qps/histogram.h",
-        "test/cpp/qps/interarrival.h",
-        "test/cpp/qps/perf_db_client.h",
-        "test/cpp/qps/qps_worker.h",
-        "test/cpp/qps/report.h",
-        "test/cpp/qps/server.h",
-        "test/cpp/qps/stats.h",
-        "test/cpp/qps/timer.h",
-        "test/cpp/util/benchmark_config.h"
-      ],
-      "src": [
-        "test/cpp/qps/qpstest.proto",
-        "test/cpp/qps/perf_db.proto",
-        "test/cpp/qps/client_async.cc",
-        "test/cpp/qps/client_sync.cc",
-        "test/cpp/qps/driver.cc",
-        "test/cpp/qps/perf_db_client.cc",
-        "test/cpp/qps/qps_worker.cc",
-        "test/cpp/qps/report.cc",
-        "test/cpp/qps/server_async.cc",
-        "test/cpp/qps/server_sync.cc",
-        "test/cpp/qps/timer.cc",
-        "test/cpp/util/benchmark_config.cc"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc++_test_util",
-        "grpc++"
-      ]
-    },
-    {
-      "name": "grpc_csharp_ext",
-      "build": "all",
-      "language": "csharp",
-      "src": [
-        "src/csharp/ext/grpc_csharp_ext.c"
-      ],
-      "deps": [
-        "gpr",
-        "grpc"
-      ],
-      "dll": "only",
-      "vs_project_guid": "{D64C6D63-4458-4A88-AB38-35678384A7E4}"
-    }
-  ],
-  "targets": [
-    {
-      "name": "alarm_heap_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/iomgr/alarm_heap_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "alarm_list_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/iomgr/alarm_list_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "alarm_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/iomgr/alarm_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "alpn_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/transport/chttp2/alpn_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "bin_encoder_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/transport/chttp2/bin_encoder_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "chttp2_status_conversion_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/transport/chttp2/status_conversion_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "chttp2_stream_encoder_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/transport/chttp2/stream_encoder_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "chttp2_stream_map_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/transport/chttp2/stream_map_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "compression_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/compression/compression_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "dualstack_socket_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/end2end/dualstack_socket_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ],
-      "platforms": [
-        "mac",
-        "linux",
-        "posix"
-      ]
-    },
-    {
-      "name": "fd_conservation_posix_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/iomgr/fd_conservation_posix_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ],
-      "platforms": [
-        "mac",
-        "linux",
-        "posix"
-      ]
-    },
-    {
-      "name": "fd_posix_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/iomgr/fd_posix_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ],
-      "platforms": [
-        "mac",
-        "linux",
-        "posix"
-      ]
-    },
-    {
-      "name": "fling_client",
-      "build": "test",
-      "run": false,
-      "language": "c",
-      "src": [
-        "test/core/fling/client.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "fling_server",
-      "build": "test",
-      "run": false,
-      "language": "c",
-      "src": [
-        "test/core/fling/server.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "fling_stream_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/fling/fling_stream_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ],
-      "platforms": [
-        "mac",
-        "linux",
-        "posix"
-      ]
-    },
-    {
-      "name": "fling_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/fling/fling_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ],
-      "platforms": [
-        "mac",
-        "linux",
-        "posix"
-      ]
-    },
-    {
-      "name": "gen_hpack_tables",
-      "build": "tool",
-      "language": "c",
-      "src": [
-        "tools/codegen/core/gen_hpack_tables.c"
-      ],
-      "deps": [
-        "gpr",
-        "grpc"
-      ]
-    },
-    {
-      "name": "gpr_cmdline_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/support/cmdline_test.c"
-      ],
-      "deps": [
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "gpr_env_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/support/env_test.c"
-      ],
-      "deps": [
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "gpr_file_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/support/file_test.c"
-      ],
-      "deps": [
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "gpr_histogram_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/support/histogram_test.c"
-      ],
-      "deps": [
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "gpr_host_port_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/support/host_port_test.c"
-      ],
-      "deps": [
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "gpr_log_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/support/log_test.c"
-      ],
-      "deps": [
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "gpr_slice_buffer_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/support/slice_buffer_test.c"
-      ],
-      "deps": [
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "gpr_slice_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/support/slice_test.c"
-      ],
-      "deps": [
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "gpr_stack_lockfree_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/support/stack_lockfree_test.c"
-      ],
-      "deps": [
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "gpr_string_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/support/string_test.c"
-      ],
-      "deps": [
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "gpr_sync_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/support/sync_test.c"
-      ],
-      "deps": [
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "gpr_thd_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/support/thd_test.c"
-      ],
-      "deps": [
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "gpr_time_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/support/time_test.c"
-      ],
-      "deps": [
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "gpr_tls_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/support/tls_test.c"
-      ],
-      "deps": [
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "gpr_useful_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/support/useful_test.c"
-      ],
-      "deps": [
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "grpc_auth_context_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/security/auth_context_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "grpc_base64_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/security/base64_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "grpc_byte_buffer_reader_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/surface/byte_buffer_reader_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "grpc_channel_args_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/channel/channel_args_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "grpc_channel_stack_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/channel/channel_stack_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "grpc_completion_queue_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/surface/completion_queue_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "grpc_create_jwt",
-      "build": "tool",
-      "language": "c",
-      "src": [
-        "test/core/security/create_jwt.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "grpc_credentials_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/security/credentials_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "grpc_fetch_oauth2",
-      "build": "tool",
-      "language": "c",
-      "src": [
-        "test/core/security/fetch_oauth2.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "grpc_json_token_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/security/json_token_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "grpc_jwt_verifier_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/security/jwt_verifier_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "grpc_print_google_default_creds_token",
-      "build": "tool",
-      "language": "c",
-      "src": [
-        "test/core/security/print_google_default_creds_token.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "grpc_security_connector_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/security/security_connector_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "grpc_stream_op_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/transport/stream_op_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "grpc_verify_jwt",
-      "build": "tool",
-      "language": "c",
-      "src": [
-        "test/core/security/verify_jwt.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "hpack_parser_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/transport/chttp2/hpack_parser_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "hpack_table_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/transport/chttp2/hpack_table_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "httpcli_format_request_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/httpcli/format_request_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "httpcli_parser_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/httpcli/parser_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "httpcli_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/httpcli/httpcli_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ],
-      "platforms": [
-        "mac",
-        "linux",
-        "posix"
-      ]
-    },
-    {
-      "name": "json_rewrite",
-      "build": "test",
-      "run": false,
-      "language": "c",
-      "src": [
-        "test/core/json/json_rewrite.c"
-      ],
-      "deps": [
-        "grpc",
-        "gpr"
-      ]
-    },
-    {
-      "name": "json_rewrite_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/json/json_rewrite_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "json_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/json/json_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "lame_client_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/surface/lame_client_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "low_level_ping_pong_benchmark",
-      "build": "benchmark",
-      "language": "c",
-      "src": [
-        "test/core/network_benchmarks/low_level_ping_pong.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "message_compress_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/compression/message_compress_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "multi_init_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/surface/multi_init_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "multiple_server_queues_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/end2end/multiple_server_queues_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "murmur_hash_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/support/murmur_hash_test.c"
-      ],
-      "deps": [
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "no_server_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/end2end/no_server_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "resolve_address_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/iomgr/resolve_address_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "secure_endpoint_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/security/secure_endpoint_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "sockaddr_utils_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/iomgr/sockaddr_utils_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "tcp_client_posix_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/iomgr/tcp_client_posix_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ],
-      "platforms": [
-        "mac",
-        "linux",
-        "posix"
-      ]
-    },
-    {
-      "name": "tcp_posix_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/iomgr/tcp_posix_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ],
-      "platforms": [
-        "mac",
-        "linux",
-        "posix"
-      ]
-    },
-    {
-      "name": "tcp_server_posix_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/iomgr/tcp_server_posix_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ],
-      "platforms": [
-        "mac",
-        "linux",
-        "posix"
-      ]
-    },
-    {
-      "name": "time_averaged_stats_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/iomgr/time_averaged_stats_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "timeout_encoding_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/transport/chttp2/timeout_encoding_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "timers_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/profiling/timers_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "transport_metadata_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/transport/metadata_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "transport_security_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/tsi/transport_security_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "udp_server_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/iomgr/udp_server_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ],
-      "platforms": [
-        "posix"
-      ]
-    },
-    {
-      "name": "uri_parser_test",
-      "build": "test",
-      "language": "c",
-      "src": [
-        "test/core/client_config/uri_parser_test.c"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "async_end2end_test",
-      "build": "test",
-      "language": "c++",
-      "src": [
-        "test/cpp/end2end/async_end2end_test.cc"
-      ],
-      "deps": [
-        "grpc++_test_util",
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "async_streaming_ping_pong_test",
-      "build": "test",
-      "language": "c++",
-      "src": [
-        "test/cpp/qps/async_streaming_ping_pong_test.cc"
-      ],
-      "deps": [
-        "qps",
-        "grpc++_test_util",
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ],
-      "platforms": [
-        "mac",
-        "linux",
-        "posix"
-      ]
-    },
-    {
-      "name": "async_unary_ping_pong_test",
-      "build": "test",
-      "language": "c++",
-      "src": [
-        "test/cpp/qps/async_unary_ping_pong_test.cc"
-      ],
-      "deps": [
-        "qps",
-        "grpc++_test_util",
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ],
-      "platforms": [
-        "mac",
-        "linux",
-        "posix"
-      ]
-    },
-    {
-      "name": "auth_property_iterator_test",
-      "build": "test",
-      "language": "c++",
-      "src": [
-        "test/cpp/common/auth_property_iterator_test.cc"
-      ],
-      "deps": [
-        "grpc++",
-        "grpc",
-        "gpr"
-      ]
-    },
-    {
-      "name": "channel_arguments_test",
-      "build": "test",
-      "language": "c++",
-      "src": [
-        "test/cpp/client/channel_arguments_test.cc"
-      ],
-      "deps": [
-        "grpc++",
-        "grpc",
-        "gpr"
-      ]
-    },
-    {
-      "name": "cli_call_test",
-      "build": "test",
-      "language": "c++",
-      "src": [
-        "test/cpp/util/cli_call_test.cc"
-      ],
-      "deps": [
-        "grpc++_test_util",
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "client_crash_test",
-      "build": "test",
-      "language": "c++",
-      "src": [
-        "test/cpp/end2end/client_crash_test.cc"
-      ],
-      "deps": [
-        "grpc++_test_util",
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ],
-      "platforms": [
-        "mac",
-        "linux",
-        "posix"
-      ]
-    },
-    {
-      "name": "client_crash_test_server",
-      "build": "test",
-      "run": false,
-      "language": "c++",
-      "src": [
-        "test/cpp/end2end/client_crash_test_server.cc"
-      ],
-      "deps": [
-        "grpc++_test_util",
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "credentials_test",
-      "build": "test",
-      "language": "c++",
-      "src": [
-        "test/cpp/client/credentials_test.cc"
-      ],
-      "deps": [
-        "grpc++",
-        "grpc",
-        "gpr"
-      ]
-    },
-    {
-      "name": "cxx_byte_buffer_test",
-      "build": "test",
-      "language": "c++",
-      "src": [
-        "test/cpp/util/byte_buffer_test.cc"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "cxx_slice_test",
-      "build": "test",
-      "language": "c++",
-      "src": [
-        "test/cpp/util/slice_test.cc"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "cxx_string_ref_test",
-      "build": "test",
-      "language": "c++",
-      "src": [
-        "test/cpp/util/string_ref_test.cc"
-      ],
-      "deps": [
-        "grpc++"
-      ]
-    },
-    {
-      "name": "cxx_time_test",
-      "build": "test",
-      "language": "c++",
-      "src": [
-        "test/cpp/util/time_test.cc"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "end2end_test",
-      "build": "test",
-      "language": "c++",
-      "src": [
-        "test/cpp/end2end/end2end_test.cc"
-      ],
-      "deps": [
-        "grpc++_test_util",
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "generic_end2end_test",
-      "build": "test",
-      "language": "c++",
-      "src": [
-        "test/cpp/end2end/generic_end2end_test.cc"
-      ],
-      "deps": [
-        "grpc++_test_util",
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "grpc_cli",
-      "build": "test",
-      "run": false,
-      "language": "c++",
-      "src": [
-        "test/cpp/util/grpc_cli.cc"
-      ],
-      "deps": [
-        "grpc++_test_util",
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr_test_util",
-        "gpr",
-        "grpc++_test_config"
-      ]
-    },
-    {
-      "name": "grpc_cpp_plugin",
-      "build": "protoc",
-      "language": "c++",
-      "src": [
-        "src/compiler/cpp_plugin.cc"
-      ],
-      "deps": [
-        "grpc_plugin_support"
-      ],
-      "secure": "no",
-      "vs_project_guid": "{7E51A25F-AC59-488F-906C-C60FAAE706AA}"
-    },
-    {
-      "name": "grpc_csharp_plugin",
-      "build": "protoc",
-      "language": "c++",
-      "src": [
-        "src/compiler/csharp_plugin.cc"
-      ],
-      "deps": [
-        "grpc_plugin_support"
-      ],
-      "secure": "no",
-      "vs_project_guid": "{3C813052-A49A-4662-B90A-1ADBEC7EE453}"
-    },
-    {
-      "name": "grpc_objective_c_plugin",
-      "build": "protoc",
-      "language": "c++",
-      "src": [
-        "src/compiler/objective_c_plugin.cc"
-      ],
-      "deps": [
-        "grpc_plugin_support"
-      ],
-      "secure": "no",
-      "vs_project_guid": "{19564640-CEE6-4921-ABA5-676ED79A36F6}"
-    },
-    {
-      "name": "grpc_python_plugin",
-      "build": "protoc",
-      "language": "c++",
-      "src": [
-        "src/compiler/python_plugin.cc"
-      ],
-      "deps": [
-        "grpc_plugin_support"
-      ],
-      "secure": "no",
-      "vs_project_guid": "{DF52D501-A6CF-4E6F-BA38-6EBE2E8DAFB2}"
-    },
-    {
-      "name": "grpc_ruby_plugin",
-      "build": "protoc",
-      "language": "c++",
-      "src": [
-        "src/compiler/ruby_plugin.cc"
-      ],
-      "deps": [
-        "grpc_plugin_support"
-      ],
-      "secure": "no",
-      "vs_project_guid": "{069E9D05-B78B-4751-9252-D21EBAE7DE8E}"
-    },
-    {
-      "name": "interop_client",
-      "build": "test",
-      "run": false,
-      "language": "c++",
-      "src": [],
-      "deps": [
-        "interop_client_main",
-        "interop_client_helper",
-        "grpc++_test_util",
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr_test_util",
-        "gpr",
-        "grpc++_test_config"
-      ],
-      "platforms": [
-        "mac",
-        "linux",
-        "posix"
-      ]
-    },
-    {
-      "name": "interop_server",
-      "build": "test",
-      "run": false,
-      "language": "c++",
-      "src": [],
-      "deps": [
-        "interop_server_main",
-        "interop_server_helper",
-        "grpc++_test_util",
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr_test_util",
-        "gpr",
-        "grpc++_test_config"
-      ],
-      "platforms": [
-        "mac",
-        "linux",
-        "posix"
-      ]
-    },
-    {
-      "name": "interop_test",
-      "build": "test",
-      "language": "c++",
-      "src": [
-        "test/cpp/interop/interop_test.cc"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ],
-      "platforms": [
-        "mac",
-        "linux",
-        "posix"
-      ]
-    },
-    {
-      "name": "mock_test",
-      "build": "test",
-      "language": "c++",
-      "src": [
-        "test/cpp/end2end/mock_test.cc"
-      ],
-      "deps": [
-        "grpc++_test_util",
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "pubsub_client",
-      "build": "do_not_build",
-      "run": false,
-      "language": "c++",
-      "src": [
-        "examples/pubsub/main.cc"
-      ],
-      "deps": [
-        "pubsub_client_lib",
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr_test_util",
-        "gpr",
-        "grpc++_test_config"
-      ]
-    },
-    {
-      "name": "pubsub_publisher_test",
-      "build": "do_not_build",
-      "language": "c++",
-      "src": [
-        "examples/pubsub/publisher_test.cc"
-      ],
-      "deps": [
-        "pubsub_client_lib",
-        "grpc++_test_util",
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "pubsub_subscriber_test",
-      "build": "do_not_build",
-      "language": "c++",
-      "src": [
-        "examples/pubsub/subscriber_test.cc"
-      ],
-      "deps": [
-        "pubsub_client_lib",
-        "grpc++_test_util",
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "qps_driver",
-      "build": "benchmark",
-      "language": "c++",
-      "src": [
-        "test/cpp/qps/qps_driver.cc"
-      ],
-      "deps": [
-        "qps",
-        "grpc++_test_util",
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr_test_util",
-        "gpr",
-        "grpc++_test_config"
-      ]
-    },
-    {
-      "name": "qps_interarrival_test",
-      "build": "test",
-      "run": false,
-      "language": "c++",
-      "src": [
-        "test/cpp/qps/qps_interarrival_test.cc"
-      ],
-      "deps": [
-        "qps",
-        "grpc++_test_util",
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ],
-      "platforms": [
-        "mac",
-        "linux",
-        "posix"
-      ]
-    },
-    {
-      "name": "qps_openloop_test",
-      "build": "test",
-      "language": "c++",
-      "src": [
-        "test/cpp/qps/qps_openloop_test.cc"
-      ],
-      "deps": [
-        "qps",
-        "grpc++_test_util",
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr_test_util",
-        "gpr",
-        "grpc++_test_config"
-      ],
-      "platforms": [
-        "mac",
-        "linux",
-        "posix"
-      ]
-    },
-    {
-      "name": "qps_test",
-      "build": "test",
-      "language": "c++",
-      "src": [
-        "test/cpp/qps/qps_test.cc"
-      ],
-      "deps": [
-        "qps",
-        "grpc++_test_util",
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr_test_util",
-        "gpr",
-        "grpc++_test_config"
-      ],
-      "exclude_configs": [
-        "tsan"
-      ],
-      "platforms": [
-        "mac",
-        "linux",
-        "posix"
-      ]
-    },
-    {
-      "name": "qps_worker",
-      "build": "benchmark",
-      "language": "c++",
-      "headers": [
-        "test/cpp/qps/client.h",
-        "test/cpp/qps/server.h"
-      ],
-      "src": [
-        "test/cpp/qps/worker.cc"
-      ],
-      "deps": [
-        "qps",
-        "grpc++_test_util",
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr_test_util",
-        "gpr",
-        "grpc++_test_config"
-      ]
-    },
-    {
-      "name": "reconnect_interop_client",
-      "build": "test",
-      "run": false,
-      "language": "c++",
-      "src": [
-        "test/proto/empty.proto",
-        "test/proto/messages.proto",
-        "test/proto/test.proto",
-        "test/cpp/interop/reconnect_interop_client.cc"
-      ],
-      "deps": [
-        "grpc++_test_util",
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr_test_util",
-        "gpr",
-        "grpc++_test_config"
-      ]
-    },
-    {
-      "name": "reconnect_interop_server",
-      "build": "test",
-      "run": false,
-      "language": "c++",
-      "src": [
-        "test/proto/empty.proto",
-        "test/proto/messages.proto",
-        "test/proto/test.proto",
-        "test/cpp/interop/reconnect_interop_server.cc"
-      ],
-      "deps": [
-        "reconnect_server",
-        "grpc++_test_util",
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr_test_util",
-        "gpr",
-        "grpc++_test_config"
-      ]
-    },
-    {
-      "name": "secure_auth_context_test",
-      "build": "test",
-      "language": "c++",
-      "src": [
-        "test/cpp/common/secure_auth_context_test.cc"
-      ],
-      "deps": [
-        "grpc++",
-        "grpc",
-        "gpr"
-      ]
-    },
-    {
-      "name": "server_crash_test",
-      "build": "test",
-      "language": "c++",
-      "src": [
-        "test/cpp/end2end/server_crash_test.cc"
-      ],
-      "deps": [
-        "grpc++_test_util",
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ],
-      "platforms": [
-        "mac",
-        "linux",
-        "posix"
-      ]
-    },
-    {
-      "name": "server_crash_test_client",
-      "build": "test",
-      "run": false,
-      "language": "c++",
-      "src": [
-        "test/cpp/end2end/server_crash_test_client.cc"
-      ],
-      "deps": [
-        "grpc++_test_util",
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "shutdown_test",
-      "build": "test",
-      "language": "c++",
-      "src": [
-        "test/cpp/end2end/shutdown_test.cc"
-      ],
-      "deps": [
-        "grpc++_test_util",
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "status_test",
-      "build": "test",
-      "language": "c++",
-      "src": [
-        "test/cpp/util/status_test.cc"
-      ],
-      "deps": [
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "sync_streaming_ping_pong_test",
-      "build": "test",
-      "language": "c++",
-      "src": [
-        "test/cpp/qps/sync_streaming_ping_pong_test.cc"
-      ],
-      "deps": [
-        "qps",
-        "grpc++_test_util",
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ],
-      "platforms": [
-        "mac",
-        "linux",
-        "posix"
-      ]
-    },
-    {
-      "name": "sync_unary_ping_pong_test",
-      "build": "test",
-      "language": "c++",
-      "src": [
-        "test/cpp/qps/sync_unary_ping_pong_test.cc"
-      ],
-      "deps": [
-        "qps",
-        "grpc++_test_util",
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ],
-      "platforms": [
-        "mac",
-        "linux",
-        "posix"
-      ]
-    },
-    {
-      "name": "thread_stress_test",
-      "build": "test",
-      "language": "c++",
-      "src": [
-        "test/cpp/end2end/thread_stress_test.cc"
-      ],
-      "deps": [
-        "grpc++_test_util",
-        "grpc_test_util",
-        "grpc++",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ]
-    },
-    {
-      "name": "zookeeper_test",
-      "build": "test",
-      "language": "c++",
-      "src": [
-        "test/cpp/end2end/zookeeper_test.cc"
-      ],
-      "deps": [
-        "grpc++_test_util",
-        "grpc_test_util",
-        "grpc++",
-        "grpc_zookeeper",
-        "grpc",
-        "gpr_test_util",
-        "gpr"
-      ],
-      "external_deps": [
-        "zookeeper"
-      ]
-    }
-  ]
-}
diff --git a/build.yaml b/build.yaml
index d14ac0c089f4bf06e9c7c832e56f6513f0ba9b65..a968f1799e2e4e2112e69ca2b46a574550f8a1c7 100644
--- a/build.yaml
+++ b/build.yaml
@@ -178,12 +178,12 @@ filegroups:
   - src/core/json/json_common.h
   - src/core/json/json_reader.h
   - src/core/json/json_writer.h
-  - src/core/profiling/timers.h
   - src/core/statistics/census_interface.h
   - src/core/statistics/census_rpc_stats.h
   - src/core/surface/api_trace.h
   - src/core/surface/byte_buffer_queue.h
   - src/core/surface/call.h
+  - src/core/surface/call_test_only.h
   - src/core/surface/channel.h
   - src/core/surface/completion_queue.h
   - src/core/surface/event_string.h
@@ -294,8 +294,6 @@ filegroups:
   - src/core/json/json_reader.c
   - src/core/json/json_string.c
   - src/core/json/json_writer.c
-  - src/core/profiling/basic_timers.c
-  - src/core/profiling/stap_timers.c
   - src/core/surface/api_trace.c
   - src/core/surface/byte_buffer.c
   - src/core/surface/byte_buffer_queue.c
@@ -394,6 +392,7 @@ libs:
   - include/grpc/support/tls_pthread.h
   - include/grpc/support/useful.h
   headers:
+  - src/core/profiling/timers.h
   - src/core/support/block_annotate.h
   - src/core/support/env.h
   - src/core/support/file.h
@@ -404,6 +403,8 @@ libs:
   - src/core/support/thd_internal.h
   - src/core/support/time_precise.h
   src:
+  - src/core/profiling/basic_timers.c
+  - src/core/profiling/stap_timers.c
   - src/core/support/alloc.c
   - src/core/support/cmdline.c
   - src/core/support/cpu_iphone.c
@@ -439,6 +440,7 @@ libs:
   - src/core/support/thd_win32.c
   - src/core/support/time.c
   - src/core/support/time_posix.c
+  - src/core/support/time_precise.c
   - src/core/support/time_win32.c
   - src/core/support/tls_pthread.c
   secure: false
diff --git a/examples/node/greeter_client.js b/examples/node/greeter_client.js
index ddc8abbbed24e9f46d55ee116e7201bfad6840e2..175f8e6b5a8f7346279073cd18472b28487fc6b8 100644
--- a/examples/node/greeter_client.js
+++ b/examples/node/greeter_client.js
@@ -33,7 +33,7 @@
 
 var PROTO_PATH = __dirname + '/helloworld.proto';
 
-var grpc = require('grpc');
+var grpc = require('../../');
 var hello_proto = grpc.load(PROTO_PATH).helloworld;
 
 function main() {
diff --git a/examples/node/greeter_server.js b/examples/node/greeter_server.js
index 44b44afaafb799b65474efe02b5e544c0641d844..3600c8bfbf469247b896584bdf5860e991cd28f2 100644
--- a/examples/node/greeter_server.js
+++ b/examples/node/greeter_server.js
@@ -33,7 +33,7 @@
 
 var PROTO_PATH = __dirname + '/helloworld.proto';
 
-var grpc = require('grpc');
+var grpc = require('../../');
 var hello_proto = grpc.load(PROTO_PATH).helloworld;
 
 /**
diff --git a/examples/node/package.json b/examples/node/package.json
deleted file mode 100644
index f0a044f05e13dc8aa5ee3e1cf0b69c9e1cb5f681..0000000000000000000000000000000000000000
--- a/examples/node/package.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-  "name": "grpc-demo",
-  "version": "0.11.0",
-  "dependencies": {
-    "async": "^0.9.0",
-    "grpc": "~0.11.0",
-    "minimist": "^1.1.0",
-    "underscore": "^1.8.2"
-  }
-}
diff --git a/examples/node/route_guide/route_guide_client.js b/examples/node/route_guide/route_guide_client.js
index 1da6c690252c0ba824003e65009fa49de3994ae7..525d68f44cac947c36014f92c04983219952acf9 100644
--- a/examples/node/route_guide/route_guide_client.js
+++ b/examples/node/route_guide/route_guide_client.js
@@ -31,8 +31,8 @@ var async = require('async');
 var fs = require('fs');
 var parseArgs = require('minimist');
 var path = require('path');
-var _ = require('underscore');
-var grpc = require('grpc');
+var _ = require('lodash');
+var grpc = require('../../../');
 var routeguide = grpc.load(__dirname + '/route_guide.proto').routeguide;
 var client = new routeguide.RouteGuide('localhost:50051',
                                        grpc.Credentials.createInsecure());
diff --git a/examples/node/route_guide/route_guide_server.js b/examples/node/route_guide/route_guide_server.js
index faae3087fd1aba8a70d978841c72ffbe755ed2b6..5bb81446f0510974555473e025f187435e617dac 100644
--- a/examples/node/route_guide/route_guide_server.js
+++ b/examples/node/route_guide/route_guide_server.js
@@ -30,8 +30,8 @@
 var fs = require('fs');
 var parseArgs = require('minimist');
 var path = require('path');
-var _ = require('underscore');
-var grpc = require('grpc');
+var _ = require('lodash');
+var grpc = require('../../../');
 var routeguide = grpc.load(__dirname + '/route_guide.proto').routeguide;
 
 var COORD_FACTOR = 1e7;
diff --git a/examples/php/README.md b/examples/php/README.md
index a4ee8e698b9cc85bf28c2bb4e04c719b75da9da0..8fb060863a3f6077cd99aa3f653752081c80c028 100644
--- a/examples/php/README.md
+++ b/examples/php/README.md
@@ -8,7 +8,7 @@ This requires PHP 5.5 or greater.
 
 INSTALL
 -------
- - On Mac OS X, install [homebrew][]. On Linux, install [linuxbrew][]. Run the following command to install gRPC.
+ - On Mac OS X, install [homebrew][]. Run the following command to install gRPC.
 
    ```sh
    $ curl -fsSL https://goo.gl/getgrpc | bash -s php
@@ -59,7 +59,6 @@ TUTORIAL
 You can find a more detailed tutorial in [gRPC Basics: PHP][]
 
 [homebrew]:http://brew.sh
-[linuxbrew]:https://github.com/Homebrew/linuxbrew#installation
 [gRPC install script]:https://raw.githubusercontent.com/grpc/homebrew-grpc/master/scripts/install
 [Node]:https://github.com/grpc/grpc/tree/master/examples/node
 [gRPC Basics: PHP]:http://www.grpc.io/docs/tutorials/basic/php.html
diff --git a/examples/python/README.md b/examples/python/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..7b48c824baea41fa358c5a5c9a1d7426902de900
--- /dev/null
+++ b/examples/python/README.md
@@ -0,0 +1,55 @@
+gRPC in 3 minutes (Python)
+========================
+
+Background
+-------------
+For this sample, we've already generated the server and client stubs from
+[helloworld.proto][] and we'll be using a specific reference platform.
+
+Prerequisites
+-------------
+
+- Debian 8.2 "Jessie" platform with `root` access
+- `git`
+- `python2.7`
+- `pip`
+- Python development headers
+
+Set-up
+-------
+  ```sh
+  $ # install the gRPC Core:
+  $ sudo apt-get install libgrpc-dev
+  $ # install gRPC Python:
+  $ sudo pip install -U grpcio==0.11.0b1
+  $ # Since this "hello, world" example uses protocol buffers:
+  $ sudo pip install -U protobuf==3.0.0a3
+  $ # Clone the repository to get the example code:
+  $ git clone https://github.com/grpc/grpc
+  $ # Navigate to the "hello, world" Python example:
+  $ cd grpc/examples/python/helloworld
+  ```
+
+Try it!
+-------
+
+- Run the server
+
+  ```sh
+  $ python2.7 greeter_server.py &
+  ```
+
+- Run the client
+
+  ```sh
+  $ python2.7 greeter_client.py
+  ```
+
+Tutorial
+--------
+
+You can find a more detailed tutorial in [gRPC Basics: Python][]
+
+[helloworld.proto]:../protos/helloworld.proto
+[Install gRPC Python]:../../src/python#installation
+[gRPC Basics: Python]:http://www.grpc.io/docs/tutorials/basic/python.html
diff --git a/examples/python/helloworld/README.md b/examples/python/helloworld/README.md
index 070b9e8837690ec9354c8cbe1c027347551606b1..e889863a23dada241145155a320863580c0d5b6b 100644
--- a/examples/python/helloworld/README.md
+++ b/examples/python/helloworld/README.md
@@ -1,113 +1 @@
-# gRPC Python Hello World
-
-This is a quick introduction with a simple example and installation instructions: for a more complete tutorial see [gRPC Basics: Python](../route_guide).
-
-### Install gRPC
-Make sure you have built gRPC Python from source on your system. Follow the instructions here:
-[https://github.com/grpc/grpc/blob/master/src/python/README.md](https://github.com/grpc/grpc/blob/master/src/python/README.md).
-
-This gives you a python virtual environment with installed gRPC Python
-in GRPC_ROOT/python2.7_virtual_environment. GRPC_ROOT is the path to which you
-have cloned the [gRPC git repo](https://github.com/grpc/grpc).
-
-### Get the source code
-
-The example code for our Hello World and our other examples live in the `examples`
-directory. Clone this repository to your local machine by running the
-following command:
-
-
-```sh
-$ git clone https://github.com/grpc/grpc.git
-```
-
-Change your current directory to examples/python/helloworld
-
-```sh
-$ cd examples/python/helloworld/
-```
-
-### Defining a service
-
-The first step in creating our example is to define a *service*: an RPC
-service specifies the methods that can be called remotely with their parameters
-and return types. As you saw in the
-[overview](#protocolbuffers) above, gRPC does this using [protocol
-buffers](https://developers.google.com/protocol-buffers/docs/overview). We
-use the protocol buffers interface definition language (IDL) to define our
-service methods, and define the parameters and return
-types as protocol buffer message types. Both the client and the
-server use interface code generated from the service definition.
-
-Here's our example service definition. The `Greeting`
-service has one method, `hello`, that lets the server receive a single
-`HelloRequest`
-message from the remote client containing the user's name, then send back
-a greeting in a single `HelloReply`. This is the simplest type of RPC you
-can specify in gRPC.
-
-```
-syntax = "proto3";
-
-option java_package = "io.grpc.examples";
-
-package helloworld;
-
-// The greeting service definition.
-service Greeter {
-  // Sends a greeting
-  rpc SayHello (HelloRequest) returns (HelloReply) {}
-}
-
-// The request message containing the user's name.
-message HelloRequest {
-  string name = 1;
-}
-
-// The response message containing the greetings
-message HelloReply {
-  string message = 1;
-}
-
-```
-
-<a name="generating"></a>
-### Generating gRPC code
-
-Once we've defined our service, we use the protocol buffer compiler
-`protoc` to generate the special client and server code we need to create
-our application. The generated code contains both stub code for clients to
-use and an abstract interface for servers to implement, both with the method
-defined in our `Greeting` service.
-
-To generate the client and server side interfaces:
-
-```sh
-$ ./run_codegen.sh
-```
-Which internally invokes the proto-compiler as:
-
-```sh
-$ protoc -I ../../protos --python_out=. --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_python_plugin` ../../protos/helloworld.proto
-```
-
-### The client
-
-Client-side code can be found in [greeter_client.py](greeter_client.py).
-
-You can run the client using:
-
-```sh
-$ ./run_client.sh
-```
-
-
-### The server
-
-Server side code can be found in [greeter_server.py](greeter_server.py). 
-
-You can run the server using:
-
-```sh
-$ ./run_server.sh
-```
+[This code's documentation lives on the grpc.io site.](http://www.grpc.io/docs)
diff --git a/examples/python/helloworld/helloworld_pb2.py b/examples/python/helloworld/helloworld_pb2.py
new file mode 100644
index 0000000000000000000000000000000000000000..1b2674e4c8e8b26550374429da6ad74925a5bb5f
--- /dev/null
+++ b/examples/python/helloworld/helloworld_pb2.py
@@ -0,0 +1,202 @@
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: helloworld.proto
+
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf import descriptor_pb2
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='helloworld.proto',
+  package='helloworld',
+  syntax='proto3',
+  serialized_pb=b'\n\x10helloworld.proto\x12\nhelloworld\"\x1c\n\x0cHelloRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"\x1d\n\nHelloReply\x12\x0f\n\x07message\x18\x01 \x01(\t2I\n\x07Greeter\x12>\n\x08SayHello\x12\x18.helloworld.HelloRequest\x1a\x16.helloworld.HelloReply\"\x00\x42\x18\n\x10io.grpc.examples\xa2\x02\x03HLWb\x06proto3'
+)
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+
+
+
+_HELLOREQUEST = _descriptor.Descriptor(
+  name='HelloRequest',
+  full_name='helloworld.HelloRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='name', full_name='helloworld.HelloRequest.name', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=32,
+  serialized_end=60,
+)
+
+
+_HELLOREPLY = _descriptor.Descriptor(
+  name='HelloReply',
+  full_name='helloworld.HelloReply',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='message', full_name='helloworld.HelloReply.message', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=62,
+  serialized_end=91,
+)
+
+DESCRIPTOR.message_types_by_name['HelloRequest'] = _HELLOREQUEST
+DESCRIPTOR.message_types_by_name['HelloReply'] = _HELLOREPLY
+
+HelloRequest = _reflection.GeneratedProtocolMessageType('HelloRequest', (_message.Message,), dict(
+  DESCRIPTOR = _HELLOREQUEST,
+  __module__ = 'helloworld_pb2'
+  # @@protoc_insertion_point(class_scope:helloworld.HelloRequest)
+  ))
+_sym_db.RegisterMessage(HelloRequest)
+
+HelloReply = _reflection.GeneratedProtocolMessageType('HelloReply', (_message.Message,), dict(
+  DESCRIPTOR = _HELLOREPLY,
+  __module__ = 'helloworld_pb2'
+  # @@protoc_insertion_point(class_scope:helloworld.HelloReply)
+  ))
+_sym_db.RegisterMessage(HelloReply)
+
+
+DESCRIPTOR.has_options = True
+DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), b'\n\020io.grpc.examples\242\002\003HLW')
+import abc
+from grpc.beta import implementations as beta_implementations
+from grpc.early_adopter import implementations as early_adopter_implementations
+from grpc.framework.alpha import utilities as alpha_utilities
+from grpc.framework.common import cardinality
+from grpc.framework.interfaces.face import utilities as face_utilities
+class EarlyAdopterGreeterServicer(object):
+  """<fill me in later!>"""
+  __metaclass__ = abc.ABCMeta
+  @abc.abstractmethod
+  def SayHello(self, request, context):
+    raise NotImplementedError()
+class EarlyAdopterGreeterServer(object):
+  """<fill me in later!>"""
+  __metaclass__ = abc.ABCMeta
+  @abc.abstractmethod
+  def start(self):
+    raise NotImplementedError()
+  @abc.abstractmethod
+  def stop(self):
+    raise NotImplementedError()
+class EarlyAdopterGreeterStub(object):
+  """<fill me in later!>"""
+  __metaclass__ = abc.ABCMeta
+  @abc.abstractmethod
+  def SayHello(self, request):
+    raise NotImplementedError()
+  SayHello.async = None
+def early_adopter_create_Greeter_server(servicer, port, private_key=None, certificate_chain=None):
+  import helloworld_pb2
+  import helloworld_pb2
+  method_service_descriptions = {
+    "SayHello": alpha_utilities.unary_unary_service_description(
+      servicer.SayHello,
+      helloworld_pb2.HelloRequest.FromString,
+      helloworld_pb2.HelloReply.SerializeToString,
+    ),
+  }
+  return early_adopter_implementations.server("helloworld.Greeter", method_service_descriptions, port, private_key=private_key, certificate_chain=certificate_chain)
+def early_adopter_create_Greeter_stub(host, port, metadata_transformer=None, secure=False, root_certificates=None, private_key=None, certificate_chain=None, server_host_override=None):
+  import helloworld_pb2
+  import helloworld_pb2
+  method_invocation_descriptions = {
+    "SayHello": alpha_utilities.unary_unary_invocation_description(
+      helloworld_pb2.HelloRequest.SerializeToString,
+      helloworld_pb2.HelloReply.FromString,
+    ),
+  }
+  return early_adopter_implementations.stub("helloworld.Greeter", method_invocation_descriptions, host, port, metadata_transformer=metadata_transformer, secure=secure, root_certificates=root_certificates, private_key=private_key, certificate_chain=certificate_chain, server_host_override=server_host_override)
+
+class BetaGreeterServicer(object):
+  """<fill me in later!>"""
+  __metaclass__ = abc.ABCMeta
+  @abc.abstractmethod
+  def SayHello(self, request, context):
+    raise NotImplementedError()
+
+class BetaGreeterStub(object):
+  """The interface to which stubs will conform."""
+  __metaclass__ = abc.ABCMeta
+  @abc.abstractmethod
+  def SayHello(self, request, timeout):
+    raise NotImplementedError()
+  SayHello.future = None
+
+def beta_create_Greeter_server(servicer, pool=None, pool_size=None, default_timeout=None, maximum_timeout=None):
+  import helloworld_pb2
+  import helloworld_pb2
+  request_deserializers = {
+    ('helloworld.Greeter', 'SayHello'): helloworld_pb2.HelloRequest.FromString,
+  }
+  response_serializers = {
+    ('helloworld.Greeter', 'SayHello'): helloworld_pb2.HelloReply.SerializeToString,
+  }
+  method_implementations = {
+    ('helloworld.Greeter', 'SayHello'): face_utilities.unary_unary_inline(servicer.SayHello),
+  }
+  server_options = beta_implementations.server_options(request_deserializers=request_deserializers, response_serializers=response_serializers, thread_pool=pool, thread_pool_size=pool_size, default_timeout=default_timeout, maximum_timeout=maximum_timeout)
+  return beta_implementations.server(method_implementations, options=server_options)
+
+def beta_create_Greeter_stub(channel, host=None, metadata_transformer=None, pool=None, pool_size=None):
+  import helloworld_pb2
+  import helloworld_pb2
+  request_serializers = {
+    ('helloworld.Greeter', 'SayHello'): helloworld_pb2.HelloRequest.SerializeToString,
+  }
+  response_deserializers = {
+    ('helloworld.Greeter', 'SayHello'): helloworld_pb2.HelloReply.FromString,
+  }
+  cardinalities = {
+    'SayHello': cardinality.Cardinality.UNARY_UNARY,
+  }
+  stub_options = beta_implementations.stub_options(host=host, metadata_transformer=metadata_transformer, request_serializers=request_serializers, response_deserializers=response_deserializers, thread_pool=pool, thread_pool_size=pool_size)
+  return beta_implementations.dynamic_stub(channel, 'helloworld.Greeter', cardinalities, options=stub_options)
+# @@protoc_insertion_point(module_scope)
diff --git a/examples/python/route_guide/README.md b/examples/python/route_guide/README.md
index cb1aa7d78ae34cda62b57f04a6f39e424dbaf4ed..17b8a8edd5e14f1e5968bab0c2c2e99c24c267bb 100644
--- a/examples/python/route_guide/README.md
+++ b/examples/python/route_guide/README.md
@@ -1,299 +1 @@
-#gRPC Basics: Python
-
-This tutorial provides a basic Python programmer's introduction to working with gRPC. By walking through this example you'll learn how to:
-
-- Define a service in a .proto file.
-- Generate server and client code using the protocol buffer compiler.
-- Use the Python gRPC API to write a simple client and server for your service.
-
-It assumes that you have read the [Getting started](https://github.com/grpc/grpc/tree/master/examples) guide and are familiar with [protocol buffers] (https://developers.google.com/protocol-buffers/docs/overview). Note that the example in this tutorial uses the proto3 version of the protocol buffers language, which is currently in alpha release:you can find out more in the [proto3 language guide](https://developers.google.com/protocol-buffers/docs/proto3) and see the [release notes](https://github.com/google/protobuf/releases) for the new version in the protocol buffers Github repository.
-
-This isn't a comprehensive guide to using gRPC in Python: more reference documentation is coming soon.
-
-
-## Why use gRPC?
-
-This example is a simple route mapping application that lets clients get information about features on their route, create a summary of their route, and exchange route information such as traffic updates with the server and other clients.
-
-With gRPC you can define your service once in a .proto file and implement clients and servers in any of gRPC's supported languages, which in turn can be run in environments ranging from servers inside Google to your own tablet, with all the complexity of communication between different languages and environments is handled for you by gRPC. You also get all the advantages of working with protocol buffers, including efficient serialization, a simple IDL, and easy interface updating.
-
-## Example code and setup
-
-The example code for this tutorial is in [examples/python/route_guide](.). To download the example, clone this repository by running the following command:
-```shell
-$ git clone https://github.com/grpc/grpc.git
-```
-
-Then change your current directory to `examples/python/route_guide`:
-```shell
-$ cd examples/python/route_guide
-```
-
-You also should have the relevant tools installed to generate the server and client interface code - if you don't already, follow the setup instructions in [the Python quick start guide](../helloworld).
-
-## Defining the service
-
-Your first step (as you'll know from [Getting started](https://github.com/grpc/grpc/tree/master/examples)) is to define the gRPC *service* and the method *request* and *response* types using [protocol buffers](https://developers.google.com/protocol-buffers/docs/overview). You can see the complete .proto file in [`examples/protos/route_guide.proto`](../../protos/route_guide.proto).
-
-To define a service, you specify a named `service` in your .proto file:
-
-```protobuf
-service RouteGuide {
-   // (Method definitions not shown)
-}
-```
-
-Then you define `rpc` methods inside your service definition, specifying their request and response types. gRPC lets you define four kinds of service method, all of which are used in the `RouteGuide` service:
-
-- A *simple RPC* where the client sends a request to the server using the stub and waits for a response to come back, just like a normal function call.
-```protobuf
-   // Obtains the feature at a given position.
-   rpc GetFeature(Point) returns (Feature) {}
-```
-
-- A *response-streaming RPC* where the client sends a request to the server and gets a stream to read a sequence of messages back. The client reads from the returned stream until there are no more messages. As you can see in the example, you specify a response-streaming method by placing the `stream` keyword before the *response* type.
-```protobuf
-  // Obtains the Features available within the given Rectangle.  Results are
-  // streamed rather than returned at once (e.g. in a response message with a
-  // repeated field), as the rectangle may cover a large area and contain a
-  // huge number of features.
-  rpc ListFeatures(Rectangle) returns (stream Feature) {}
-```
-
-- A *request-streaming RPC* where the client writes a sequence of messages and sends them to the server, again using a provided stream. Once the client has finished writing the messages, it waits for the server to read them all and return its response. You specify a request-streaming method by placing the `stream` keyword before the *request* type.
-```protobuf
-  // Accepts a stream of Points on a route being traversed, returning a
-  // RouteSummary when traversal is completed.
-  rpc RecordRoute(stream Point) returns (RouteSummary) {}
-```
-
-- A *bidirectionally-streaming RPC* where both sides send a sequence of messages using a read-write stream. The two streams operate independently, so clients and servers can read and write in whatever order they like: for example, the server could wait to receive all the client messages before writing its responses, or it could alternately read a message then write a message, or some other combination of reads and writes. The order of messages in each stream is preserved. You specify this type of method by placing the `stream` keyword before both the request and the response.
-```protobuf
-  // Accepts a stream of RouteNotes sent while a route is being traversed,
-  // while receiving other RouteNotes (e.g. from other users).
-  rpc RouteChat(stream RouteNote) returns (stream RouteNote) {}
-```
-
-Your .proto file also contains protocol buffer message type definitions for all the request and response types used in our service methods - for example, here's the `Point` message type:
-```protobuf
-// Points are represented as latitude-longitude pairs in the E7 representation
-// (degrees multiplied by 10**7 and rounded to the nearest integer).
-// Latitudes should be in the range +/- 90 degrees and longitude should be in
-// the range +/- 180 degrees (inclusive).
-message Point {
-  int32 latitude = 1;
-  int32 longitude = 2;
-}
-```
-
-## Generating client and server code
-
-Next you need to generate the gRPC client and server interfaces from your .proto service definition. You do this using the protocol buffer compiler `protoc` with a special gRPC Python plugin. Make sure you've installed protoc and followed the gRPC Python plugin [installation instructions](https://github.com/grpc/grpc/blob/master/INSTALL) first):
-
-With `protoc` and the gRPC Python plugin installed, use the following command to generate the Python code:
-
-```shell
-$ protoc -I ../../protos --python_out=. --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_python_plugin` ../../protos/route_guide.proto
-```
-
-Note that as we've already provided a version of the generated code in the example repository, running this command regenerates the appropriate file rather than creates a new one. The generated code file is called `route_guide_pb2.py` and contains:
-- classes for the messages defined in route_guide.proto
-- abstract classes for the service defined in route_guide.proto
-   - `BetaRouteGuideServicer`, which defines the interface for implementations of the RouteGuide service
-   - `BetaRouteGuideStub`, which can be used by clients to invoke RouteGuide RPCs
-- functions for application use
-   - `beta_create_RouteGuide_server`, which creates a gRPC server given a `BetaRouteGuideServicer` object
-   - `beta_create_RouteGuide_stub`, which can be used by clients to create a stub object
-
-<a name="server"></a>
-## Creating the server
-
-First let's look at how you create a `RouteGuide` server. If you're only interested in creating gRPC clients, you can skip this section and go straight to [Creating the client](#client) (though you might find it interesting anyway!).
-
-Creating and running a `RouteGuide` server breaks down into two work items:
-- Implementing the servicer interface generated from our service definition with functions that perform the actual "work" of the service.
-- Running a gRPC server to listen for requests from clients and transmit responses.
-
-You can find the example `RouteGuide` server in [route_guide_server.py](route_guide_server.py).
-
-### Implementing RouteGuide
-
-`route_guide_server.py` has a `RouteGuideServicer` class that implements the generated interface `route_guide_pb2.BetaRouteGuideServicer`:
-
-```python
-# RouteGuideServicer provides an implementation of the methods of the RouteGuide service.
-class RouteGuideServicer(route_guide_pb2.BetaRouteGuideServicer):
-```
-
-`RouteGuideServicer` implements all the `RouteGuide` service methods.
-
-#### Simple RPC
-
-Let's look at the simplest type first, `GetFeature`, which just gets a `Point` from the client and returns the corresponding feature information from its database in a `Feature`.
-
-```python
-  def GetFeature(self, request, context):
-    feature = get_feature(self.db, request)
-    if feature is None:
-      return route_guide_pb2.Feature(name="", location=request)
-    else:
-      return feature
-```
-
-The method is passed a `route_guide_pb2.Point` request for the RPC, and a `ServicerContext` object that provides RPC-specific information such as timeout limits. It returns a `route_guide_pb2.Feature` response.
-
-#### Response-streaming RPC
-
-Now let's look at the next method. `ListFeatures` is a response-streaming RPC that sends multiple `Feature`s to the client.
-
-```python
-  def ListFeatures(self, request, context):
-    left = min(request.lo.longitude, request.hi.longitude)
-    right = max(request.lo.longitude, request.hi.longitude)
-    top = max(request.lo.latitude, request.hi.latitude)
-    bottom = min(request.lo.latitude, request.hi.latitude)
-    for feature in self.db:
-      if (feature.location.longitude >= left and
-          feature.location.longitude <= right and
-          feature.location.latitude >= bottom and
-          feature.location.latitude <= top):
-        yield feature
-```
-
-Here the request message is a `route_guide_pb2.Rectangle` within which the client wants to find `Feature`s. Instead of returning a single response the method yields zero or more responses.
-
-#### Request-streaming RPC
-
-The request-streaming method `RecordRoute` uses an [iterator](https://docs.python.org/2/library/stdtypes.html#iterator-types) of request values and returns a single response value.
-
-```python
-  def RecordRoute(self, request_iterator, context):
-    point_count = 0
-    feature_count = 0
-    distance = 0.0
-    prev_point = None
-
-    start_time = time.time()
-    for point in request_iterator:
-      point_count += 1
-      if get_feature(self.db, point):
-        feature_count += 1
-      if prev_point:
-        distance += get_distance(prev_point, point)
-      prev_point = point
-
-    elapsed_time = time.time() - start_time
-    return route_guide_pb2.RouteSummary(point_count=point_count,
-                                        feature_count=feature_count,
-                                        distance=int(distance),
-                                        elapsed_time=int(elapsed_time))
-```
-
-#### Bidirectional streaming RPC
-
-Lastly let's look at the bidirectionally-streaming method `RouteChat`.
-
-```python
-  def RouteChat(self, request_iterator, context):
-    prev_notes = []
-    for new_note in request_iterator:
-      for prev_note in prev_notes:
-        if prev_note.location == new_note.location:
-          yield prev_note
-      prev_notes.append(new_note)
-```
-
-This method's semantics are a combination of those of the request-streaming method and the response-streaming method. It is passed an iterator of request values and is itself an iterator of response values.
-
-### Starting the server
-
-Once you have implemented all the `RouteGuide` methods, the next step is to start up a gRPC server so that clients can actually use your service:
-
-```python
-def serve():
-  server = route_guide_pb2.beta_create_RouteGuide_server(RouteGuideServicer())
-  server.add_insecure_port('[::]:50051')
-  server.start()
-```
-
-Because `start()` does not block you may need to sleep-loop if there is nothing else for your code to do while serving.
-
-<a name="client"></a>
-## Creating the client
-
-You can see the complete example client code in [route_guide_client.py](route_guide_client.py).
-
-### Creating a stub
-
-To call service methods, we first need to create a *stub*.
-
-We use the `beta_create_RouteGuide_stub` function of the `route_guide_pb2` module, generated from our .proto.
-
-```python
-channel = implementations.insecure_channel('localhost', 50051)
-stub = beta_create_RouteGuide_stub(channel)
-```
-
-The returned object implements all the methods defined by the `BetaRouteGuideStub` interface.
-
-### Calling service methods
-
-For RPC methods that return a single response ("response-unary" methods), gRPC Python supports both synchronous (blocking) and asynchronous (non-blocking) control flow semantics. For response-streaming RPC methods, calls immediately return an iterator of response values. Calls to that iterator's `next()` method block until the response to be yielded from the iterator becomes available.
-
-#### Simple RPC
-
-A synchronous call to the simple RPC `GetFeature` is nearly as straightforward as calling a local method. The RPC call waits for the server to respond, and will either return a response or raise an exception:
-
-```python
-feature = stub.GetFeature(point, timeout_in_seconds)
-```
-
-An asynchronous call to `GetFeature` is similar, but like calling a local method asynchronously in a thread pool:
-
-```python
-feature_future = stub.GetFeature.future(point, timeout_in_seconds)
-feature = feature_future.result()
-```
-
-#### Response-streaming RPC
-
-Calling the response-streaming `ListFeatures` is similar to working with sequence types:
-
-```python
-for feature in stub.ListFeatures(rectangle, timeout_in_seconds):
-```
-
-#### Request-streaming RPC
-
-Calling the request-streaming `RecordRoute` is similar to passing a sequence to a local method. Like the simple RPC above that also returns a single response, it can be called synchronously or asynchronously:
-
-```python
-route_summary = stub.RecordRoute(point_sequence, timeout_in_seconds)
-```
-
-```python
-route_summary_future = stub.RecordRoute.future(point_sequence, timeout_in_seconds)
-route_summary = route_summary_future.result()
-```
-
-#### Bidirectional streaming RPC
-
-Calling the bidirectionally-streaming `RouteChat` has (as is the case on the service-side) a combination of the request-streaming and response-streaming semantics:
-
-```python
-for received_route_note in stub.RouteChat(sent_routes, timeout_in_seconds):
-```
-
-## Try it out!
-
-Run the server, which will listen on port 50051:
-
-```shell
-$ python route_guide_server.py
-```
-
-Run the client (in a different terminal):
-
-```shell
-$ python route_guide_client.py
-```
+[This code's documentation lives on the grpc.io site.](http://www.grpc.io/docs/tutorials/basic/python.html)
diff --git a/gRPC.podspec b/gRPC.podspec
index f79a1b7599fccace3e35d9f6859c7f51a638fcac..93a6e64da17a6eaf81ba93dff5bf0af4b93ccf32 100644
--- a/gRPC.podspec
+++ b/gRPC.podspec
@@ -63,7 +63,8 @@ Pod::Spec.new do |s|
 
   # Core cross-platform gRPC library, written in C.
   s.subspec 'C-Core' do |ss|
-    ss.source_files = 'src/core/support/block_annotate.h',
+    ss.source_files = 'src/core/profiling/timers.h',
+                      'src/core/support/block_annotate.h',
                       'src/core/support/env.h',
                       'src/core/support/file.h',
                       'src/core/support/murmur_hash.h',
@@ -99,6 +100,8 @@ Pod::Spec.new do |s|
                       'grpc/support/tls_msvc.h',
                       'grpc/support/tls_pthread.h',
                       'grpc/support/useful.h',
+                      'src/core/profiling/basic_timers.c',
+                      'src/core/profiling/stap_timers.c',
                       'src/core/support/alloc.c',
                       'src/core/support/cmdline.c',
                       'src/core/support/cpu_iphone.c',
@@ -134,6 +137,7 @@ Pod::Spec.new do |s|
                       'src/core/support/thd_win32.c',
                       'src/core/support/time.c',
                       'src/core/support/time_posix.c',
+                      'src/core/support/time_precise.c',
                       'src/core/support/time_win32.c',
                       'src/core/support/tls_pthread.c',
                       'src/core/security/auth_filters.h',
@@ -222,12 +226,12 @@ Pod::Spec.new do |s|
                       'src/core/json/json_common.h',
                       'src/core/json/json_reader.h',
                       'src/core/json/json_writer.h',
-                      'src/core/profiling/timers.h',
                       'src/core/statistics/census_interface.h',
                       'src/core/statistics/census_rpc_stats.h',
                       'src/core/surface/api_trace.h',
                       'src/core/surface/byte_buffer_queue.h',
                       'src/core/surface/call.h',
+                      'src/core/surface/call_test_only.h',
                       'src/core/surface/channel.h',
                       'src/core/surface/completion_queue.h',
                       'src/core/surface/event_string.h',
@@ -368,8 +372,6 @@ Pod::Spec.new do |s|
                       'src/core/json/json_reader.c',
                       'src/core/json/json_string.c',
                       'src/core/json/json_writer.c',
-                      'src/core/profiling/basic_timers.c',
-                      'src/core/profiling/stap_timers.c',
                       'src/core/surface/api_trace.c',
                       'src/core/surface/byte_buffer.c',
                       'src/core/surface/byte_buffer_queue.c',
@@ -420,7 +422,8 @@ Pod::Spec.new do |s|
                       'src/core/census/operation.c',
                       'src/core/census/tracing.c'
 
-    ss.private_header_files = 'src/core/support/block_annotate.h',
+    ss.private_header_files = 'src/core/profiling/timers.h',
+                              'src/core/support/block_annotate.h',
                               'src/core/support/env.h',
                               'src/core/support/file.h',
                               'src/core/support/murmur_hash.h',
@@ -515,12 +518,12 @@ Pod::Spec.new do |s|
                               'src/core/json/json_common.h',
                               'src/core/json/json_reader.h',
                               'src/core/json/json_writer.h',
-                              'src/core/profiling/timers.h',
                               'src/core/statistics/census_interface.h',
                               'src/core/statistics/census_rpc_stats.h',
                               'src/core/surface/api_trace.h',
                               'src/core/surface/byte_buffer_queue.h',
                               'src/core/surface/call.h',
+                              'src/core/surface/call_test_only.h',
                               'src/core/surface/channel.h',
                               'src/core/surface/completion_queue.h',
                               'src/core/surface/event_string.h',
diff --git a/grpc.gyp b/grpc.gyp
deleted file mode 100644
index 7b3a8fba4d329533b0590c2a5111caa324b8cec1..0000000000000000000000000000000000000000
--- a/grpc.gyp
+++ /dev/null
@@ -1,13609 +0,0 @@
-# GRPC gyp file
-# This currently builds C code.
-# This file has been automatically generated from a template file.
-# Please look at the templates directory instead.
-# This file can be regenerated from the template by running
-# tools/buildgen/generate_projects.sh
-
-# Copyright 2015, Google Inc.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-#     * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-#     * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-# Some of this file is built with the help of
-# https://n8.io/converting-a-c-library-to-gyp/
-{
-  # TODO: Finish windows support
-  'target_defaults': {
-    'default_configuration': 'Debug',
-    'configurations': {
-      'Debug': {
-        'defines': [ 'DEBUG', '_DEBUG' ],
-        'msvs_settings': {
-          'VCCLCompilerTool': {
-            'RuntimeLibrary': 1, # static debug
-          },
-        },
-      },
-      'Release': {
-        'defines': [ 'NDEBUG' ],
-        'msvs_settings': {
-          'VCCLCompilerTool': {
-            'RuntimeLibrary': 0, # static release
-          },
-        },
-      }
-    },
-    'msvs_settings': {
-      'VCLinkerTool': {
-        'GenerateDebugInformation': 'true',
-      },
-    },
-    # TODO: Add fallback for Windows, and if pkg-config is not available
-    'defines': [
-      'TSI_OPENSSL_ALPN_SUPPORT=<!(pkg-config --atleast-version=1.0.2 openssl >/dev/null 2>&1 && echo 1 || echo 0)'
-    ],
-    'include_dirs': [
-      '.',
-      'include'
-    ],
-    # TODO: Check for libraries with pkg-config
-    'libraries': [
-      '-lcrypto',
-      '-lssl',
-      '-ldl',
-      '-lpthread',
-      '-lz'
-    ]
-  },
-  'targets': [
-    # TODO: Add C++ targets
-    {
-      'target_name': 'gpr',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-      ],
-      'sources': [
-        'src/core/support/alloc.c',
-        'src/core/support/cmdline.c',
-        'src/core/support/cpu_iphone.c',
-        'src/core/support/cpu_linux.c',
-        'src/core/support/cpu_posix.c',
-        'src/core/support/cpu_windows.c',
-        'src/core/support/env_linux.c',
-        'src/core/support/env_posix.c',
-        'src/core/support/env_win32.c',
-        'src/core/support/file.c',
-        'src/core/support/file_posix.c',
-        'src/core/support/file_win32.c',
-        'src/core/support/histogram.c',
-        'src/core/support/host_port.c',
-        'src/core/support/log.c',
-        'src/core/support/log_android.c',
-        'src/core/support/log_linux.c',
-        'src/core/support/log_posix.c',
-        'src/core/support/log_win32.c',
-        'src/core/support/murmur_hash.c',
-        'src/core/support/slice.c',
-        'src/core/support/slice_buffer.c',
-        'src/core/support/stack_lockfree.c',
-        'src/core/support/string.c',
-        'src/core/support/string_posix.c',
-        'src/core/support/string_win32.c',
-        'src/core/support/subprocess_posix.c',
-        'src/core/support/sync.c',
-        'src/core/support/sync_posix.c',
-        'src/core/support/sync_win32.c',
-        'src/core/support/thd.c',
-        'src/core/support/thd_posix.c',
-        'src/core/support/thd_win32.c',
-        'src/core/support/time.c',
-        'src/core/support/time_posix.c',
-        'src/core/support/time_win32.c',
-        'src/core/support/tls_pthread.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'gpr_test_util',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'gpr',
-      ],
-      'sources': [
-        'test/core/util/test_config.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'grpc',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'gpr',
-      ],
-      'sources': [
-        'src/core/httpcli/httpcli_security_connector.c',
-        'src/core/security/base64.c',
-        'src/core/security/client_auth_filter.c',
-        'src/core/security/credentials.c',
-        'src/core/security/credentials_metadata.c',
-        'src/core/security/credentials_posix.c',
-        'src/core/security/credentials_win32.c',
-        'src/core/security/google_default_credentials.c',
-        'src/core/security/handshake.c',
-        'src/core/security/json_token.c',
-        'src/core/security/jwt_verifier.c',
-        'src/core/security/secure_endpoint.c',
-        'src/core/security/security_connector.c',
-        'src/core/security/security_context.c',
-        'src/core/security/server_auth_filter.c',
-        'src/core/security/server_secure_chttp2.c',
-        'src/core/surface/init_secure.c',
-        'src/core/surface/secure_channel_create.c',
-        'src/core/tsi/fake_transport_security.c',
-        'src/core/tsi/ssl_transport_security.c',
-        'src/core/tsi/transport_security.c',
-        'src/core/census/grpc_context.c',
-        'src/core/census/grpc_filter.c',
-        'src/core/channel/channel_args.c',
-        'src/core/channel/channel_stack.c',
-        'src/core/channel/client_channel.c',
-        'src/core/channel/client_uchannel.c',
-        'src/core/channel/compress_filter.c',
-        'src/core/channel/connected_channel.c',
-        'src/core/channel/http_client_filter.c',
-        'src/core/channel/http_server_filter.c',
-        'src/core/channel/noop_filter.c',
-        'src/core/client_config/client_config.c',
-        'src/core/client_config/connector.c',
-        'src/core/client_config/lb_policies/pick_first.c',
-        'src/core/client_config/lb_policies/round_robin.c',
-        'src/core/client_config/lb_policy.c',
-        'src/core/client_config/lb_policy_factory.c',
-        'src/core/client_config/lb_policy_registry.c',
-        'src/core/client_config/resolver.c',
-        'src/core/client_config/resolver_factory.c',
-        'src/core/client_config/resolver_registry.c',
-        'src/core/client_config/resolvers/dns_resolver.c',
-        'src/core/client_config/resolvers/sockaddr_resolver.c',
-        'src/core/client_config/subchannel.c',
-        'src/core/client_config/subchannel_factory.c',
-        'src/core/client_config/subchannel_factory_decorators/add_channel_arg.c',
-        'src/core/client_config/subchannel_factory_decorators/merge_channel_args.c',
-        'src/core/client_config/uri_parser.c',
-        'src/core/compression/algorithm.c',
-        'src/core/compression/message_compress.c',
-        'src/core/debug/trace.c',
-        'src/core/httpcli/format_request.c',
-        'src/core/httpcli/httpcli.c',
-        'src/core/httpcli/parser.c',
-        'src/core/iomgr/alarm.c',
-        'src/core/iomgr/alarm_heap.c',
-        'src/core/iomgr/closure.c',
-        'src/core/iomgr/endpoint.c',
-        'src/core/iomgr/endpoint_pair_posix.c',
-        'src/core/iomgr/endpoint_pair_windows.c',
-        'src/core/iomgr/exec_ctx.c',
-        'src/core/iomgr/fd_posix.c',
-        'src/core/iomgr/iocp_windows.c',
-        'src/core/iomgr/iomgr.c',
-        'src/core/iomgr/iomgr_posix.c',
-        'src/core/iomgr/iomgr_windows.c',
-        'src/core/iomgr/pollset_multipoller_with_epoll.c',
-        'src/core/iomgr/pollset_multipoller_with_poll_posix.c',
-        'src/core/iomgr/pollset_posix.c',
-        'src/core/iomgr/pollset_set_posix.c',
-        'src/core/iomgr/pollset_set_windows.c',
-        'src/core/iomgr/pollset_windows.c',
-        'src/core/iomgr/resolve_address_posix.c',
-        'src/core/iomgr/resolve_address_windows.c',
-        'src/core/iomgr/sockaddr_utils.c',
-        'src/core/iomgr/socket_utils_common_posix.c',
-        'src/core/iomgr/socket_utils_linux.c',
-        'src/core/iomgr/socket_utils_posix.c',
-        'src/core/iomgr/socket_windows.c',
-        'src/core/iomgr/tcp_client_posix.c',
-        'src/core/iomgr/tcp_client_windows.c',
-        'src/core/iomgr/tcp_posix.c',
-        'src/core/iomgr/tcp_server_posix.c',
-        'src/core/iomgr/tcp_server_windows.c',
-        'src/core/iomgr/tcp_windows.c',
-        'src/core/iomgr/time_averaged_stats.c',
-        'src/core/iomgr/udp_server.c',
-        'src/core/iomgr/wakeup_fd_eventfd.c',
-        'src/core/iomgr/wakeup_fd_nospecial.c',
-        'src/core/iomgr/wakeup_fd_pipe.c',
-        'src/core/iomgr/wakeup_fd_posix.c',
-        'src/core/iomgr/workqueue_posix.c',
-        'src/core/iomgr/workqueue_windows.c',
-        'src/core/json/json.c',
-        'src/core/json/json_reader.c',
-        'src/core/json/json_string.c',
-        'src/core/json/json_writer.c',
-        'src/core/profiling/basic_timers.c',
-        'src/core/profiling/stap_timers.c',
-        'src/core/surface/api_trace.c',
-        'src/core/surface/byte_buffer.c',
-        'src/core/surface/byte_buffer_queue.c',
-        'src/core/surface/byte_buffer_reader.c',
-        'src/core/surface/call.c',
-        'src/core/surface/call_details.c',
-        'src/core/surface/call_log_batch.c',
-        'src/core/surface/channel.c',
-        'src/core/surface/channel_connectivity.c',
-        'src/core/surface/channel_create.c',
-        'src/core/surface/completion_queue.c',
-        'src/core/surface/event_string.c',
-        'src/core/surface/init.c',
-        'src/core/surface/lame_client.c',
-        'src/core/surface/metadata_array.c',
-        'src/core/surface/server.c',
-        'src/core/surface/server_chttp2.c',
-        'src/core/surface/server_create.c',
-        'src/core/surface/version.c',
-        'src/core/transport/chttp2/alpn.c',
-        'src/core/transport/chttp2/bin_encoder.c',
-        'src/core/transport/chttp2/frame_data.c',
-        'src/core/transport/chttp2/frame_goaway.c',
-        'src/core/transport/chttp2/frame_ping.c',
-        'src/core/transport/chttp2/frame_rst_stream.c',
-        'src/core/transport/chttp2/frame_settings.c',
-        'src/core/transport/chttp2/frame_window_update.c',
-        'src/core/transport/chttp2/hpack_parser.c',
-        'src/core/transport/chttp2/hpack_table.c',
-        'src/core/transport/chttp2/huffsyms.c',
-        'src/core/transport/chttp2/incoming_metadata.c',
-        'src/core/transport/chttp2/parsing.c',
-        'src/core/transport/chttp2/status_conversion.c',
-        'src/core/transport/chttp2/stream_encoder.c',
-        'src/core/transport/chttp2/stream_lists.c',
-        'src/core/transport/chttp2/stream_map.c',
-        'src/core/transport/chttp2/timeout_encoding.c',
-        'src/core/transport/chttp2/varint.c',
-        'src/core/transport/chttp2/writing.c',
-        'src/core/transport/chttp2_transport.c',
-        'src/core/transport/connectivity_state.c',
-        'src/core/transport/metadata.c',
-        'src/core/transport/stream_op.c',
-        'src/core/transport/transport.c',
-        'src/core/transport/transport_op_string.c',
-        'src/core/census/context.c',
-        'src/core/census/initialize.c',
-        'src/core/census/operation.c',
-        'src/core/census/tracing.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'grpc_test_util',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'gpr',
-        'gpr_test_util',
-        'grpc',
-      ],
-      'sources': [
-        'test/core/end2end/data/server1_cert.c',
-        'test/core/end2end/data/server1_key.c',
-        'test/core/end2end/data/test_root_cert.c',
-        'test/core/end2end/cq_verifier.c',
-        'test/core/end2end/fixtures/proxy.c',
-        'test/core/iomgr/endpoint_tests.c',
-        'test/core/security/oauth2_utils.c',
-        'test/core/util/grpc_profiler.c',
-        'test/core/util/parse_hexstring.c',
-        'test/core/util/port_posix.c',
-        'test/core/util/port_windows.c',
-        'test/core/util/slice_splitter.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'grpc_test_util_unsecure',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'gpr',
-        'gpr_test_util',
-        'grpc',
-      ],
-      'sources': [
-        'test/core/end2end/cq_verifier.c',
-        'test/core/end2end/fixtures/proxy.c',
-        'test/core/iomgr/endpoint_tests.c',
-        'test/core/security/oauth2_utils.c',
-        'test/core/util/grpc_profiler.c',
-        'test/core/util/parse_hexstring.c',
-        'test/core/util/port_posix.c',
-        'test/core/util/port_windows.c',
-        'test/core/util/slice_splitter.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'grpc_unsecure',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'gpr',
-      ],
-      'sources': [
-        'src/core/surface/init_unsecure.c',
-        'src/core/census/grpc_context.c',
-        'src/core/census/grpc_filter.c',
-        'src/core/channel/channel_args.c',
-        'src/core/channel/channel_stack.c',
-        'src/core/channel/client_channel.c',
-        'src/core/channel/client_uchannel.c',
-        'src/core/channel/compress_filter.c',
-        'src/core/channel/connected_channel.c',
-        'src/core/channel/http_client_filter.c',
-        'src/core/channel/http_server_filter.c',
-        'src/core/channel/noop_filter.c',
-        'src/core/client_config/client_config.c',
-        'src/core/client_config/connector.c',
-        'src/core/client_config/lb_policies/pick_first.c',
-        'src/core/client_config/lb_policies/round_robin.c',
-        'src/core/client_config/lb_policy.c',
-        'src/core/client_config/lb_policy_factory.c',
-        'src/core/client_config/lb_policy_registry.c',
-        'src/core/client_config/resolver.c',
-        'src/core/client_config/resolver_factory.c',
-        'src/core/client_config/resolver_registry.c',
-        'src/core/client_config/resolvers/dns_resolver.c',
-        'src/core/client_config/resolvers/sockaddr_resolver.c',
-        'src/core/client_config/subchannel.c',
-        'src/core/client_config/subchannel_factory.c',
-        'src/core/client_config/subchannel_factory_decorators/add_channel_arg.c',
-        'src/core/client_config/subchannel_factory_decorators/merge_channel_args.c',
-        'src/core/client_config/uri_parser.c',
-        'src/core/compression/algorithm.c',
-        'src/core/compression/message_compress.c',
-        'src/core/debug/trace.c',
-        'src/core/httpcli/format_request.c',
-        'src/core/httpcli/httpcli.c',
-        'src/core/httpcli/parser.c',
-        'src/core/iomgr/alarm.c',
-        'src/core/iomgr/alarm_heap.c',
-        'src/core/iomgr/closure.c',
-        'src/core/iomgr/endpoint.c',
-        'src/core/iomgr/endpoint_pair_posix.c',
-        'src/core/iomgr/endpoint_pair_windows.c',
-        'src/core/iomgr/exec_ctx.c',
-        'src/core/iomgr/fd_posix.c',
-        'src/core/iomgr/iocp_windows.c',
-        'src/core/iomgr/iomgr.c',
-        'src/core/iomgr/iomgr_posix.c',
-        'src/core/iomgr/iomgr_windows.c',
-        'src/core/iomgr/pollset_multipoller_with_epoll.c',
-        'src/core/iomgr/pollset_multipoller_with_poll_posix.c',
-        'src/core/iomgr/pollset_posix.c',
-        'src/core/iomgr/pollset_set_posix.c',
-        'src/core/iomgr/pollset_set_windows.c',
-        'src/core/iomgr/pollset_windows.c',
-        'src/core/iomgr/resolve_address_posix.c',
-        'src/core/iomgr/resolve_address_windows.c',
-        'src/core/iomgr/sockaddr_utils.c',
-        'src/core/iomgr/socket_utils_common_posix.c',
-        'src/core/iomgr/socket_utils_linux.c',
-        'src/core/iomgr/socket_utils_posix.c',
-        'src/core/iomgr/socket_windows.c',
-        'src/core/iomgr/tcp_client_posix.c',
-        'src/core/iomgr/tcp_client_windows.c',
-        'src/core/iomgr/tcp_posix.c',
-        'src/core/iomgr/tcp_server_posix.c',
-        'src/core/iomgr/tcp_server_windows.c',
-        'src/core/iomgr/tcp_windows.c',
-        'src/core/iomgr/time_averaged_stats.c',
-        'src/core/iomgr/udp_server.c',
-        'src/core/iomgr/wakeup_fd_eventfd.c',
-        'src/core/iomgr/wakeup_fd_nospecial.c',
-        'src/core/iomgr/wakeup_fd_pipe.c',
-        'src/core/iomgr/wakeup_fd_posix.c',
-        'src/core/iomgr/workqueue_posix.c',
-        'src/core/iomgr/workqueue_windows.c',
-        'src/core/json/json.c',
-        'src/core/json/json_reader.c',
-        'src/core/json/json_string.c',
-        'src/core/json/json_writer.c',
-        'src/core/profiling/basic_timers.c',
-        'src/core/profiling/stap_timers.c',
-        'src/core/surface/api_trace.c',
-        'src/core/surface/byte_buffer.c',
-        'src/core/surface/byte_buffer_queue.c',
-        'src/core/surface/byte_buffer_reader.c',
-        'src/core/surface/call.c',
-        'src/core/surface/call_details.c',
-        'src/core/surface/call_log_batch.c',
-        'src/core/surface/channel.c',
-        'src/core/surface/channel_connectivity.c',
-        'src/core/surface/channel_create.c',
-        'src/core/surface/completion_queue.c',
-        'src/core/surface/event_string.c',
-        'src/core/surface/init.c',
-        'src/core/surface/lame_client.c',
-        'src/core/surface/metadata_array.c',
-        'src/core/surface/server.c',
-        'src/core/surface/server_chttp2.c',
-        'src/core/surface/server_create.c',
-        'src/core/surface/version.c',
-        'src/core/transport/chttp2/alpn.c',
-        'src/core/transport/chttp2/bin_encoder.c',
-        'src/core/transport/chttp2/frame_data.c',
-        'src/core/transport/chttp2/frame_goaway.c',
-        'src/core/transport/chttp2/frame_ping.c',
-        'src/core/transport/chttp2/frame_rst_stream.c',
-        'src/core/transport/chttp2/frame_settings.c',
-        'src/core/transport/chttp2/frame_window_update.c',
-        'src/core/transport/chttp2/hpack_parser.c',
-        'src/core/transport/chttp2/hpack_table.c',
-        'src/core/transport/chttp2/huffsyms.c',
-        'src/core/transport/chttp2/incoming_metadata.c',
-        'src/core/transport/chttp2/parsing.c',
-        'src/core/transport/chttp2/status_conversion.c',
-        'src/core/transport/chttp2/stream_encoder.c',
-        'src/core/transport/chttp2/stream_lists.c',
-        'src/core/transport/chttp2/stream_map.c',
-        'src/core/transport/chttp2/timeout_encoding.c',
-        'src/core/transport/chttp2/varint.c',
-        'src/core/transport/chttp2/writing.c',
-        'src/core/transport/chttp2_transport.c',
-        'src/core/transport/connectivity_state.c',
-        'src/core/transport/metadata.c',
-        'src/core/transport/stream_op.c',
-        'src/core/transport/transport.c',
-        'src/core/transport/transport_op_string.c',
-        'src/core/census/context.c',
-        'src/core/census/initialize.c',
-        'src/core/census/operation.c',
-        'src/core/census/tracing.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'grpc_zookeeper',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'gpr',
-        'grpc',
-      ],
-      'sources': [
-        'src/core/client_config/resolvers/zookeeper_resolver.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'reconnect_server',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/util/reconnect_server.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    # TODO: Add C++ targets
-    # TODO: Add C++ targets
-    # TODO: Add C++ targets
-    # TODO: Add C++ targets
-    # TODO: Add C++ targets
-    # TODO: Add C++ targets
-    # TODO: Add C++ targets
-    # TODO: Add C++ targets
-    # TODO: Add C++ targets
-    # TODO: Add C++ targets
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_fixture_h2_compress',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/fixtures/h2_compress.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_fixture_h2_fakesec',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/fixtures/h2_fakesec.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_fixture_h2_full',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/fixtures/h2_full.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_fixture_h2_full+poll',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/fixtures/h2_full+poll.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_fixture_h2_oauth2',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/fixtures/h2_oauth2.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_fixture_h2_proxy',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/fixtures/h2_proxy.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_fixture_h2_sockpair',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/fixtures/h2_sockpair.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_fixture_h2_sockpair+trace',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/fixtures/h2_sockpair+trace.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_fixture_h2_sockpair_1byte',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/fixtures/h2_sockpair_1byte.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_fixture_h2_ssl',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/fixtures/h2_ssl.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_fixture_h2_ssl+poll',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/fixtures/h2_ssl+poll.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_fixture_h2_ssl_proxy',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/fixtures/h2_ssl_proxy.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_fixture_h2_uchannel',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/fixtures/h2_uchannel.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_fixture_h2_uds',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/fixtures/h2_uds.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_fixture_h2_uds+poll',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/fixtures/h2_uds+poll.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_test_bad_hostname',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/tests/bad_hostname.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_test_binary_metadata',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/tests/binary_metadata.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_test_call_creds',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/tests/call_creds.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_test_cancel_after_accept',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/tests/cancel_after_accept.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_test_cancel_after_client_done',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/tests/cancel_after_client_done.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_test_cancel_after_invoke',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/tests/cancel_after_invoke.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_test_cancel_before_invoke',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/tests/cancel_before_invoke.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_test_cancel_in_a_vacuum',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/tests/cancel_in_a_vacuum.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_test_census_simple_request',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/tests/census_simple_request.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_test_channel_connectivity',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/tests/channel_connectivity.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_test_compressed_payload',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/tests/compressed_payload.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_test_default_host',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/tests/default_host.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_test_disappearing_server',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/tests/disappearing_server.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_test_empty_batch',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/tests/empty_batch.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_test_graceful_server_shutdown',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/tests/graceful_server_shutdown.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_test_high_initial_seqno',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/tests/high_initial_seqno.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_test_invoke_large_request',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/tests/invoke_large_request.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_test_large_metadata',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/tests/large_metadata.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_test_max_concurrent_streams',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/tests/max_concurrent_streams.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_test_max_message_length',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/tests/max_message_length.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_test_metadata',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/tests/metadata.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_test_no_op',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/tests/no_op.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_test_payload',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/tests/payload.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_test_ping_pong_streaming',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/tests/ping_pong_streaming.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_test_registered_call',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/tests/registered_call.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_test_request_with_flags',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/tests/request_with_flags.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_test_request_with_payload',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/tests/request_with_payload.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_test_server_finishes_request',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/tests/server_finishes_request.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_test_shutdown_finishes_calls',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/tests/shutdown_finishes_calls.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_test_shutdown_finishes_tags',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/tests/shutdown_finishes_tags.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_test_simple_delayed_request',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/tests/simple_delayed_request.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_test_simple_request',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/tests/simple_request.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_test_trailing_metadata',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/tests/trailing_metadata.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'end2end_certs',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-      ],
-      'sources': [
-        'test/core/end2end/data/test_root_cert.c',
-        'test/core/end2end/data/server1_cert.c',
-        'test/core/end2end/data/server1_key.c',
-      ],
-    },
-    # TODO: Add C++ targets
-    {
-      'target_name': 'bad_client_test',
-      'product_prefix': 'lib',
-      'type': 'static_library',
-      'dependencies': [
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/bad_client/bad_client.c',
-      ],
-    },
-    {
-      'target_name': 'alarm_heap_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/iomgr/alarm_heap_test.c',
-      ]
-    },
-    {
-      'target_name': 'alarm_list_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/iomgr/alarm_list_test.c',
-      ]
-    },
-    {
-      'target_name': 'alpn_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/transport/chttp2/alpn_test.c',
-      ]
-    },
-    {
-      'target_name': 'bin_encoder_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/transport/chttp2/bin_encoder_test.c',
-      ]
-    },
-    {
-      'target_name': 'chttp2_status_conversion_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/transport/chttp2/status_conversion_test.c',
-      ]
-    },
-    {
-      'target_name': 'chttp2_stream_encoder_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/transport/chttp2/stream_encoder_test.c',
-      ]
-    },
-    {
-      'target_name': 'chttp2_stream_map_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/transport/chttp2/stream_map_test.c',
-      ]
-    },
-    {
-      'target_name': 'compression_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/compression/compression_test.c',
-      ]
-    },
-    {
-      'target_name': 'dualstack_socket_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/dualstack_socket_test.c',
-      ]
-    },
-    {
-      'target_name': 'endpoint_pair_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/iomgr/endpoint_pair_test.c',
-      ]
-    },
-    {
-      'target_name': 'fd_conservation_posix_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/iomgr/fd_conservation_posix_test.c',
-      ]
-    },
-    {
-      'target_name': 'fd_posix_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/iomgr/fd_posix_test.c',
-      ]
-    },
-    {
-      'target_name': 'fling_client',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/fling/client.c',
-      ]
-    },
-    {
-      'target_name': 'fling_server',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/fling/server.c',
-      ]
-    },
-    {
-      'target_name': 'fling_stream_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/fling/fling_stream_test.c',
-      ]
-    },
-    {
-      'target_name': 'fling_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/fling/fling_test.c',
-      ]
-    },
-    {
-      'target_name': 'gen_hpack_tables',
-      'type': 'executable',
-      'dependencies': [
-        'gpr',
-        'grpc',
-      ],
-      'sources': [
-        'tools/codegen/core/gen_hpack_tables.c',
-      ]
-    },
-    {
-      'target_name': 'gen_legal_metadata_characters',
-      'type': 'executable',
-      'dependencies': [
-      ],
-      'sources': [
-        'tools/codegen/core/gen_legal_metadata_characters.c',
-      ]
-    },
-    {
-      'target_name': 'gpr_cmdline_test',
-      'type': 'executable',
-      'dependencies': [
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/support/cmdline_test.c',
-      ]
-    },
-    {
-      'target_name': 'gpr_env_test',
-      'type': 'executable',
-      'dependencies': [
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/support/env_test.c',
-      ]
-    },
-    {
-      'target_name': 'gpr_file_test',
-      'type': 'executable',
-      'dependencies': [
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/support/file_test.c',
-      ]
-    },
-    {
-      'target_name': 'gpr_histogram_test',
-      'type': 'executable',
-      'dependencies': [
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/support/histogram_test.c',
-      ]
-    },
-    {
-      'target_name': 'gpr_host_port_test',
-      'type': 'executable',
-      'dependencies': [
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/support/host_port_test.c',
-      ]
-    },
-    {
-      'target_name': 'gpr_log_test',
-      'type': 'executable',
-      'dependencies': [
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/support/log_test.c',
-      ]
-    },
-    {
-      'target_name': 'gpr_slice_buffer_test',
-      'type': 'executable',
-      'dependencies': [
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/support/slice_buffer_test.c',
-      ]
-    },
-    {
-      'target_name': 'gpr_slice_test',
-      'type': 'executable',
-      'dependencies': [
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/support/slice_test.c',
-      ]
-    },
-    {
-      'target_name': 'gpr_stack_lockfree_test',
-      'type': 'executable',
-      'dependencies': [
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/support/stack_lockfree_test.c',
-      ]
-    },
-    {
-      'target_name': 'gpr_string_test',
-      'type': 'executable',
-      'dependencies': [
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/support/string_test.c',
-      ]
-    },
-    {
-      'target_name': 'gpr_sync_test',
-      'type': 'executable',
-      'dependencies': [
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/support/sync_test.c',
-      ]
-    },
-    {
-      'target_name': 'gpr_thd_test',
-      'type': 'executable',
-      'dependencies': [
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/support/thd_test.c',
-      ]
-    },
-    {
-      'target_name': 'gpr_time_test',
-      'type': 'executable',
-      'dependencies': [
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/support/time_test.c',
-      ]
-    },
-    {
-      'target_name': 'gpr_tls_test',
-      'type': 'executable',
-      'dependencies': [
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/support/tls_test.c',
-      ]
-    },
-    {
-      'target_name': 'gpr_useful_test',
-      'type': 'executable',
-      'dependencies': [
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/support/useful_test.c',
-      ]
-    },
-    {
-      'target_name': 'grpc_auth_context_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/security/auth_context_test.c',
-      ]
-    },
-    {
-      'target_name': 'grpc_base64_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/security/base64_test.c',
-      ]
-    },
-    {
-      'target_name': 'grpc_byte_buffer_reader_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/surface/byte_buffer_reader_test.c',
-      ]
-    },
-    {
-      'target_name': 'grpc_channel_args_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/channel/channel_args_test.c',
-      ]
-    },
-    {
-      'target_name': 'grpc_channel_stack_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/channel/channel_stack_test.c',
-      ]
-    },
-    {
-      'target_name': 'grpc_completion_queue_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/surface/completion_queue_test.c',
-      ]
-    },
-    {
-      'target_name': 'grpc_create_jwt',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/security/create_jwt.c',
-      ]
-    },
-    {
-      'target_name': 'grpc_credentials_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/security/credentials_test.c',
-      ]
-    },
-    {
-      'target_name': 'grpc_fetch_oauth2',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/security/fetch_oauth2.c',
-      ]
-    },
-    {
-      'target_name': 'grpc_json_token_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/security/json_token_test.c',
-      ]
-    },
-    {
-      'target_name': 'grpc_jwt_verifier_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/security/jwt_verifier_test.c',
-      ]
-    },
-    {
-      'target_name': 'grpc_print_google_default_creds_token',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/security/print_google_default_creds_token.c',
-      ]
-    },
-    {
-      'target_name': 'grpc_security_connector_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/security/security_connector_test.c',
-      ]
-    },
-    {
-      'target_name': 'grpc_stream_op_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/transport/stream_op_test.c',
-      ]
-    },
-    {
-      'target_name': 'grpc_verify_jwt',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/security/verify_jwt.c',
-      ]
-    },
-    {
-      'target_name': 'hpack_parser_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/transport/chttp2/hpack_parser_test.c',
-      ]
-    },
-    {
-      'target_name': 'hpack_table_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/transport/chttp2/hpack_table_test.c',
-      ]
-    },
-    {
-      'target_name': 'httpcli_format_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/httpcli/format_request_test.c',
-      ]
-    },
-    {
-      'target_name': 'httpcli_parser_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/httpcli/parser_test.c',
-      ]
-    },
-    {
-      'target_name': 'httpcli_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/httpcli/httpcli_test.c',
-      ]
-    },
-    {
-      'target_name': 'json_rewrite',
-      'type': 'executable',
-      'dependencies': [
-        'grpc',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/json/json_rewrite.c',
-      ]
-    },
-    {
-      'target_name': 'json_rewrite_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/json/json_rewrite_test.c',
-      ]
-    },
-    {
-      'target_name': 'json_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/json/json_test.c',
-      ]
-    },
-    {
-      'target_name': 'lame_client_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/surface/lame_client_test.c',
-      ]
-    },
-    {
-      'target_name': 'lb_policies_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/client_config/lb_policies_test.c',
-      ]
-    },
-    {
-      'target_name': 'low_level_ping_pong_benchmark',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/network_benchmarks/low_level_ping_pong.c',
-      ]
-    },
-    {
-      'target_name': 'message_compress_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/compression/message_compress_test.c',
-      ]
-    },
-    {
-      'target_name': 'multi_init_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/surface/multi_init_test.c',
-      ]
-    },
-    {
-      'target_name': 'multiple_server_queues_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/multiple_server_queues_test.c',
-      ]
-    },
-    {
-      'target_name': 'murmur_hash_test',
-      'type': 'executable',
-      'dependencies': [
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/support/murmur_hash_test.c',
-      ]
-    },
-    {
-      'target_name': 'no_server_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/end2end/no_server_test.c',
-      ]
-    },
-    {
-      'target_name': 'resolve_address_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/iomgr/resolve_address_test.c',
-      ]
-    },
-    {
-      'target_name': 'secure_endpoint_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/security/secure_endpoint_test.c',
-      ]
-    },
-    {
-      'target_name': 'sockaddr_utils_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/iomgr/sockaddr_utils_test.c',
-      ]
-    },
-    {
-      'target_name': 'tcp_client_posix_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/iomgr/tcp_client_posix_test.c',
-      ]
-    },
-    {
-      'target_name': 'tcp_posix_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/iomgr/tcp_posix_test.c',
-      ]
-    },
-    {
-      'target_name': 'tcp_server_posix_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/iomgr/tcp_server_posix_test.c',
-      ]
-    },
-    {
-      'target_name': 'time_averaged_stats_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/iomgr/time_averaged_stats_test.c',
-      ]
-    },
-    {
-      'target_name': 'timeout_encoding_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/transport/chttp2/timeout_encoding_test.c',
-      ]
-    },
-    {
-      'target_name': 'timers_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/profiling/timers_test.c',
-      ]
-    },
-    {
-      'target_name': 'transport_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/transport/metadata_test.c',
-      ]
-    },
-    {
-      'target_name': 'transport_security_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/tsi/transport_security_test.c',
-      ]
-    },
-    {
-      'target_name': 'udp_server_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/iomgr/udp_server_test.c',
-      ]
-    },
-    {
-      'target_name': 'uri_parser_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/client_config/uri_parser_test.c',
-      ]
-    },
-    {
-      'target_name': 'workqueue_test',
-      'type': 'executable',
-      'dependencies': [
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/iomgr/workqueue_test.c',
-      ]
-    },
-    {
-      'target_name': 'h2_compress_bad_hostname_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_bad_hostname',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_binary_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_binary_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_call_creds_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_call_creds',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_cancel_after_accept_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_cancel_after_accept',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_cancel_after_client_done_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_cancel_after_client_done',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_cancel_after_invoke_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_cancel_after_invoke',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_cancel_before_invoke_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_cancel_before_invoke',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_cancel_in_a_vacuum_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_cancel_in_a_vacuum',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_census_simple_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_census_simple_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_channel_connectivity_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_channel_connectivity',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_compressed_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_compressed_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_default_host_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_default_host',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_disappearing_server_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_disappearing_server',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_empty_batch_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_empty_batch',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_graceful_server_shutdown_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_graceful_server_shutdown',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_high_initial_seqno_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_high_initial_seqno',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_invoke_large_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_invoke_large_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_large_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_large_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_max_concurrent_streams_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_max_concurrent_streams',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_max_message_length_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_max_message_length',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_no_op_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_no_op',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_ping_pong_streaming_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_ping_pong_streaming',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_registered_call_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_registered_call',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_request_with_flags_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_request_with_flags',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_request_with_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_request_with_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_server_finishes_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_server_finishes_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_shutdown_finishes_calls_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_shutdown_finishes_calls',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_shutdown_finishes_tags_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_shutdown_finishes_tags',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_simple_delayed_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_simple_delayed_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_simple_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_simple_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_trailing_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_trailing_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_fakesec_bad_hostname_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_fakesec',
-        'end2end_test_bad_hostname',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_fakesec_binary_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_fakesec',
-        'end2end_test_binary_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_fakesec_call_creds_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_fakesec',
-        'end2end_test_call_creds',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_fakesec_cancel_after_accept_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_fakesec',
-        'end2end_test_cancel_after_accept',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_fakesec_cancel_after_client_done_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_fakesec',
-        'end2end_test_cancel_after_client_done',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_fakesec_cancel_after_invoke_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_fakesec',
-        'end2end_test_cancel_after_invoke',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_fakesec_cancel_before_invoke_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_fakesec',
-        'end2end_test_cancel_before_invoke',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_fakesec_cancel_in_a_vacuum_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_fakesec',
-        'end2end_test_cancel_in_a_vacuum',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_fakesec_census_simple_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_fakesec',
-        'end2end_test_census_simple_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_fakesec_channel_connectivity_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_fakesec',
-        'end2end_test_channel_connectivity',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_fakesec_compressed_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_fakesec',
-        'end2end_test_compressed_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_fakesec_default_host_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_fakesec',
-        'end2end_test_default_host',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_fakesec_disappearing_server_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_fakesec',
-        'end2end_test_disappearing_server',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_fakesec_empty_batch_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_fakesec',
-        'end2end_test_empty_batch',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_fakesec_graceful_server_shutdown_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_fakesec',
-        'end2end_test_graceful_server_shutdown',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_fakesec_high_initial_seqno_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_fakesec',
-        'end2end_test_high_initial_seqno',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_fakesec_invoke_large_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_fakesec',
-        'end2end_test_invoke_large_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_fakesec_large_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_fakesec',
-        'end2end_test_large_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_fakesec_max_concurrent_streams_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_fakesec',
-        'end2end_test_max_concurrent_streams',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_fakesec_max_message_length_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_fakesec',
-        'end2end_test_max_message_length',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_fakesec_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_fakesec',
-        'end2end_test_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_fakesec_no_op_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_fakesec',
-        'end2end_test_no_op',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_fakesec_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_fakesec',
-        'end2end_test_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_fakesec_ping_pong_streaming_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_fakesec',
-        'end2end_test_ping_pong_streaming',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_fakesec_registered_call_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_fakesec',
-        'end2end_test_registered_call',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_fakesec_request_with_flags_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_fakesec',
-        'end2end_test_request_with_flags',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_fakesec_request_with_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_fakesec',
-        'end2end_test_request_with_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_fakesec_server_finishes_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_fakesec',
-        'end2end_test_server_finishes_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_fakesec_shutdown_finishes_calls_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_fakesec',
-        'end2end_test_shutdown_finishes_calls',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_fakesec_shutdown_finishes_tags_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_fakesec',
-        'end2end_test_shutdown_finishes_tags',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_fakesec_simple_delayed_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_fakesec',
-        'end2end_test_simple_delayed_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_fakesec_simple_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_fakesec',
-        'end2end_test_simple_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_fakesec_trailing_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_fakesec',
-        'end2end_test_trailing_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_bad_hostname_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_bad_hostname',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_binary_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_binary_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_call_creds_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_call_creds',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_cancel_after_accept_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_cancel_after_accept',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_cancel_after_client_done_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_cancel_after_client_done',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_cancel_after_invoke_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_cancel_after_invoke',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_cancel_before_invoke_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_cancel_before_invoke',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_cancel_in_a_vacuum_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_cancel_in_a_vacuum',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_census_simple_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_census_simple_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_channel_connectivity_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_channel_connectivity',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_compressed_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_compressed_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_default_host_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_default_host',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_disappearing_server_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_disappearing_server',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_empty_batch_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_empty_batch',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_graceful_server_shutdown_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_graceful_server_shutdown',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_high_initial_seqno_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_high_initial_seqno',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_invoke_large_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_invoke_large_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_large_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_large_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_max_concurrent_streams_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_max_concurrent_streams',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_max_message_length_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_max_message_length',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_no_op_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_no_op',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_ping_pong_streaming_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_ping_pong_streaming',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_registered_call_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_registered_call',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_request_with_flags_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_request_with_flags',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_request_with_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_request_with_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_server_finishes_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_server_finishes_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_shutdown_finishes_calls_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_shutdown_finishes_calls',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_shutdown_finishes_tags_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_shutdown_finishes_tags',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_simple_delayed_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_simple_delayed_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_simple_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_simple_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_trailing_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_trailing_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_bad_hostname_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_bad_hostname',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_binary_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_binary_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_call_creds_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_call_creds',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_cancel_after_accept_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_cancel_after_accept',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_cancel_after_client_done_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_cancel_after_client_done',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_cancel_after_invoke_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_cancel_after_invoke',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_cancel_before_invoke_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_cancel_before_invoke',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_cancel_in_a_vacuum_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_cancel_in_a_vacuum',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_census_simple_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_census_simple_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_channel_connectivity_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_channel_connectivity',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_compressed_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_compressed_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_default_host_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_default_host',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_disappearing_server_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_disappearing_server',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_empty_batch_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_empty_batch',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_graceful_server_shutdown_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_graceful_server_shutdown',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_high_initial_seqno_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_high_initial_seqno',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_invoke_large_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_invoke_large_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_large_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_large_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_max_concurrent_streams_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_max_concurrent_streams',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_max_message_length_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_max_message_length',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_no_op_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_no_op',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_ping_pong_streaming_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_ping_pong_streaming',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_registered_call_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_registered_call',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_request_with_flags_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_request_with_flags',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_request_with_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_request_with_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_server_finishes_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_server_finishes_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_shutdown_finishes_calls_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_shutdown_finishes_calls',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_shutdown_finishes_tags_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_shutdown_finishes_tags',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_simple_delayed_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_simple_delayed_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_simple_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_simple_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_trailing_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_trailing_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_oauth2_bad_hostname_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_oauth2',
-        'end2end_test_bad_hostname',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_oauth2_binary_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_oauth2',
-        'end2end_test_binary_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_oauth2_call_creds_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_oauth2',
-        'end2end_test_call_creds',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_oauth2_cancel_after_accept_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_oauth2',
-        'end2end_test_cancel_after_accept',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_oauth2_cancel_after_client_done_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_oauth2',
-        'end2end_test_cancel_after_client_done',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_oauth2_cancel_after_invoke_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_oauth2',
-        'end2end_test_cancel_after_invoke',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_oauth2_cancel_before_invoke_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_oauth2',
-        'end2end_test_cancel_before_invoke',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_oauth2_cancel_in_a_vacuum_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_oauth2',
-        'end2end_test_cancel_in_a_vacuum',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_oauth2_census_simple_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_oauth2',
-        'end2end_test_census_simple_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_oauth2_channel_connectivity_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_oauth2',
-        'end2end_test_channel_connectivity',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_oauth2_compressed_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_oauth2',
-        'end2end_test_compressed_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_oauth2_default_host_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_oauth2',
-        'end2end_test_default_host',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_oauth2_disappearing_server_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_oauth2',
-        'end2end_test_disappearing_server',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_oauth2_empty_batch_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_oauth2',
-        'end2end_test_empty_batch',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_oauth2_graceful_server_shutdown_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_oauth2',
-        'end2end_test_graceful_server_shutdown',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_oauth2_high_initial_seqno_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_oauth2',
-        'end2end_test_high_initial_seqno',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_oauth2_invoke_large_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_oauth2',
-        'end2end_test_invoke_large_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_oauth2_large_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_oauth2',
-        'end2end_test_large_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_oauth2_max_concurrent_streams_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_oauth2',
-        'end2end_test_max_concurrent_streams',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_oauth2_max_message_length_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_oauth2',
-        'end2end_test_max_message_length',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_oauth2_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_oauth2',
-        'end2end_test_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_oauth2_no_op_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_oauth2',
-        'end2end_test_no_op',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_oauth2_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_oauth2',
-        'end2end_test_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_oauth2_ping_pong_streaming_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_oauth2',
-        'end2end_test_ping_pong_streaming',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_oauth2_registered_call_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_oauth2',
-        'end2end_test_registered_call',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_oauth2_request_with_flags_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_oauth2',
-        'end2end_test_request_with_flags',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_oauth2_request_with_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_oauth2',
-        'end2end_test_request_with_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_oauth2_server_finishes_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_oauth2',
-        'end2end_test_server_finishes_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_oauth2_shutdown_finishes_calls_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_oauth2',
-        'end2end_test_shutdown_finishes_calls',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_oauth2_shutdown_finishes_tags_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_oauth2',
-        'end2end_test_shutdown_finishes_tags',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_oauth2_simple_delayed_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_oauth2',
-        'end2end_test_simple_delayed_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_oauth2_simple_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_oauth2',
-        'end2end_test_simple_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_oauth2_trailing_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_oauth2',
-        'end2end_test_trailing_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_bad_hostname_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_bad_hostname',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_binary_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_binary_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_call_creds_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_call_creds',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_cancel_after_accept_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_cancel_after_accept',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_cancel_after_client_done_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_cancel_after_client_done',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_cancel_after_invoke_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_cancel_after_invoke',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_cancel_before_invoke_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_cancel_before_invoke',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_cancel_in_a_vacuum_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_cancel_in_a_vacuum',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_census_simple_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_census_simple_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_default_host_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_default_host',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_disappearing_server_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_disappearing_server',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_empty_batch_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_empty_batch',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_graceful_server_shutdown_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_graceful_server_shutdown',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_high_initial_seqno_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_high_initial_seqno',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_invoke_large_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_invoke_large_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_large_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_large_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_max_message_length_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_max_message_length',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_no_op_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_no_op',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_ping_pong_streaming_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_ping_pong_streaming',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_registered_call_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_registered_call',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_request_with_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_request_with_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_server_finishes_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_server_finishes_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_shutdown_finishes_calls_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_shutdown_finishes_calls',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_shutdown_finishes_tags_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_shutdown_finishes_tags',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_simple_delayed_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_simple_delayed_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_simple_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_simple_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_trailing_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_trailing_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_bad_hostname_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_bad_hostname',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_binary_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_binary_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_call_creds_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_call_creds',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_cancel_after_accept_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_cancel_after_accept',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_cancel_after_client_done_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_cancel_after_client_done',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_cancel_after_invoke_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_cancel_after_invoke',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_cancel_before_invoke_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_cancel_before_invoke',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_cancel_in_a_vacuum_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_cancel_in_a_vacuum',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_census_simple_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_census_simple_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_compressed_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_compressed_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_empty_batch_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_empty_batch',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_graceful_server_shutdown_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_graceful_server_shutdown',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_high_initial_seqno_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_high_initial_seqno',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_invoke_large_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_invoke_large_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_large_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_large_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_max_concurrent_streams_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_max_concurrent_streams',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_max_message_length_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_max_message_length',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_no_op_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_no_op',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_ping_pong_streaming_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_ping_pong_streaming',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_registered_call_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_registered_call',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_request_with_flags_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_request_with_flags',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_request_with_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_request_with_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_server_finishes_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_server_finishes_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_shutdown_finishes_calls_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_shutdown_finishes_calls',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_shutdown_finishes_tags_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_shutdown_finishes_tags',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_simple_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_simple_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_trailing_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_trailing_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_bad_hostname_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_bad_hostname',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_binary_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_binary_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_call_creds_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_call_creds',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_cancel_after_accept_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_cancel_after_accept',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_cancel_after_client_done_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_cancel_after_client_done',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_cancel_after_invoke_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_cancel_after_invoke',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_cancel_before_invoke_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_cancel_before_invoke',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_cancel_in_a_vacuum_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_cancel_in_a_vacuum',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_census_simple_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_census_simple_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_compressed_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_compressed_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_empty_batch_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_empty_batch',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_graceful_server_shutdown_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_graceful_server_shutdown',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_high_initial_seqno_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_high_initial_seqno',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_invoke_large_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_invoke_large_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_large_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_large_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_max_concurrent_streams_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_max_concurrent_streams',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_max_message_length_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_max_message_length',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_no_op_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_no_op',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_ping_pong_streaming_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_ping_pong_streaming',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_registered_call_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_registered_call',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_request_with_flags_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_request_with_flags',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_request_with_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_request_with_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_server_finishes_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_server_finishes_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_shutdown_finishes_calls_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_shutdown_finishes_calls',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_shutdown_finishes_tags_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_shutdown_finishes_tags',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_simple_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_simple_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_trailing_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_trailing_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_bad_hostname_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_bad_hostname',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_binary_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_binary_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_call_creds_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_call_creds',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_cancel_after_accept_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_cancel_after_accept',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_cancel_after_client_done_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_cancel_after_client_done',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_cancel_after_invoke_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_cancel_after_invoke',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_cancel_before_invoke_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_cancel_before_invoke',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_cancel_in_a_vacuum_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_cancel_in_a_vacuum',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_census_simple_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_census_simple_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_compressed_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_compressed_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_empty_batch_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_empty_batch',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_graceful_server_shutdown_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_graceful_server_shutdown',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_high_initial_seqno_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_high_initial_seqno',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_invoke_large_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_invoke_large_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_large_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_large_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_max_concurrent_streams_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_max_concurrent_streams',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_max_message_length_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_max_message_length',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_no_op_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_no_op',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_ping_pong_streaming_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_ping_pong_streaming',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_registered_call_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_registered_call',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_request_with_flags_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_request_with_flags',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_request_with_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_request_with_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_server_finishes_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_server_finishes_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_shutdown_finishes_calls_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_shutdown_finishes_calls',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_shutdown_finishes_tags_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_shutdown_finishes_tags',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_simple_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_simple_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_trailing_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_trailing_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_bad_hostname_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl',
-        'end2end_test_bad_hostname',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_binary_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl',
-        'end2end_test_binary_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_call_creds_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl',
-        'end2end_test_call_creds',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_cancel_after_accept_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl',
-        'end2end_test_cancel_after_accept',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_cancel_after_client_done_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl',
-        'end2end_test_cancel_after_client_done',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_cancel_after_invoke_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl',
-        'end2end_test_cancel_after_invoke',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_cancel_before_invoke_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl',
-        'end2end_test_cancel_before_invoke',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_cancel_in_a_vacuum_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl',
-        'end2end_test_cancel_in_a_vacuum',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_census_simple_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl',
-        'end2end_test_census_simple_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_channel_connectivity_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl',
-        'end2end_test_channel_connectivity',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_compressed_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl',
-        'end2end_test_compressed_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_default_host_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl',
-        'end2end_test_default_host',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_disappearing_server_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl',
-        'end2end_test_disappearing_server',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_empty_batch_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl',
-        'end2end_test_empty_batch',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_graceful_server_shutdown_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl',
-        'end2end_test_graceful_server_shutdown',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_high_initial_seqno_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl',
-        'end2end_test_high_initial_seqno',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_invoke_large_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl',
-        'end2end_test_invoke_large_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_large_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl',
-        'end2end_test_large_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_max_concurrent_streams_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl',
-        'end2end_test_max_concurrent_streams',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_max_message_length_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl',
-        'end2end_test_max_message_length',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl',
-        'end2end_test_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_no_op_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl',
-        'end2end_test_no_op',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl',
-        'end2end_test_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_ping_pong_streaming_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl',
-        'end2end_test_ping_pong_streaming',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_registered_call_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl',
-        'end2end_test_registered_call',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_request_with_flags_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl',
-        'end2end_test_request_with_flags',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_request_with_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl',
-        'end2end_test_request_with_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_server_finishes_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl',
-        'end2end_test_server_finishes_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_shutdown_finishes_calls_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl',
-        'end2end_test_shutdown_finishes_calls',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_shutdown_finishes_tags_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl',
-        'end2end_test_shutdown_finishes_tags',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_simple_delayed_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl',
-        'end2end_test_simple_delayed_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_simple_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl',
-        'end2end_test_simple_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_trailing_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl',
-        'end2end_test_trailing_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl+poll_bad_hostname_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl+poll',
-        'end2end_test_bad_hostname',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl+poll_binary_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl+poll',
-        'end2end_test_binary_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl+poll_call_creds_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl+poll',
-        'end2end_test_call_creds',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl+poll_cancel_after_accept_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl+poll',
-        'end2end_test_cancel_after_accept',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl+poll_cancel_after_client_done_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl+poll',
-        'end2end_test_cancel_after_client_done',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl+poll_cancel_after_invoke_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl+poll',
-        'end2end_test_cancel_after_invoke',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl+poll_cancel_before_invoke_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl+poll',
-        'end2end_test_cancel_before_invoke',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl+poll_cancel_in_a_vacuum_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl+poll',
-        'end2end_test_cancel_in_a_vacuum',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl+poll_census_simple_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl+poll',
-        'end2end_test_census_simple_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl+poll_channel_connectivity_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl+poll',
-        'end2end_test_channel_connectivity',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl+poll_compressed_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl+poll',
-        'end2end_test_compressed_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl+poll_default_host_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl+poll',
-        'end2end_test_default_host',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl+poll_disappearing_server_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl+poll',
-        'end2end_test_disappearing_server',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl+poll_empty_batch_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl+poll',
-        'end2end_test_empty_batch',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl+poll_graceful_server_shutdown_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl+poll',
-        'end2end_test_graceful_server_shutdown',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl+poll_high_initial_seqno_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl+poll',
-        'end2end_test_high_initial_seqno',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl+poll_invoke_large_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl+poll',
-        'end2end_test_invoke_large_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl+poll_large_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl+poll',
-        'end2end_test_large_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl+poll_max_concurrent_streams_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl+poll',
-        'end2end_test_max_concurrent_streams',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl+poll_max_message_length_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl+poll',
-        'end2end_test_max_message_length',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl+poll_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl+poll',
-        'end2end_test_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl+poll_no_op_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl+poll',
-        'end2end_test_no_op',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl+poll_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl+poll',
-        'end2end_test_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl+poll_ping_pong_streaming_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl+poll',
-        'end2end_test_ping_pong_streaming',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl+poll_registered_call_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl+poll',
-        'end2end_test_registered_call',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl+poll_request_with_flags_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl+poll',
-        'end2end_test_request_with_flags',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl+poll_request_with_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl+poll',
-        'end2end_test_request_with_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl+poll_server_finishes_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl+poll',
-        'end2end_test_server_finishes_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl+poll_shutdown_finishes_calls_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl+poll',
-        'end2end_test_shutdown_finishes_calls',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl+poll_shutdown_finishes_tags_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl+poll',
-        'end2end_test_shutdown_finishes_tags',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl+poll_simple_delayed_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl+poll',
-        'end2end_test_simple_delayed_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl+poll_simple_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl+poll',
-        'end2end_test_simple_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl+poll_trailing_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl+poll',
-        'end2end_test_trailing_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_proxy_bad_hostname_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl_proxy',
-        'end2end_test_bad_hostname',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_proxy_binary_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl_proxy',
-        'end2end_test_binary_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_proxy_call_creds_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl_proxy',
-        'end2end_test_call_creds',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_proxy_cancel_after_accept_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl_proxy',
-        'end2end_test_cancel_after_accept',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_proxy_cancel_after_client_done_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl_proxy',
-        'end2end_test_cancel_after_client_done',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_proxy_cancel_after_invoke_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl_proxy',
-        'end2end_test_cancel_after_invoke',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_proxy_cancel_before_invoke_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl_proxy',
-        'end2end_test_cancel_before_invoke',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_proxy_cancel_in_a_vacuum_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl_proxy',
-        'end2end_test_cancel_in_a_vacuum',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_proxy_census_simple_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl_proxy',
-        'end2end_test_census_simple_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_proxy_default_host_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl_proxy',
-        'end2end_test_default_host',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_proxy_disappearing_server_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl_proxy',
-        'end2end_test_disappearing_server',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_proxy_empty_batch_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl_proxy',
-        'end2end_test_empty_batch',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_proxy_graceful_server_shutdown_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl_proxy',
-        'end2end_test_graceful_server_shutdown',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_proxy_high_initial_seqno_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl_proxy',
-        'end2end_test_high_initial_seqno',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_proxy_invoke_large_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl_proxy',
-        'end2end_test_invoke_large_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_proxy_large_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl_proxy',
-        'end2end_test_large_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_proxy_max_message_length_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl_proxy',
-        'end2end_test_max_message_length',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_proxy_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl_proxy',
-        'end2end_test_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_proxy_no_op_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl_proxy',
-        'end2end_test_no_op',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_proxy_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl_proxy',
-        'end2end_test_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_proxy_ping_pong_streaming_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl_proxy',
-        'end2end_test_ping_pong_streaming',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_proxy_registered_call_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl_proxy',
-        'end2end_test_registered_call',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_proxy_request_with_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl_proxy',
-        'end2end_test_request_with_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_proxy_server_finishes_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl_proxy',
-        'end2end_test_server_finishes_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_proxy_shutdown_finishes_calls_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl_proxy',
-        'end2end_test_shutdown_finishes_calls',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_proxy_shutdown_finishes_tags_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl_proxy',
-        'end2end_test_shutdown_finishes_tags',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_proxy_simple_delayed_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl_proxy',
-        'end2end_test_simple_delayed_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_proxy_simple_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl_proxy',
-        'end2end_test_simple_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_ssl_proxy_trailing_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_ssl_proxy',
-        'end2end_test_trailing_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_bad_hostname_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_bad_hostname',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_binary_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_binary_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_call_creds_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_call_creds',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_cancel_after_accept_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_cancel_after_accept',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_cancel_after_client_done_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_cancel_after_client_done',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_cancel_after_invoke_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_cancel_after_invoke',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_cancel_before_invoke_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_cancel_before_invoke',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_cancel_in_a_vacuum_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_cancel_in_a_vacuum',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_census_simple_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_census_simple_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_channel_connectivity_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_channel_connectivity',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_compressed_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_compressed_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_default_host_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_default_host',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_disappearing_server_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_disappearing_server',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_empty_batch_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_empty_batch',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_graceful_server_shutdown_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_graceful_server_shutdown',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_high_initial_seqno_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_high_initial_seqno',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_invoke_large_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_invoke_large_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_large_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_large_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_max_concurrent_streams_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_max_concurrent_streams',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_max_message_length_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_max_message_length',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_no_op_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_no_op',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_ping_pong_streaming_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_ping_pong_streaming',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_registered_call_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_registered_call',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_request_with_flags_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_request_with_flags',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_request_with_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_request_with_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_server_finishes_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_server_finishes_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_shutdown_finishes_calls_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_shutdown_finishes_calls',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_shutdown_finishes_tags_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_shutdown_finishes_tags',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_simple_delayed_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_simple_delayed_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_simple_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_simple_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_trailing_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_trailing_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_bad_hostname_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_bad_hostname',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_binary_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_binary_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_call_creds_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_call_creds',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_cancel_after_accept_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_cancel_after_accept',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_cancel_after_client_done_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_cancel_after_client_done',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_cancel_after_invoke_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_cancel_after_invoke',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_cancel_before_invoke_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_cancel_before_invoke',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_cancel_in_a_vacuum_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_cancel_in_a_vacuum',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_census_simple_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_census_simple_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_channel_connectivity_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_channel_connectivity',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_compressed_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_compressed_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_disappearing_server_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_disappearing_server',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_empty_batch_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_empty_batch',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_graceful_server_shutdown_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_graceful_server_shutdown',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_high_initial_seqno_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_high_initial_seqno',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_invoke_large_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_invoke_large_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_large_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_large_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_max_concurrent_streams_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_max_concurrent_streams',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_max_message_length_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_max_message_length',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_no_op_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_no_op',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_ping_pong_streaming_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_ping_pong_streaming',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_registered_call_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_registered_call',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_request_with_flags_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_request_with_flags',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_request_with_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_request_with_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_server_finishes_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_server_finishes_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_shutdown_finishes_calls_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_shutdown_finishes_calls',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_shutdown_finishes_tags_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_shutdown_finishes_tags',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_simple_delayed_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_simple_delayed_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_simple_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_simple_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_trailing_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_trailing_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_bad_hostname_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_bad_hostname',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_binary_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_binary_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_call_creds_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_call_creds',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_cancel_after_accept_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_cancel_after_accept',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_cancel_after_client_done_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_cancel_after_client_done',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_cancel_after_invoke_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_cancel_after_invoke',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_cancel_before_invoke_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_cancel_before_invoke',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_cancel_in_a_vacuum_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_cancel_in_a_vacuum',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_census_simple_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_census_simple_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_channel_connectivity_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_channel_connectivity',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_compressed_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_compressed_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_disappearing_server_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_disappearing_server',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_empty_batch_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_empty_batch',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_graceful_server_shutdown_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_graceful_server_shutdown',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_high_initial_seqno_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_high_initial_seqno',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_invoke_large_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_invoke_large_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_large_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_large_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_max_concurrent_streams_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_max_concurrent_streams',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_max_message_length_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_max_message_length',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_no_op_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_no_op',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_ping_pong_streaming_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_ping_pong_streaming',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_registered_call_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_registered_call',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_request_with_flags_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_request_with_flags',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_request_with_payload_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_request_with_payload',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_server_finishes_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_server_finishes_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_shutdown_finishes_calls_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_shutdown_finishes_calls',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_shutdown_finishes_tags_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_shutdown_finishes_tags',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_simple_delayed_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_simple_delayed_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_simple_request_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_simple_request',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_trailing_metadata_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_trailing_metadata',
-        'end2end_certs',
-        'grpc_test_util',
-        'grpc',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_bad_hostname_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_bad_hostname',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_binary_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_binary_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_cancel_after_accept_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_cancel_after_accept',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_cancel_after_client_done_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_cancel_after_client_done',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_cancel_after_invoke_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_cancel_after_invoke',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_cancel_before_invoke_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_cancel_before_invoke',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_cancel_in_a_vacuum_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_cancel_in_a_vacuum',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_census_simple_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_census_simple_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_channel_connectivity_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_channel_connectivity',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_compressed_payload_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_compressed_payload',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_default_host_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_default_host',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_disappearing_server_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_disappearing_server',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_empty_batch_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_empty_batch',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_graceful_server_shutdown_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_graceful_server_shutdown',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_high_initial_seqno_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_high_initial_seqno',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_invoke_large_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_invoke_large_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_large_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_large_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_max_concurrent_streams_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_max_concurrent_streams',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_max_message_length_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_max_message_length',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_no_op_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_no_op',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_payload_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_payload',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_ping_pong_streaming_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_ping_pong_streaming',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_registered_call_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_registered_call',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_request_with_flags_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_request_with_flags',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_request_with_payload_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_request_with_payload',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_server_finishes_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_server_finishes_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_shutdown_finishes_calls_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_shutdown_finishes_calls',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_shutdown_finishes_tags_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_shutdown_finishes_tags',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_simple_delayed_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_simple_delayed_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_simple_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_simple_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_compress_trailing_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_compress',
-        'end2end_test_trailing_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_bad_hostname_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_bad_hostname',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_binary_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_binary_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_cancel_after_accept_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_cancel_after_accept',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_cancel_after_client_done_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_cancel_after_client_done',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_cancel_after_invoke_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_cancel_after_invoke',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_cancel_before_invoke_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_cancel_before_invoke',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_cancel_in_a_vacuum_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_cancel_in_a_vacuum',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_census_simple_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_census_simple_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_channel_connectivity_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_channel_connectivity',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_compressed_payload_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_compressed_payload',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_default_host_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_default_host',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_disappearing_server_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_disappearing_server',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_empty_batch_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_empty_batch',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_graceful_server_shutdown_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_graceful_server_shutdown',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_high_initial_seqno_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_high_initial_seqno',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_invoke_large_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_invoke_large_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_large_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_large_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_max_concurrent_streams_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_max_concurrent_streams',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_max_message_length_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_max_message_length',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_no_op_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_no_op',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_payload_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_payload',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_ping_pong_streaming_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_ping_pong_streaming',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_registered_call_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_registered_call',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_request_with_flags_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_request_with_flags',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_request_with_payload_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_request_with_payload',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_server_finishes_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_server_finishes_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_shutdown_finishes_calls_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_shutdown_finishes_calls',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_shutdown_finishes_tags_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_shutdown_finishes_tags',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_simple_delayed_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_simple_delayed_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_simple_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_simple_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full_trailing_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full',
-        'end2end_test_trailing_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_bad_hostname_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_bad_hostname',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_binary_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_binary_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_cancel_after_accept_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_cancel_after_accept',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_cancel_after_client_done_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_cancel_after_client_done',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_cancel_after_invoke_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_cancel_after_invoke',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_cancel_before_invoke_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_cancel_before_invoke',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_cancel_in_a_vacuum_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_cancel_in_a_vacuum',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_census_simple_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_census_simple_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_channel_connectivity_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_channel_connectivity',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_compressed_payload_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_compressed_payload',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_default_host_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_default_host',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_disappearing_server_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_disappearing_server',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_empty_batch_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_empty_batch',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_graceful_server_shutdown_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_graceful_server_shutdown',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_high_initial_seqno_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_high_initial_seqno',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_invoke_large_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_invoke_large_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_large_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_large_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_max_concurrent_streams_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_max_concurrent_streams',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_max_message_length_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_max_message_length',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_no_op_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_no_op',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_payload_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_payload',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_ping_pong_streaming_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_ping_pong_streaming',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_registered_call_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_registered_call',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_request_with_flags_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_request_with_flags',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_request_with_payload_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_request_with_payload',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_server_finishes_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_server_finishes_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_shutdown_finishes_calls_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_shutdown_finishes_calls',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_shutdown_finishes_tags_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_shutdown_finishes_tags',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_simple_delayed_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_simple_delayed_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_simple_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_simple_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_full+poll_trailing_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_full+poll',
-        'end2end_test_trailing_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_bad_hostname_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_bad_hostname',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_binary_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_binary_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_cancel_after_accept_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_cancel_after_accept',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_cancel_after_client_done_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_cancel_after_client_done',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_cancel_after_invoke_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_cancel_after_invoke',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_cancel_before_invoke_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_cancel_before_invoke',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_cancel_in_a_vacuum_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_cancel_in_a_vacuum',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_census_simple_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_census_simple_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_default_host_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_default_host',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_disappearing_server_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_disappearing_server',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_empty_batch_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_empty_batch',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_graceful_server_shutdown_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_graceful_server_shutdown',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_high_initial_seqno_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_high_initial_seqno',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_invoke_large_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_invoke_large_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_large_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_large_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_max_message_length_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_max_message_length',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_no_op_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_no_op',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_payload_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_payload',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_ping_pong_streaming_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_ping_pong_streaming',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_registered_call_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_registered_call',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_request_with_payload_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_request_with_payload',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_server_finishes_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_server_finishes_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_shutdown_finishes_calls_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_shutdown_finishes_calls',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_shutdown_finishes_tags_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_shutdown_finishes_tags',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_simple_delayed_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_simple_delayed_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_simple_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_simple_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_proxy_trailing_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_proxy',
-        'end2end_test_trailing_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_bad_hostname_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_bad_hostname',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_binary_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_binary_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_cancel_after_accept_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_cancel_after_accept',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_cancel_after_client_done_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_cancel_after_client_done',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_cancel_after_invoke_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_cancel_after_invoke',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_cancel_before_invoke_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_cancel_before_invoke',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_cancel_in_a_vacuum_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_cancel_in_a_vacuum',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_census_simple_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_census_simple_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_compressed_payload_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_compressed_payload',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_empty_batch_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_empty_batch',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_graceful_server_shutdown_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_graceful_server_shutdown',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_high_initial_seqno_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_high_initial_seqno',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_invoke_large_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_invoke_large_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_large_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_large_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_max_concurrent_streams_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_max_concurrent_streams',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_max_message_length_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_max_message_length',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_no_op_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_no_op',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_payload_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_payload',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_ping_pong_streaming_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_ping_pong_streaming',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_registered_call_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_registered_call',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_request_with_flags_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_request_with_flags',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_request_with_payload_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_request_with_payload',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_server_finishes_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_server_finishes_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_shutdown_finishes_calls_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_shutdown_finishes_calls',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_shutdown_finishes_tags_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_shutdown_finishes_tags',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_simple_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_simple_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_trailing_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair',
-        'end2end_test_trailing_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_bad_hostname_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_bad_hostname',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_binary_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_binary_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_cancel_after_accept_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_cancel_after_accept',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_cancel_after_client_done_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_cancel_after_client_done',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_cancel_after_invoke_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_cancel_after_invoke',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_cancel_before_invoke_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_cancel_before_invoke',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_cancel_in_a_vacuum_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_cancel_in_a_vacuum',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_census_simple_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_census_simple_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_compressed_payload_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_compressed_payload',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_empty_batch_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_empty_batch',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_graceful_server_shutdown_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_graceful_server_shutdown',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_high_initial_seqno_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_high_initial_seqno',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_invoke_large_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_invoke_large_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_large_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_large_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_max_concurrent_streams_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_max_concurrent_streams',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_max_message_length_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_max_message_length',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_no_op_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_no_op',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_payload_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_payload',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_ping_pong_streaming_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_ping_pong_streaming',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_registered_call_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_registered_call',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_request_with_flags_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_request_with_flags',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_request_with_payload_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_request_with_payload',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_server_finishes_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_server_finishes_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_shutdown_finishes_calls_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_shutdown_finishes_calls',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_shutdown_finishes_tags_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_shutdown_finishes_tags',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_simple_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_simple_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair+trace_trailing_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair+trace',
-        'end2end_test_trailing_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_bad_hostname_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_bad_hostname',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_binary_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_binary_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_cancel_after_accept_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_cancel_after_accept',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_cancel_after_client_done_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_cancel_after_client_done',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_cancel_after_invoke_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_cancel_after_invoke',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_cancel_before_invoke_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_cancel_before_invoke',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_cancel_in_a_vacuum_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_cancel_in_a_vacuum',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_census_simple_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_census_simple_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_compressed_payload_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_compressed_payload',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_empty_batch_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_empty_batch',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_graceful_server_shutdown_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_graceful_server_shutdown',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_high_initial_seqno_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_high_initial_seqno',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_invoke_large_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_invoke_large_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_large_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_large_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_max_concurrent_streams_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_max_concurrent_streams',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_max_message_length_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_max_message_length',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_no_op_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_no_op',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_payload_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_payload',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_ping_pong_streaming_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_ping_pong_streaming',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_registered_call_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_registered_call',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_request_with_flags_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_request_with_flags',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_request_with_payload_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_request_with_payload',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_server_finishes_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_server_finishes_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_shutdown_finishes_calls_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_shutdown_finishes_calls',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_shutdown_finishes_tags_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_shutdown_finishes_tags',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_simple_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_simple_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_sockpair_1byte_trailing_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_sockpair_1byte',
-        'end2end_test_trailing_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_bad_hostname_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_bad_hostname',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_binary_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_binary_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_cancel_after_accept_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_cancel_after_accept',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_cancel_after_client_done_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_cancel_after_client_done',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_cancel_after_invoke_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_cancel_after_invoke',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_cancel_before_invoke_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_cancel_before_invoke',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_cancel_in_a_vacuum_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_cancel_in_a_vacuum',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_census_simple_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_census_simple_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_channel_connectivity_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_channel_connectivity',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_compressed_payload_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_compressed_payload',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_default_host_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_default_host',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_disappearing_server_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_disappearing_server',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_empty_batch_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_empty_batch',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_graceful_server_shutdown_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_graceful_server_shutdown',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_high_initial_seqno_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_high_initial_seqno',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_invoke_large_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_invoke_large_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_large_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_large_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_max_concurrent_streams_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_max_concurrent_streams',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_max_message_length_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_max_message_length',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_no_op_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_no_op',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_payload_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_payload',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_ping_pong_streaming_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_ping_pong_streaming',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_registered_call_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_registered_call',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_request_with_flags_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_request_with_flags',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_request_with_payload_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_request_with_payload',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_server_finishes_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_server_finishes_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_shutdown_finishes_calls_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_shutdown_finishes_calls',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_shutdown_finishes_tags_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_shutdown_finishes_tags',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_simple_delayed_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_simple_delayed_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_simple_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_simple_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uchannel_trailing_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uchannel',
-        'end2end_test_trailing_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_bad_hostname_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_bad_hostname',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_binary_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_binary_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_cancel_after_accept_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_cancel_after_accept',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_cancel_after_client_done_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_cancel_after_client_done',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_cancel_after_invoke_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_cancel_after_invoke',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_cancel_before_invoke_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_cancel_before_invoke',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_cancel_in_a_vacuum_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_cancel_in_a_vacuum',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_census_simple_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_census_simple_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_channel_connectivity_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_channel_connectivity',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_compressed_payload_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_compressed_payload',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_disappearing_server_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_disappearing_server',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_empty_batch_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_empty_batch',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_graceful_server_shutdown_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_graceful_server_shutdown',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_high_initial_seqno_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_high_initial_seqno',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_invoke_large_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_invoke_large_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_large_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_large_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_max_concurrent_streams_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_max_concurrent_streams',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_max_message_length_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_max_message_length',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_no_op_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_no_op',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_payload_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_payload',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_ping_pong_streaming_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_ping_pong_streaming',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_registered_call_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_registered_call',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_request_with_flags_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_request_with_flags',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_request_with_payload_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_request_with_payload',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_server_finishes_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_server_finishes_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_shutdown_finishes_calls_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_shutdown_finishes_calls',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_shutdown_finishes_tags_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_shutdown_finishes_tags',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_simple_delayed_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_simple_delayed_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_simple_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_simple_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds_trailing_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds',
-        'end2end_test_trailing_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_bad_hostname_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_bad_hostname',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_binary_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_binary_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_cancel_after_accept_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_cancel_after_accept',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_cancel_after_client_done_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_cancel_after_client_done',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_cancel_after_invoke_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_cancel_after_invoke',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_cancel_before_invoke_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_cancel_before_invoke',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_cancel_in_a_vacuum_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_cancel_in_a_vacuum',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_census_simple_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_census_simple_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_channel_connectivity_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_channel_connectivity',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_compressed_payload_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_compressed_payload',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_disappearing_server_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_disappearing_server',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_empty_batch_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_empty_batch',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_graceful_server_shutdown_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_graceful_server_shutdown',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_high_initial_seqno_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_high_initial_seqno',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_invoke_large_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_invoke_large_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_large_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_large_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_max_concurrent_streams_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_max_concurrent_streams',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_max_message_length_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_max_message_length',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_no_op_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_no_op',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_payload_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_payload',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_ping_pong_streaming_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_ping_pong_streaming',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_registered_call_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_registered_call',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_request_with_flags_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_request_with_flags',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_request_with_payload_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_request_with_payload',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_server_finishes_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_server_finishes_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_shutdown_finishes_calls_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_shutdown_finishes_calls',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_shutdown_finishes_tags_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_shutdown_finishes_tags',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_simple_delayed_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_simple_delayed_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_simple_request_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_simple_request',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'h2_uds+poll_trailing_metadata_nosec_test',
-      'type': 'executable',
-      'dependencies': [
-        'end2end_fixture_h2_uds+poll',
-        'end2end_test_trailing_metadata',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-      ]
-    },
-    {
-      'target_name': 'connection_prefix_bad_client_test',
-      'type': 'executable',
-      'dependencies': [
-        'bad_client_test',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/bad_client/tests/connection_prefix.c',
-      ]
-    },
-    {
-      'target_name': 'initial_settings_frame_bad_client_test',
-      'type': 'executable',
-      'dependencies': [
-        'bad_client_test',
-        'grpc_test_util_unsecure',
-        'grpc_unsecure',
-        'gpr_test_util',
-        'gpr',
-      ],
-      'sources': [
-        'test/core/bad_client/tests/initial_settings_frame.c',
-      ]
-    },
-  ]
-}
diff --git a/include/grpc/support/port_platform.h b/include/grpc/support/port_platform.h
index 434dd6de874e1988dabb7c8d576e4ec0e19c49ad..f98038da520ea7249fe002cf0d8e54f081ed196c 100644
--- a/include/grpc/support/port_platform.h
+++ b/include/grpc/support/port_platform.h
@@ -181,6 +181,7 @@
 #ifndef _BSD_SOURCE
 #define _BSD_SOURCE
 #endif
+#define GPR_FORBID_UNREACHABLE_CODE
 #define GPR_MSG_IOVLEN_TYPE int
 #if TARGET_OS_IPHONE
 #define GPR_PLATFORM_STRING "ios"
@@ -336,4 +337,15 @@ typedef uintptr_t gpr_uintptr;
 #endif
 #endif
 
+#ifdef GPR_FORBID_UNREACHABLE_CODE
+#define GPR_UNREACHABLE_CODE(STATEMENT)
+#else
+#define GPR_UNREACHABLE_CODE(STATEMENT)             \
+  do {                                              \
+    gpr_log(GPR_ERROR, "Should never reach here."); \
+    abort();                                        \
+    STATEMENT;                                      \
+  } while (0)
+#endif /* GPR_FORBID_UNREACHABLE_CODE */
+
 #endif /* GRPC_SUPPORT_PORT_PLATFORM_H */
diff --git a/src/node/package.json b/package.json
similarity index 62%
rename from src/node/package.json
rename to package.json
index 0aeca5f659ac8920c8dfa7455386e4d61f3ebeaf..c624c45107edf5735a289c324d627a9de5f76c1e 100644
--- a/src/node/package.json
+++ b/package.json
@@ -16,14 +16,13 @@
     }
   ],
   "directories": {
-    "lib": "src",
-    "example": "examples"
+    "lib": "src/node/src"
   },
   "scripts": {
-    "lint": "node ./node_modules/jshint/bin/jshint src test examples interop index.js",
-    "test": "./node_modules/.bin/mocha && npm run-script lint",
-    "gen_docs": "./node_modules/.bin/jsdoc -c jsdoc_conf.json",
-    "coverage": "./node_modules/.bin/istanbul cover ./node_modules/.bin/_mocha"
+    "lint": "node ./node_modules/jshint/bin/jshint src/node/src src/node/test src/node/interop src/node/index.js",
+    "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"
   },
   "dependencies": {
     "bindings": "^1.2.0",
@@ -39,26 +38,23 @@
     "jshint": "^2.5.0",
     "minimist": "^1.1.0",
     "mocha": "~1.21.0",
-    "mustache": "^2.0.0",
-    "strftime": "^0.8.2"
+    "mustache": "^2.0.0"
   },
   "engines": {
     "node": ">=0.10.13"
   },
   "files": [
     "LICENSE",
-    "README.md",
-    "index.js",
-    "binding.gyp",
-    "bin",
-    "cli",
-    "examples",
-    "ext",
-    "health_check",
-    "interop",
-    "src",
-    "test"
+    "src/node/README.md",
+    "src/node/index.js",
+    "src/node/ext",
+    "src/node/health_check",
+    "src/node/src",
+    "src/core",
+    "test/proto",
+    "include",
+    "binding.gyp"
   ],
-  "main": "index.js",
+  "main": "src/node/index.js",
   "license": "BSD-3-Clause"
 }
diff --git a/src/compiler/cpp_generator.cc b/src/compiler/cpp_generator.cc
index 1bf2b16ed6ff787dd4ce2ad32913580c26aeda8c..3c8ca8ab45dc0880f6a71d679502cef0aac6eacc 100644
--- a/src/compiler/cpp_generator.cc
+++ b/src/compiler/cpp_generator.cc
@@ -585,7 +585,7 @@ void PrintHeaderService(grpc::protobuf::io::Printer *printer,
       "class Service : public ::grpc::SynchronousService {\n"
       " public:\n");
   printer->Indent();
-  printer->Print("Service() : service_(nullptr) {}\n");
+  printer->Print("Service();\n");
   printer->Print("virtual ~Service();\n");
   for (int i = 0; i < service->method_count(); ++i) {
     PrintHeaderServerMethodSync(printer, service->method(i), vars);
@@ -594,7 +594,7 @@ void PrintHeaderService(grpc::protobuf::io::Printer *printer,
   printer->Outdent();
   printer->Print(
       " private:\n"
-      "  ::grpc::RpcService* service_;\n");
+      "  std::unique_ptr< ::grpc::RpcService> service_;\n");
   printer->Print("};\n");
 
   // Server side - Asynchronous
@@ -1013,9 +1013,11 @@ void PrintSourceService(grpc::protobuf::io::Printer *printer,
                  "$prefix$$Service$_method_names, $MethodCount$) "
                  "{}\n\n");
 
+  printer->Print(*vars,
+                 "$ns$$Service$::Service::Service() {\n"
+                 "}\n\n");
   printer->Print(*vars,
                  "$ns$$Service$::Service::~Service() {\n"
-                 "  delete service_;\n"
                  "}\n\n");
   for (int i = 0; i < service->method_count(); ++i) {
     (*vars)["Idx"] = as_string(i);
@@ -1026,10 +1028,10 @@ void PrintSourceService(grpc::protobuf::io::Printer *printer,
                  "::grpc::RpcService* $ns$$Service$::Service::service() {\n");
   printer->Indent();
   printer->Print(
-      "if (service_ != nullptr) {\n"
-      "  return service_;\n"
+      "if (service_) {\n"
+      "  return service_.get();\n"
       "}\n");
-  printer->Print("service_ = new ::grpc::RpcService();\n");
+  printer->Print("service_ = std::unique_ptr< ::grpc::RpcService>(new ::grpc::RpcService());\n");
   for (int i = 0; i < service->method_count(); ++i) {
     const grpc::protobuf::MethodDescriptor *method = service->method(i);
     (*vars)["Idx"] = as_string(i);
@@ -1077,7 +1079,7 @@ void PrintSourceService(grpc::protobuf::io::Printer *printer,
           "        std::mem_fn(&$ns$$Service$::Service::$Method$), this)));\n");
     }
   }
-  printer->Print("return service_;\n");
+  printer->Print("return service_.get();\n");
   printer->Outdent();
   printer->Print("}\n\n");
 }
diff --git a/src/core/channel/client_channel.c b/src/core/channel/client_channel.c
index b59b62a6aa7c09bc675b5c03c6a515c944322be5..9f85557ea14a5603482554bf88086dcd24f51f5b 100644
--- a/src/core/channel/client_channel.c
+++ b/src/core/channel/client_channel.c
@@ -36,22 +36,24 @@
 #include <stdio.h>
 #include <string.h>
 
+#include <grpc/support/alloc.h>
+#include <grpc/support/log.h>
+#include <grpc/support/sync.h>
+#include <grpc/support/useful.h>
+
 #include "src/core/channel/channel_args.h"
 #include "src/core/channel/connected_channel.h"
-#include "src/core/surface/channel.h"
 #include "src/core/iomgr/iomgr.h"
+#include "src/core/profiling/timers.h"
 #include "src/core/support/string.h"
+#include "src/core/surface/channel.h"
 #include "src/core/transport/connectivity_state.h"
-#include <grpc/support/alloc.h>
-#include <grpc/support/log.h>
-#include <grpc/support/sync.h>
-#include <grpc/support/useful.h>
 
 /* Client channel implementation */
 
 typedef struct call_data call_data;
 
-typedef struct {
+typedef struct client_channel_channel_data {
   /** metadata context for this channel */
   grpc_mdctx *mdctx;
   /** resolver for this channel */
@@ -196,13 +198,12 @@ static int is_empty(void *p, int len) {
   return 1;
 }
 
-static void started_call(grpc_exec_ctx *exec_ctx, void *arg,
-                         int iomgr_success) {
+static void started_call_locked(grpc_exec_ctx *exec_ctx, void *arg,
+                                int iomgr_success) {
   call_data *calld = arg;
   grpc_transport_stream_op op;
   int have_waiting;
 
-  gpr_mu_lock(&calld->mu_state);
   if (calld->state == CALL_CANCELLED && calld->subchannel_call != NULL) {
     memset(&op, 0, sizeof(op));
     op.cancel_with_status = GRPC_STATUS_CANCELLED;
@@ -230,10 +231,20 @@ static void started_call(grpc_exec_ctx *exec_ctx, void *arg,
   }
 }
 
+static void started_call(grpc_exec_ctx *exec_ctx, void *arg,
+                         int iomgr_success) {
+  call_data *calld = arg;
+  gpr_mu_lock(&calld->mu_state);
+  started_call_locked(exec_ctx, arg, iomgr_success);
+}
+
 static void picked_target(grpc_exec_ctx *exec_ctx, void *arg,
                           int iomgr_success) {
   call_data *calld = arg;
   grpc_pollset *pollset;
+  grpc_subchannel_call_create_status call_creation_status;
+
+  GPR_TIMER_BEGIN("picked_target", 0);
 
   if (calld->picked_channel == NULL) {
     /* treat this like a cancellation */
@@ -248,13 +259,19 @@ static void picked_target(grpc_exec_ctx *exec_ctx, void *arg,
       GPR_ASSERT(calld->state == CALL_WAITING_FOR_PICK);
       calld->state = CALL_WAITING_FOR_CALL;
       pollset = calld->waiting_op.bind_pollset;
-      gpr_mu_unlock(&calld->mu_state);
       grpc_closure_init(&calld->async_setup_task, started_call, calld);
-      grpc_subchannel_create_call(exec_ctx, calld->picked_channel, pollset,
-                                  &calld->subchannel_call,
-                                  &calld->async_setup_task);
+      call_creation_status = grpc_subchannel_create_call(
+          exec_ctx, calld->picked_channel, pollset, &calld->subchannel_call,
+          &calld->async_setup_task);
+      if (call_creation_status == GRPC_SUBCHANNEL_CALL_CREATE_READY) {
+        started_call_locked(exec_ctx, calld, iomgr_success);
+      } else {
+        gpr_mu_unlock(&calld->mu_state);
+      }
     }
   }
+
+  GPR_TIMER_END("picked_target", 0);
 }
 
 static grpc_closure *merge_into_waiting_op(grpc_call_element *elem,
@@ -315,6 +332,7 @@ static void perform_transport_stream_op(grpc_exec_ctx *exec_ctx,
   grpc_subchannel_call *subchannel_call;
   grpc_lb_policy *lb_policy;
   grpc_transport_stream_op op2;
+  GPR_TIMER_BEGIN("perform_transport_stream_op", 0);
   GPR_ASSERT(elem->filter == &grpc_client_channel_filter);
   GRPC_CALL_LOG_OP(GPR_INFO, elem, op);
 
@@ -426,6 +444,8 @@ static void perform_transport_stream_op(grpc_exec_ctx *exec_ctx,
       }
       break;
   }
+
+  GPR_TIMER_END("perform_transport_stream_op", 0);
 }
 
 static void cc_start_transport_stream_op(grpc_exec_ctx *exec_ctx,
@@ -645,9 +665,7 @@ static void destroy_call_elem(grpc_exec_ctx *exec_ctx,
     case CALL_WAITING_FOR_CONFIG:
     case CALL_WAITING_FOR_CALL:
     case CALL_WAITING_FOR_SEND:
-      gpr_log(GPR_ERROR, "should never reach here");
-      abort();
-      break;
+      GPR_UNREACHABLE_CODE(return );
   }
 }
 
diff --git a/src/core/channel/compress_filter.c b/src/core/channel/compress_filter.c
index 182fbf18bfc869f188f9a46898b80ec9a82d52d0..20b5084044a5cb4cfd9f8be5798371d7550bb726 100644
--- a/src/core/channel/compress_filter.c
+++ b/src/core/channel/compress_filter.c
@@ -41,6 +41,7 @@
 
 #include "src/core/channel/compress_filter.h"
 #include "src/core/channel/channel_args.h"
+#include "src/core/profiling/timers.h"
 #include "src/core/compression/message_compress.h"
 #include "src/core/support/string.h"
 
@@ -242,7 +243,7 @@ static void process_send_ops(grpc_call_element *elem,
         GPR_ASSERT(calld->remaining_slice_bytes > 0);
         /* Increase input ref count, gpr_slice_buffer_add takes ownership.  */
         gpr_slice_buffer_add(&calld->slices, gpr_slice_ref(sop->data.slice));
-        GPR_ASSERT(GPR_SLICE_LENGTH(sop->data.slice) >=
+        GPR_ASSERT(GPR_SLICE_LENGTH(sop->data.slice) <=
                    calld->remaining_slice_bytes);
         calld->remaining_slice_bytes -=
             (gpr_uint32)GPR_SLICE_LENGTH(sop->data.slice);
@@ -271,10 +272,14 @@ static void process_send_ops(grpc_call_element *elem,
 static void compress_start_transport_stream_op(grpc_exec_ctx *exec_ctx,
                                                grpc_call_element *elem,
                                                grpc_transport_stream_op *op) {
+  GPR_TIMER_BEGIN("compress_start_transport_stream_op", 0);
+
   if (op->send_ops && op->send_ops->nops > 0) {
     process_send_ops(elem, op->send_ops);
   }
 
+  GPR_TIMER_END("compress_start_transport_stream_op", 0);
+
   /* pass control down the stack */
   grpc_call_next_op(exec_ctx, elem, op);
 }
diff --git a/src/core/channel/connected_channel.c b/src/core/channel/connected_channel.c
index f9fc280259649ed5c288844bb99637f56bcf5475..6d4d7be63283286f14c66f2edc384858a8d90dfa 100644
--- a/src/core/channel/connected_channel.c
+++ b/src/core/channel/connected_channel.c
@@ -39,6 +39,7 @@
 
 #include "src/core/support/string.h"
 #include "src/core/transport/transport.h"
+#include "src/core/profiling/timers.h"
 #include <grpc/byte_buffer.h>
 #include <grpc/support/alloc.h>
 #include <grpc/support/log.h>
diff --git a/src/core/channel/http_client_filter.c b/src/core/channel/http_client_filter.c
index d67dc37ad22eb3e3972a491f794c7f20a2c3b0e5..f78a5cc31595bf4d0a959d99d74a9f7ee6ed34b9 100644
--- a/src/core/channel/http_client_filter.c
+++ b/src/core/channel/http_client_filter.c
@@ -36,6 +36,7 @@
 #include <grpc/support/log.h>
 #include <grpc/support/string_util.h>
 #include "src/core/support/string.h"
+#include "src/core/profiling/timers.h"
 
 typedef struct call_data {
   grpc_linked_mdelem method;
@@ -162,8 +163,10 @@ static void hc_mutate_op(grpc_call_element *elem,
 static void hc_start_transport_op(grpc_exec_ctx *exec_ctx,
                                   grpc_call_element *elem,
                                   grpc_transport_stream_op *op) {
+  GPR_TIMER_BEGIN("hc_start_transport_op", 0);
   GRPC_CALL_LOG_OP(GPR_INFO, elem, op);
   hc_mutate_op(elem, op);
+  GPR_TIMER_END("hc_start_transport_op", 0);
   grpc_call_next_op(exec_ctx, elem, op);
 }
 
diff --git a/src/core/channel/http_server_filter.c b/src/core/channel/http_server_filter.c
index 5e6d684a5287e2367dbb32412efde8fdb4c99409..99e5066a4efe760a79fcaafe72125a333a98ca4a 100644
--- a/src/core/channel/http_server_filter.c
+++ b/src/core/channel/http_server_filter.c
@@ -36,6 +36,7 @@
 #include <string.h>
 #include <grpc/support/alloc.h>
 #include <grpc/support/log.h>
+#include "src/core/profiling/timers.h"
 
 typedef struct call_data {
   gpr_uint8 got_initial_metadata;
@@ -230,8 +231,10 @@ static void hs_start_transport_op(grpc_exec_ctx *exec_ctx,
                                   grpc_call_element *elem,
                                   grpc_transport_stream_op *op) {
   GRPC_CALL_LOG_OP(GPR_INFO, elem, op);
+  GPR_TIMER_BEGIN("hs_start_transport_op", 0);
   hs_mutate_op(elem, op);
   grpc_call_next_op(exec_ctx, elem, op);
+  GPR_TIMER_END("hs_start_transport_op", 0);
 }
 
 /* Constructor for call_data */
diff --git a/src/core/client_config/lb_policies/pick_first.c b/src/core/client_config/lb_policies/pick_first.c
index 28155d0fbc0490934e892360c82c884bbf6d8a60..e5bf0680ff06ac3943963a1e88913282c70ba14f 100644
--- a/src/core/client_config/lb_policies/pick_first.c
+++ b/src/core/client_config/lb_policies/pick_first.c
@@ -101,6 +101,9 @@ void pf_destroy(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol) {
   for (i = 0; i < p->num_subchannels; i++) {
     GRPC_SUBCHANNEL_UNREF(exec_ctx, p->subchannels[i], "pick_first");
   }
+  if (p->selected) {
+    GRPC_SUBCHANNEL_UNREF(exec_ctx, p->selected, "picked_first");
+  }
   grpc_connectivity_state_destroy(exec_ctx, &p->state_tracker);
   gpr_free(p->subchannels);
   gpr_mu_destroy(&p->mu);
@@ -172,6 +175,35 @@ void pf_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
   }
 }
 
+static void destroy_subchannels(grpc_exec_ctx *exec_ctx, void *arg,
+                                int iomgr_success) {
+  pick_first_lb_policy *p = arg;
+  size_t i;
+  grpc_transport_op op;
+  size_t num_subchannels = p->num_subchannels;
+  grpc_subchannel **subchannels;
+  grpc_subchannel *exclude_subchannel;
+
+  gpr_mu_lock(&p->mu);
+  subchannels = p->subchannels;
+  p->num_subchannels = 0;
+  p->subchannels = NULL;
+  exclude_subchannel = p->selected;
+  gpr_mu_unlock(&p->mu);
+  GRPC_LB_POLICY_UNREF(exec_ctx, &p->base, "destroy_subchannels");
+
+  for (i = 0; i < num_subchannels; i++) {
+    if (subchannels[i] != exclude_subchannel) {
+      memset(&op, 0, sizeof(op));
+      op.disconnect = 1;
+      grpc_subchannel_process_transport_op(exec_ctx, subchannels[i], &op);
+    }
+    GRPC_SUBCHANNEL_UNREF(exec_ctx, subchannels[i], "pick_first");
+  }
+
+  gpr_free(subchannels);
+}
+
 static void pf_connectivity_changed(grpc_exec_ctx *exec_ctx, void *arg,
                                     int iomgr_success) {
   pick_first_lb_policy *p = arg;
@@ -200,6 +232,12 @@ static void pf_connectivity_changed(grpc_exec_ctx *exec_ctx, void *arg,
         grpc_connectivity_state_set(exec_ctx, &p->state_tracker,
                                     GRPC_CHANNEL_READY, "connecting_ready");
         p->selected = p->subchannels[p->checking_subchannel];
+        GRPC_SUBCHANNEL_REF(p->selected, "picked_first");
+        /* drop the pick list: we are connected now */
+        GRPC_LB_POLICY_REF(&p->base, "destroy_subchannels");
+        grpc_exec_ctx_enqueue(exec_ctx,
+                              grpc_closure_create(destroy_subchannels, p), 1);
+        /* update any calls that were waiting for a pick */
         while ((pp = p->pending_picks)) {
           p->pending_picks = pp->next;
           *pp->target = p->selected;
@@ -279,10 +317,15 @@ static void pf_broadcast(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
   size_t i;
   size_t n;
   grpc_subchannel **subchannels;
+  grpc_subchannel *selected;
 
   gpr_mu_lock(&p->mu);
   n = p->num_subchannels;
   subchannels = gpr_malloc(n * sizeof(*subchannels));
+  selected = p->selected;
+  if (selected) {
+    GRPC_SUBCHANNEL_REF(selected, "pf_broadcast_to_selected");
+  }
   for (i = 0; i < n; i++) {
     subchannels[i] = p->subchannels[i];
     GRPC_SUBCHANNEL_REF(subchannels[i], "pf_broadcast");
@@ -290,9 +333,14 @@ static void pf_broadcast(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
   gpr_mu_unlock(&p->mu);
 
   for (i = 0; i < n; i++) {
+    if (selected == subchannels[i]) continue;
     grpc_subchannel_process_transport_op(exec_ctx, subchannels[i], op);
     GRPC_SUBCHANNEL_UNREF(exec_ctx, subchannels[i], "pf_broadcast");
   }
+  if (p->selected) {
+    grpc_subchannel_process_transport_op(exec_ctx, selected, op);
+    GRPC_SUBCHANNEL_UNREF(exec_ctx, selected, "pf_broadcast_to_selected");
+  }
   gpr_free(subchannels);
 }
 
diff --git a/src/core/client_config/subchannel.c b/src/core/client_config/subchannel.c
index a378f06543570e75839b143c7fa8173099baefcd..8494ebdc1df76844d3d886af64811079e0b28b1b 100644
--- a/src/core/client_config/subchannel.c
+++ b/src/core/client_config/subchannel.c
@@ -358,18 +358,20 @@ static void start_connect(grpc_exec_ctx *exec_ctx, grpc_subchannel *c) {
 
 static void continue_creating_call(grpc_exec_ctx *exec_ctx, void *arg,
                                    int iomgr_success) {
+  grpc_subchannel_call_create_status call_creation_status;
   waiting_for_connect *w4c = arg;
   grpc_subchannel_del_interested_party(exec_ctx, w4c->subchannel, w4c->pollset);
-  grpc_subchannel_create_call(exec_ctx, w4c->subchannel, w4c->pollset,
-                              w4c->target, w4c->notify);
+  call_creation_status = grpc_subchannel_create_call(
+      exec_ctx, w4c->subchannel, w4c->pollset, w4c->target, w4c->notify);
+  GPR_ASSERT(call_creation_status == GRPC_SUBCHANNEL_CALL_CREATE_READY);
+  w4c->notify->cb(exec_ctx, w4c->notify->cb_arg, iomgr_success);
   GRPC_SUBCHANNEL_UNREF(exec_ctx, w4c->subchannel, "waiting_for_connect");
   gpr_free(w4c);
 }
 
-void grpc_subchannel_create_call(grpc_exec_ctx *exec_ctx, grpc_subchannel *c,
-                                 grpc_pollset *pollset,
-                                 grpc_subchannel_call **target,
-                                 grpc_closure *notify) {
+grpc_subchannel_call_create_status grpc_subchannel_create_call(
+    grpc_exec_ctx *exec_ctx, grpc_subchannel *c, grpc_pollset *pollset,
+    grpc_subchannel_call **target, grpc_closure *notify) {
   connection *con;
   gpr_mu_lock(&c->mu);
   if (c->active != NULL) {
@@ -378,7 +380,7 @@ void grpc_subchannel_create_call(grpc_exec_ctx *exec_ctx, grpc_subchannel *c,
     gpr_mu_unlock(&c->mu);
 
     *target = create_call(exec_ctx, con);
-    notify->cb(exec_ctx, notify->cb_arg, 1);
+    return GRPC_SUBCHANNEL_CALL_CREATE_READY;
   } else {
     waiting_for_connect *w4c = gpr_malloc(sizeof(*w4c));
     w4c->next = c->waiting;
@@ -403,6 +405,7 @@ void grpc_subchannel_create_call(grpc_exec_ctx *exec_ctx, grpc_subchannel *c,
     } else {
       gpr_mu_unlock(&c->mu);
     }
+    return GRPC_SUBCHANNEL_CALL_CREATE_PENDING;
   }
 }
 
diff --git a/src/core/client_config/subchannel.h b/src/core/client_config/subchannel.h
index f9bc0c2d2fb7b150b6104a0857999782a8262678..ec1cc7cc69d46c876f7badefea1e282f61f40614 100644
--- a/src/core/client_config/subchannel.h
+++ b/src/core/client_config/subchannel.h
@@ -75,12 +75,22 @@ void grpc_subchannel_call_unref(grpc_exec_ctx *exec_ctx,
                                 grpc_subchannel_call *call
                                     GRPC_SUBCHANNEL_REF_EXTRA_ARGS);
 
-/** construct a call (possibly asynchronously) */
-void grpc_subchannel_create_call(grpc_exec_ctx *exec_ctx,
-                                 grpc_subchannel *subchannel,
-                                 grpc_pollset *pollset,
-                                 grpc_subchannel_call **target,
-                                 grpc_closure *notify);
+typedef enum {
+  GRPC_SUBCHANNEL_CALL_CREATE_READY,
+  GRPC_SUBCHANNEL_CALL_CREATE_PENDING
+} grpc_subchannel_call_create_status;
+
+/** construct a subchannel call (possibly asynchronously).
+ *
+ * If the returned status is \a GRPC_SUBCHANNEL_CALL_CREATE_READY, the call will
+ * return immediately and \a target will point to a connected \a subchannel_call
+ * instance. Note that \a notify will \em not be invoked in this case.
+ * Otherwise, if the returned status is GRPC_SUBCHANNEL_CALL_CREATE_PENDING, the
+ * subchannel call will be created asynchronously, invoking the \a notify
+ * callback upon completion. */
+grpc_subchannel_call_create_status grpc_subchannel_create_call(
+    grpc_exec_ctx *exec_ctx, grpc_subchannel *subchannel, grpc_pollset *pollset,
+    grpc_subchannel_call **target, grpc_closure *notify);
 
 /** cancel \a call in the waiting state. */
 void grpc_subchannel_cancel_waiting_call(grpc_exec_ctx *exec_ctx,
diff --git a/src/core/client_config/uri_parser.c b/src/core/client_config/uri_parser.c
index df9f32d403cb6bf89bd8debdd5ae24aa7c7e476f..cbdfffcf8e88ebf5c32944ef5d80b3ddacd2e0d4 100644
--- a/src/core/client_config/uri_parser.c
+++ b/src/core/client_config/uri_parser.c
@@ -37,6 +37,7 @@
 
 #include <grpc/support/alloc.h>
 #include <grpc/support/log.h>
+#include <grpc/support/port_platform.h>
 #include <grpc/support/string_util.h>
 
 /** a size_t default value... maps to all 1's */
@@ -120,8 +121,7 @@ static int parse_fragment_or_query(const char *uri_text, size_t *i) {
         } else {
           return 1;
         }
-        gpr_log(GPR_ERROR, "should never reach here");
-        abort();
+        GPR_UNREACHABLE_CODE(return 0);
       default:
         (*i) += advance;
         break;
diff --git a/src/core/compression/algorithm.c b/src/core/compression/algorithm.c
index d55e499f5eac8a07046444763a1515e61b0e8583..fd95a3c8912c354e86c19863e35d96b4447ca0f4 100644
--- a/src/core/compression/algorithm.c
+++ b/src/core/compression/algorithm.c
@@ -101,6 +101,7 @@ grpc_compression_algorithm grpc_compression_algorithm_for_level(
     default:
       /* we shouldn't be making it here */
       abort();
+      return GRPC_COMPRESS_NONE;
   }
 }
 
@@ -116,6 +117,7 @@ grpc_compression_level grpc_compression_level_for_algorithm(
     }
   }
   abort();
+  return GRPC_COMPRESS_LEVEL_NONE;
 }
 
 void grpc_compression_options_init(grpc_compression_options *opts) {
diff --git a/src/core/httpcli/parser.c b/src/core/httpcli/parser.c
index 404906d5ae216054c176dec2f8e318399d88cee6..046770c094421f6e2a122115725a50ba0cfc9aeb 100644
--- a/src/core/httpcli/parser.c
+++ b/src/core/httpcli/parser.c
@@ -139,8 +139,7 @@ static int finish_line(grpc_httpcli_parser *parser) {
       }
       break;
     case GRPC_HTTPCLI_BODY:
-      gpr_log(GPR_ERROR, "should never reach here");
-      abort();
+      GPR_UNREACHABLE_CODE(return 0);
   }
 
   parser->cur_line_length = 0;
@@ -165,8 +164,7 @@ static int addbyte(grpc_httpcli_parser *parser, gpr_uint8 byte) {
       } else {
         return 1;
       }
-      gpr_log(GPR_ERROR, "should never reach here");
-      abort();
+      GPR_UNREACHABLE_CODE(return 0);
     case GRPC_HTTPCLI_BODY:
       if (parser->r.body_length == parser->body_capacity) {
         parser->body_capacity = GPR_MAX(8, parser->body_capacity * 3 / 2);
@@ -177,10 +175,7 @@ static int addbyte(grpc_httpcli_parser *parser, gpr_uint8 byte) {
       parser->r.body_length++;
       return 1;
   }
-  gpr_log(GPR_ERROR, "should never reach here");
-  abort();
-
-  return 0;
+  GPR_UNREACHABLE_CODE(return 0);
 }
 
 void grpc_httpcli_parser_init(grpc_httpcli_parser *parser) {
diff --git a/src/core/iomgr/closure.c b/src/core/iomgr/closure.c
index 326542578923e19105e3336ebde5f2c4507641e9..d91681990f29104d022687c37ce3790e203dd137 100644
--- a/src/core/iomgr/closure.c
+++ b/src/core/iomgr/closure.c
@@ -33,6 +33,8 @@
 
 #include "src/core/iomgr/closure.h"
 
+#include <grpc/support/alloc.h>
+
 void grpc_closure_init(grpc_closure *closure, grpc_iomgr_cb_func cb,
                        void *cb_arg) {
   closure->cb = cb;
@@ -69,3 +71,25 @@ void grpc_closure_list_move(grpc_closure_list *src, grpc_closure_list *dst) {
   }
   src->head = src->tail = NULL;
 }
+
+typedef struct {
+  grpc_iomgr_cb_func cb;
+  void *cb_arg;
+  grpc_closure wrapper;
+} wrapped_closure;
+
+static void closure_wrapper(grpc_exec_ctx *exec_ctx, void *arg, int success) {
+  wrapped_closure *wc = arg;
+  grpc_iomgr_cb_func cb = wc->cb;
+  void *cb_arg = wc->cb_arg;
+  gpr_free(wc);
+  cb(exec_ctx, cb_arg, success);
+}
+
+grpc_closure *grpc_closure_create(grpc_iomgr_cb_func cb, void *cb_arg) {
+  wrapped_closure *wc = gpr_malloc(sizeof(*wc));
+  wc->cb = cb;
+  wc->cb_arg = cb_arg;
+  grpc_closure_init(&wc->wrapper, closure_wrapper, wc);
+  return &wc->wrapper;
+}
diff --git a/src/core/iomgr/closure.h b/src/core/iomgr/closure.h
index 982ffa4e1be246a279745f85ab250ee2fee51bef..d812659af0ce914607a4a0e86f6f0544aefdd2c9 100644
--- a/src/core/iomgr/closure.h
+++ b/src/core/iomgr/closure.h
@@ -77,6 +77,9 @@ struct grpc_closure {
 void grpc_closure_init(grpc_closure *closure, grpc_iomgr_cb_func cb,
                        void *cb_arg);
 
+/* Create a heap allocated closure: try to avoid except for very rare events */
+grpc_closure *grpc_closure_create(grpc_iomgr_cb_func cb, void *cb_arg);
+
 #define GRPC_CLOSURE_LIST_INIT \
   { NULL, NULL }
 
diff --git a/src/core/iomgr/exec_ctx.c b/src/core/iomgr/exec_ctx.c
index f2914d376efc16fe70265a5acbd38399226bf609..410b34c521346a8e115cdb78636c45a054abfa03 100644
--- a/src/core/iomgr/exec_ctx.c
+++ b/src/core/iomgr/exec_ctx.c
@@ -35,18 +35,24 @@
 
 #include <grpc/support/log.h>
 
+#include "src/core/profiling/timers.h"
+
 int grpc_exec_ctx_flush(grpc_exec_ctx *exec_ctx) {
   int did_something = 0;
+  GPR_TIMER_BEGIN("grpc_exec_ctx_flush", 0);
   while (!grpc_closure_list_empty(exec_ctx->closure_list)) {
     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;
-      did_something = 1;
+      did_something++;
+      GPR_TIMER_BEGIN("grpc_exec_ctx_flush.cb", 0);
       c->cb(exec_ctx, c->cb_arg, c->success);
+      GPR_TIMER_END("grpc_exec_ctx_flush.cb", 0);
       c = next;
     }
   }
+  GPR_TIMER_END("grpc_exec_ctx_flush", 0);
   return did_something;
 }
 
diff --git a/src/core/iomgr/fd_posix.c b/src/core/iomgr/fd_posix.c
index b48b7f050aaaa11f5c62145734001a04f16b51e7..7ff80e6cf82ebce6d234712e8f5a39f8dad886b9 100644
--- a/src/core/iomgr/fd_posix.c
+++ b/src/core/iomgr/fd_posix.c
@@ -45,10 +45,8 @@
 #include <grpc/support/log.h>
 #include <grpc/support/useful.h>
 
-enum descriptor_state {
-  NOT_READY = 0,
-  READY = 1
-}; /* or a pointer to a closure to call */
+#define CLOSURE_NOT_READY ((grpc_closure *)0)
+#define CLOSURE_READY ((grpc_closure *)1)
 
 /* We need to keep a freelist not because of any concerns of malloc performance
  * but instead so that implementations with multiple threads in (for example)
@@ -88,14 +86,13 @@ static grpc_fd *alloc_fd(int fd) {
   gpr_mu_unlock(&fd_freelist_mu);
   if (r == NULL) {
     r = gpr_malloc(sizeof(grpc_fd));
-    gpr_mu_init(&r->set_state_mu);
-    gpr_mu_init(&r->watcher_mu);
+    gpr_mu_init(&r->mu);
   }
 
   gpr_atm_rel_store(&r->refst, 1);
-  gpr_atm_rel_store(&r->readst, NOT_READY);
-  gpr_atm_rel_store(&r->writest, NOT_READY);
-  gpr_atm_rel_store(&r->shutdown, 0);
+  r->shutdown = 0;
+  r->read_closure = CLOSURE_NOT_READY;
+  r->write_closure = CLOSURE_NOT_READY;
   r->fd = fd;
   r->inactive_watcher_root.next = r->inactive_watcher_root.prev =
       &r->inactive_watcher_root;
@@ -107,8 +104,7 @@ static grpc_fd *alloc_fd(int fd) {
 }
 
 static void destroy(grpc_fd *fd) {
-  gpr_mu_destroy(&fd->set_state_mu);
-  gpr_mu_destroy(&fd->watcher_mu);
+  gpr_mu_destroy(&fd->mu);
   gpr_free(fd);
 }
 
@@ -173,39 +169,35 @@ int grpc_fd_is_orphaned(grpc_fd *fd) {
   return (gpr_atm_acq_load(&fd->refst) & 1) == 0;
 }
 
-static void pollset_kick_locked(grpc_pollset *pollset) {
-  gpr_mu_lock(GRPC_POLLSET_MU(pollset));
-  grpc_pollset_kick(pollset, NULL);
-  gpr_mu_unlock(GRPC_POLLSET_MU(pollset));
+static void pollset_kick_locked(grpc_fd_watcher *watcher) {
+  gpr_mu_lock(GRPC_POLLSET_MU(watcher->pollset));
+  GPR_ASSERT(watcher->worker);
+  grpc_pollset_kick_ext(watcher->pollset, watcher->worker,
+                        GRPC_POLLSET_REEVALUATE_POLLING_ON_WAKEUP);
+  gpr_mu_unlock(GRPC_POLLSET_MU(watcher->pollset));
 }
 
 static void maybe_wake_one_watcher_locked(grpc_fd *fd) {
   if (fd->inactive_watcher_root.next != &fd->inactive_watcher_root) {
-    pollset_kick_locked(fd->inactive_watcher_root.next->pollset);
+    pollset_kick_locked(fd->inactive_watcher_root.next);
   } else if (fd->read_watcher) {
-    pollset_kick_locked(fd->read_watcher->pollset);
+    pollset_kick_locked(fd->read_watcher);
   } else if (fd->write_watcher) {
-    pollset_kick_locked(fd->write_watcher->pollset);
+    pollset_kick_locked(fd->write_watcher);
   }
 }
 
-static void maybe_wake_one_watcher(grpc_fd *fd) {
-  gpr_mu_lock(&fd->watcher_mu);
-  maybe_wake_one_watcher_locked(fd);
-  gpr_mu_unlock(&fd->watcher_mu);
-}
-
 static void wake_all_watchers_locked(grpc_fd *fd) {
   grpc_fd_watcher *watcher;
   for (watcher = fd->inactive_watcher_root.next;
        watcher != &fd->inactive_watcher_root; watcher = watcher->next) {
-    pollset_kick_locked(watcher->pollset);
+    pollset_kick_locked(watcher);
   }
   if (fd->read_watcher) {
-    pollset_kick_locked(fd->read_watcher->pollset);
+    pollset_kick_locked(fd->read_watcher);
   }
   if (fd->write_watcher && fd->write_watcher != fd->read_watcher) {
-    pollset_kick_locked(fd->write_watcher->pollset);
+    pollset_kick_locked(fd->write_watcher);
   }
 }
 
@@ -218,7 +210,7 @@ void grpc_fd_orphan(grpc_exec_ctx *exec_ctx, grpc_fd *fd, grpc_closure *on_done,
                     const char *reason) {
   fd->on_done_closure = on_done;
   shutdown(fd->fd, SHUT_RDWR);
-  gpr_mu_lock(&fd->watcher_mu);
+  gpr_mu_lock(&fd->mu);
   REF_BY(fd, 1, reason); /* remove active status, but keep referenced */
   if (!has_watchers(fd)) {
     fd->closed = 1;
@@ -227,7 +219,7 @@ void grpc_fd_orphan(grpc_exec_ctx *exec_ctx, grpc_fd *fd, grpc_closure *on_done,
   } else {
     wake_all_watchers_locked(fd);
   }
-  gpr_mu_unlock(&fd->watcher_mu);
+  gpr_mu_unlock(&fd->mu);
   UNREF_BY(fd, 2, reason); /* drop the reference */
 }
 
@@ -247,136 +239,121 @@ void grpc_fd_ref(grpc_fd *fd) { ref_by(fd, 2); }
 void grpc_fd_unref(grpc_fd *fd) { unref_by(fd, 2); }
 #endif
 
-static void notify_on(grpc_exec_ctx *exec_ctx, grpc_fd *fd, gpr_atm *st,
-                      grpc_closure *closure) {
-  switch (gpr_atm_acq_load(st)) {
-    case NOT_READY:
-      /* There is no race if the descriptor is already ready, so we skip
-         the interlocked op in that case.  As long as the app doesn't
-         try to set the same upcall twice (which it shouldn't) then
-         oldval should never be anything other than READY or NOT_READY.  We
-         don't
-         check for user error on the fast path. */
-      if (gpr_atm_rel_cas(st, NOT_READY, (gpr_intptr)closure)) {
-        /* swap was successful -- the closure will run after the next
-           set_ready call.  NOTE: we don't have an ABA problem here,
-           since we should never have concurrent calls to the same
-           notify_on function. */
-        maybe_wake_one_watcher(fd);
-        return;
-      }
-    /* swap was unsuccessful due to an intervening set_ready call.
-       Fall through to the READY code below */
-    case READY:
-      GPR_ASSERT(gpr_atm_no_barrier_load(st) == READY);
-      gpr_atm_rel_store(st, NOT_READY);
-      grpc_exec_ctx_enqueue(exec_ctx, closure,
-                            !gpr_atm_acq_load(&fd->shutdown));
-      return;
-    default: /* WAITING */
-      /* upcallptr was set to a different closure.  This is an error! */
-      gpr_log(GPR_ERROR,
-              "User called a notify_on function with a previous callback still "
-              "pending");
-      abort();
+static void notify_on_locked(grpc_exec_ctx *exec_ctx, grpc_fd *fd,
+                             grpc_closure **st, grpc_closure *closure) {
+  if (*st == CLOSURE_NOT_READY) {
+    /* not ready ==> switch to a waiting state by setting the closure */
+    *st = closure;
+  } else if (*st == CLOSURE_READY) {
+    /* already ready ==> queue the closure to run immediately */
+    *st = CLOSURE_NOT_READY;
+    grpc_exec_ctx_enqueue(exec_ctx, closure, !fd->shutdown);
+    maybe_wake_one_watcher_locked(fd);
+  } else {
+    /* upcallptr was set to a different closure.  This is an error! */
+    gpr_log(GPR_ERROR,
+            "User called a notify_on function with a previous callback still "
+            "pending");
+    abort();
   }
-  gpr_log(GPR_ERROR, "Corrupt memory in &st->state");
-  abort();
 }
 
-static void set_ready_locked(grpc_exec_ctx *exec_ctx, grpc_fd *fd,
-                             gpr_atm *st) {
-  gpr_intptr state = gpr_atm_acq_load(st);
-
-  switch (state) {
-    case READY:
-      /* duplicate ready, ignore */
-      return;
-    case NOT_READY:
-      if (gpr_atm_rel_cas(st, NOT_READY, READY)) {
-        /* swap was successful -- the closure will run after the next
-           notify_on call. */
-        return;
-      }
-      /* swap was unsuccessful due to an intervening set_ready call.
-         Fall through to the WAITING code below */
-      state = gpr_atm_acq_load(st);
-    default: /* waiting */
-      GPR_ASSERT(gpr_atm_no_barrier_load(st) != READY &&
-                 gpr_atm_no_barrier_load(st) != NOT_READY);
-      grpc_exec_ctx_enqueue(exec_ctx, (grpc_closure *)state,
-                            !gpr_atm_acq_load(&fd->shutdown));
-      gpr_atm_rel_store(st, NOT_READY);
-      return;
+/* returns 1 if state becomes not ready */
+static int set_ready_locked(grpc_exec_ctx *exec_ctx, grpc_fd *fd,
+                            grpc_closure **st) {
+  if (*st == CLOSURE_READY) {
+    /* duplicate ready ==> ignore */
+    return 0;
+  } else if (*st == CLOSURE_NOT_READY) {
+    /* not ready, and not waiting ==> flag ready */
+    *st = CLOSURE_READY;
+    return 0;
+  } else {
+    /* waiting ==> queue closure */
+    grpc_exec_ctx_enqueue(exec_ctx, *st, !fd->shutdown);
+    *st = CLOSURE_NOT_READY;
+    return 1;
   }
 }
 
-static void set_ready(grpc_exec_ctx *exec_ctx, grpc_fd *fd, gpr_atm *st) {
+static void set_ready(grpc_exec_ctx *exec_ctx, grpc_fd *fd, grpc_closure **st) {
   /* only one set_ready can be active at once (but there may be a racing
      notify_on) */
-  gpr_mu_lock(&fd->set_state_mu);
+  gpr_mu_lock(&fd->mu);
   set_ready_locked(exec_ctx, fd, st);
-  gpr_mu_unlock(&fd->set_state_mu);
+  gpr_mu_unlock(&fd->mu);
 }
 
 void grpc_fd_shutdown(grpc_exec_ctx *exec_ctx, grpc_fd *fd) {
-  gpr_mu_lock(&fd->set_state_mu);
-  GPR_ASSERT(!gpr_atm_no_barrier_load(&fd->shutdown));
-  gpr_atm_rel_store(&fd->shutdown, 1);
-  set_ready_locked(exec_ctx, fd, &fd->readst);
-  set_ready_locked(exec_ctx, fd, &fd->writest);
-  gpr_mu_unlock(&fd->set_state_mu);
+  gpr_mu_lock(&fd->mu);
+  GPR_ASSERT(!fd->shutdown);
+  fd->shutdown = 1;
+  set_ready_locked(exec_ctx, fd, &fd->read_closure);
+  set_ready_locked(exec_ctx, fd, &fd->write_closure);
+  gpr_mu_unlock(&fd->mu);
 }
 
 void grpc_fd_notify_on_read(grpc_exec_ctx *exec_ctx, grpc_fd *fd,
                             grpc_closure *closure) {
-  notify_on(exec_ctx, fd, &fd->readst, closure);
+  gpr_mu_lock(&fd->mu);
+  notify_on_locked(exec_ctx, fd, &fd->read_closure, closure);
+  gpr_mu_unlock(&fd->mu);
 }
 
 void grpc_fd_notify_on_write(grpc_exec_ctx *exec_ctx, grpc_fd *fd,
                              grpc_closure *closure) {
-  notify_on(exec_ctx, fd, &fd->writest, closure);
+  gpr_mu_lock(&fd->mu);
+  notify_on_locked(exec_ctx, fd, &fd->write_closure, closure);
+  gpr_mu_unlock(&fd->mu);
 }
 
 gpr_uint32 grpc_fd_begin_poll(grpc_fd *fd, grpc_pollset *pollset,
-                              gpr_uint32 read_mask, gpr_uint32 write_mask,
-                              grpc_fd_watcher *watcher) {
+                              grpc_pollset_worker *worker, gpr_uint32 read_mask,
+                              gpr_uint32 write_mask, grpc_fd_watcher *watcher) {
   gpr_uint32 mask = 0;
+  grpc_closure *cur;
+  int requested;
   /* keep track of pollers that have requested our events, in case they change
    */
   GRPC_FD_REF(fd, "poll");
 
-  gpr_mu_lock(&fd->watcher_mu);
+  gpr_mu_lock(&fd->mu);
+
   /* if we are shutdown, then don't add to the watcher set */
-  if (gpr_atm_no_barrier_load(&fd->shutdown)) {
+  if (fd->shutdown) {
     watcher->fd = NULL;
     watcher->pollset = NULL;
-    gpr_mu_unlock(&fd->watcher_mu);
+    watcher->worker = NULL;
+    gpr_mu_unlock(&fd->mu);
     GRPC_FD_UNREF(fd, "poll");
     return 0;
   }
+
   /* if there is nobody polling for read, but we need to, then start doing so */
-  if (read_mask && !fd->read_watcher &&
-      (gpr_uintptr)gpr_atm_acq_load(&fd->readst) > READY) {
+  cur = fd->read_closure;
+  requested = cur != CLOSURE_READY;
+  if (read_mask && fd->read_watcher == NULL && requested) {
     fd->read_watcher = watcher;
     mask |= read_mask;
   }
   /* if there is nobody polling for write, but we need to, then start doing so
    */
-  if (write_mask && !fd->write_watcher &&
-      (gpr_uintptr)gpr_atm_acq_load(&fd->writest) > READY) {
+  cur = fd->write_closure;
+  requested = cur != CLOSURE_READY;
+  if (write_mask && fd->write_watcher == NULL && requested) {
     fd->write_watcher = watcher;
     mask |= write_mask;
   }
   /* if not polling, remember this watcher in case we need someone to later */
-  if (mask == 0) {
+  if (mask == 0 && worker != NULL) {
     watcher->next = &fd->inactive_watcher_root;
     watcher->prev = watcher->next->prev;
     watcher->next->prev = watcher->prev->next = watcher;
   }
   watcher->pollset = pollset;
+  watcher->worker = worker;
   watcher->fd = fd;
-  gpr_mu_unlock(&fd->watcher_mu);
+  gpr_mu_unlock(&fd->mu);
 
   return mask;
 }
@@ -391,24 +368,39 @@ void grpc_fd_end_poll(grpc_exec_ctx *exec_ctx, grpc_fd_watcher *watcher,
     return;
   }
 
-  gpr_mu_lock(&fd->watcher_mu);
+  gpr_mu_lock(&fd->mu);
+
   if (watcher == fd->read_watcher) {
     /* remove read watcher, kick if we still need a read */
     was_polling = 1;
-    kick = kick || !got_read;
+    if (!got_read) {
+      kick = 1;
+    }
     fd->read_watcher = NULL;
   }
   if (watcher == fd->write_watcher) {
     /* remove write watcher, kick if we still need a write */
     was_polling = 1;
-    kick = kick || !got_write;
+    if (!got_write) {
+      kick = 1;
+    }
     fd->write_watcher = NULL;
   }
-  if (!was_polling) {
+  if (!was_polling && watcher->worker != NULL) {
     /* remove from inactive list */
     watcher->next->prev = watcher->prev;
     watcher->prev->next = watcher->next;
   }
+  if (got_read) {
+    if (set_ready_locked(exec_ctx, fd, &fd->read_closure)) {
+      kick = 1;
+    }
+  }
+  if (got_write) {
+    if (set_ready_locked(exec_ctx, fd, &fd->write_closure)) {
+      kick = 1;
+    }
+  }
   if (kick) {
     maybe_wake_one_watcher_locked(fd);
   }
@@ -417,17 +409,17 @@ void grpc_fd_end_poll(grpc_exec_ctx *exec_ctx, grpc_fd_watcher *watcher,
     close(fd->fd);
     grpc_exec_ctx_enqueue(exec_ctx, fd->on_done_closure, 1);
   }
-  gpr_mu_unlock(&fd->watcher_mu);
+  gpr_mu_unlock(&fd->mu);
 
   GRPC_FD_UNREF(fd, "poll");
 }
 
 void grpc_fd_become_readable(grpc_exec_ctx *exec_ctx, grpc_fd *fd) {
-  set_ready(exec_ctx, fd, &fd->readst);
+  set_ready(exec_ctx, fd, &fd->read_closure);
 }
 
 void grpc_fd_become_writable(grpc_exec_ctx *exec_ctx, grpc_fd *fd) {
-  set_ready(exec_ctx, fd, &fd->writest);
+  set_ready(exec_ctx, fd, &fd->write_closure);
 }
 
 #endif
diff --git a/src/core/iomgr/fd_posix.h b/src/core/iomgr/fd_posix.h
index 089aa4d7175641f6c04ce3360c3b87e0a0c53e5c..dc917ebbc0ff195ff36569a85b8e32c67ea14985 100644
--- a/src/core/iomgr/fd_posix.h
+++ b/src/core/iomgr/fd_posix.h
@@ -46,6 +46,7 @@ typedef struct grpc_fd_watcher {
   struct grpc_fd_watcher *next;
   struct grpc_fd_watcher *prev;
   grpc_pollset *pollset;
+  grpc_pollset_worker *worker;
   grpc_fd *fd;
 } grpc_fd_watcher;
 
@@ -58,8 +59,8 @@ struct grpc_fd {
      and just unref by 1 when we're ready to flag the object as orphaned */
   gpr_atm refst;
 
-  gpr_mu set_state_mu;
-  gpr_atm shutdown;
+  gpr_mu mu;
+  int shutdown;
   int closed;
 
   /* The watcher list.
@@ -84,18 +85,16 @@ struct grpc_fd {
      If at a later time there becomes need of a poller to poll, one of
      the inactive pollers may be kicked out of their poll loops to take
      that responsibility. */
-  gpr_mu watcher_mu;
   grpc_fd_watcher inactive_watcher_root;
   grpc_fd_watcher *read_watcher;
   grpc_fd_watcher *write_watcher;
 
-  gpr_atm readst;
-  gpr_atm writest;
+  grpc_closure *read_closure;
+  grpc_closure *write_closure;
 
   struct grpc_fd *freelist_next;
 
   grpc_closure *on_done_closure;
-  grpc_closure *shutdown_closures[2];
 
   grpc_iomgr_object iomgr_object;
 };
@@ -126,10 +125,12 @@ void grpc_fd_orphan(grpc_exec_ctx *exec_ctx, grpc_fd *fd, grpc_closure *on_done,
    fd's current interest (such as epoll) do not need to call this function.
    MUST NOT be called with a pollset lock taken */
 gpr_uint32 grpc_fd_begin_poll(grpc_fd *fd, grpc_pollset *pollset,
-                              gpr_uint32 read_mask, gpr_uint32 write_mask,
-                              grpc_fd_watcher *rec);
+                              grpc_pollset_worker *worker, gpr_uint32 read_mask,
+                              gpr_uint32 write_mask, grpc_fd_watcher *rec);
 /* Complete polling previously started with grpc_fd_begin_poll
-   MUST NOT be called with a pollset lock taken */
+   MUST NOT be called with a pollset lock taken
+   if got_read or got_write are 1, also does the become_{readable,writable} as
+   appropriate. */
 void grpc_fd_end_poll(grpc_exec_ctx *exec_ctx, grpc_fd_watcher *rec,
                       int got_read, int got_write);
 
diff --git a/src/core/iomgr/pollset_multipoller_with_epoll.c b/src/core/iomgr/pollset_multipoller_with_epoll.c
index faf0a6362b41184991c9c9beeaf22d69ed7f501d..2aafd21dfb5d04d2e4fe2e045db24fe8c1e40adb 100644
--- a/src/core/iomgr/pollset_multipoller_with_epoll.c
+++ b/src/core/iomgr/pollset_multipoller_with_epoll.c
@@ -41,10 +41,11 @@
 #include <sys/epoll.h>
 #include <unistd.h>
 
-#include "src/core/iomgr/fd_posix.h"
-#include "src/core/support/block_annotate.h"
 #include <grpc/support/alloc.h>
 #include <grpc/support/log.h>
+#include "src/core/iomgr/fd_posix.h"
+#include "src/core/support/block_annotate.h"
+#include "src/core/profiling/timers.h"
 
 typedef struct wakeup_fd_hdl {
   grpc_wakeup_fd wakeup_fd;
@@ -72,7 +73,7 @@ static void finally_add_fd(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset,
   /* We pretend to be polling whilst adding an fd to keep the fd from being
      closed during the add. This may result in a spurious wakeup being assigned
      to this pollset whilst adding, but that should be benign. */
-  GPR_ASSERT(grpc_fd_begin_poll(fd, pollset, 0, 0, &watcher) == 0);
+  GPR_ASSERT(grpc_fd_begin_poll(fd, pollset, NULL, 0, 0, &watcher) == 0);
   if (watcher.fd != NULL) {
     ev.events = (uint32_t)(EPOLLIN | EPOLLOUT | EPOLLET);
     ev.data.ptr = fd;
@@ -182,9 +183,11 @@ static void multipoll_with_epoll_pollset_maybe_work_and_unlock(
 
   /* TODO(vpai): Consider first doing a 0 timeout poll here to avoid
      even going into the blocking annotation if possible */
+  GPR_TIMER_BEGIN("poll", 0);
   GRPC_SCHEDULING_START_BLOCKING_REGION;
   poll_rv = grpc_poll_function(pfds, 2, timeout_ms);
   GRPC_SCHEDULING_END_BLOCKING_REGION;
+  GPR_TIMER_END("poll", 0);
 
   if (poll_rv < 0) {
     if (errno != EINTR) {
diff --git a/src/core/iomgr/pollset_multipoller_with_poll_posix.c b/src/core/iomgr/pollset_multipoller_with_poll_posix.c
index 1356ebe7a0659a40b3204a225b97b36e8c1d4d44..faa6c1449133bbafb507a69f3a56b37e8155d638 100644
--- a/src/core/iomgr/pollset_multipoller_with_poll_posix.c
+++ b/src/core/iomgr/pollset_multipoller_with_poll_posix.c
@@ -102,6 +102,9 @@ static void multipoll_with_poll_pollset_del_fd(grpc_exec_ctx *exec_ctx,
 static void multipoll_with_poll_pollset_maybe_work_and_unlock(
     grpc_exec_ctx *exec_ctx, grpc_pollset *pollset, grpc_pollset_worker *worker,
     gpr_timespec deadline, gpr_timespec now) {
+#define POLLOUT_CHECK (POLLOUT | POLLHUP | POLLERR)
+#define POLLIN_CHECK (POLLIN | POLLHUP | POLLERR)
+
   int timeout;
   int r;
   size_t i, j, fd_count;
@@ -147,8 +150,8 @@ static void multipoll_with_poll_pollset_maybe_work_and_unlock(
   gpr_mu_unlock(&pollset->mu);
 
   for (i = 2; i < pfd_count; i++) {
-    pfds[i].events = (short)grpc_fd_begin_poll(watchers[i].fd, pollset, POLLIN,
-                                               POLLOUT, &watchers[i]);
+    pfds[i].events = (short)grpc_fd_begin_poll(watchers[i].fd, pollset, worker,
+                                               POLLIN, POLLOUT, &watchers[i]);
   }
 
   /* TODO(vpai): Consider first doing a 0 timeout poll here to avoid
@@ -157,34 +160,29 @@ static void multipoll_with_poll_pollset_maybe_work_and_unlock(
   r = grpc_poll_function(pfds, pfd_count, timeout);
   GRPC_SCHEDULING_END_BLOCKING_REGION;
 
-  for (i = 2; i < pfd_count; i++) {
-    grpc_fd_end_poll(exec_ctx, &watchers[i], pfds[i].revents & POLLIN,
-                     pfds[i].revents & POLLOUT);
-  }
-
   if (r < 0) {
-    if (errno != EINTR) {
-      gpr_log(GPR_ERROR, "poll() failed: %s", strerror(errno));
+    gpr_log(GPR_ERROR, "poll() failed: %s", strerror(errno));
+    for (i = 2; i < pfd_count; i++) {
+      grpc_fd_end_poll(exec_ctx, &watchers[i], 0, 0);
     }
   } else if (r == 0) {
-    /* do nothing */
+    for (i = 2; i < pfd_count; i++) {
+      grpc_fd_end_poll(exec_ctx, &watchers[i], 0, 0);
+    }
   } else {
-    if (pfds[0].revents & POLLIN) {
+    if (pfds[0].revents & POLLIN_CHECK) {
       grpc_wakeup_fd_consume_wakeup(&grpc_global_wakeup_fd);
     }
-    if (pfds[1].revents & POLLIN) {
+    if (pfds[1].revents & POLLIN_CHECK) {
       grpc_wakeup_fd_consume_wakeup(&worker->wakeup_fd);
     }
     for (i = 2; i < pfd_count; i++) {
       if (watchers[i].fd == NULL) {
+        grpc_fd_end_poll(exec_ctx, &watchers[i], 0, 0);
         continue;
       }
-      if (pfds[i].revents & (POLLIN | POLLHUP | POLLERR)) {
-        grpc_fd_become_readable(exec_ctx, watchers[i].fd);
-      }
-      if (pfds[i].revents & (POLLOUT | POLLHUP | POLLERR)) {
-        grpc_fd_become_writable(exec_ctx, watchers[i].fd);
-      }
+      grpc_fd_end_poll(exec_ctx, &watchers[i], pfds[i].revents & POLLIN_CHECK,
+                       pfds[i].revents & POLLOUT_CHECK);
     }
   }
 
diff --git a/src/core/iomgr/pollset_posix.c b/src/core/iomgr/pollset_posix.c
index b663780a02af304d5de79f52057a44133991faa5..4d8bc5374f9703dced935c93e270932bc8e776ab 100644
--- a/src/core/iomgr/pollset_posix.c
+++ b/src/core/iomgr/pollset_posix.c
@@ -98,29 +98,70 @@ static void push_front_worker(grpc_pollset *p, grpc_pollset_worker *worker) {
   worker->prev->next = worker->next->prev = worker;
 }
 
-void grpc_pollset_kick(grpc_pollset *p, grpc_pollset_worker *specific_worker) {
+void grpc_pollset_kick_ext(grpc_pollset *p,
+                           grpc_pollset_worker *specific_worker,
+                           gpr_uint32 flags) {
+  GPR_TIMER_BEGIN("grpc_pollset_kick_ext", 0);
+
   /* pollset->mu already held */
   if (specific_worker != NULL) {
     if (specific_worker == GRPC_POLLSET_KICK_BROADCAST) {
+      GPR_TIMER_BEGIN("grpc_pollset_kick_ext.broadcast", 0);
+      GPR_ASSERT((flags & GRPC_POLLSET_REEVALUATE_POLLING_ON_WAKEUP) == 0);
       for (specific_worker = p->root_worker.next;
            specific_worker != &p->root_worker;
            specific_worker = specific_worker->next) {
         grpc_wakeup_fd_wakeup(&specific_worker->wakeup_fd);
       }
       p->kicked_without_pollers = 1;
+      GPR_TIMER_END("grpc_pollset_kick_ext.broadcast", 0);
     } else if (gpr_tls_get(&g_current_thread_worker) !=
                (gpr_intptr)specific_worker) {
+      GPR_TIMER_MARK("different_thread_worker", 0);
+      if ((flags & GRPC_POLLSET_REEVALUATE_POLLING_ON_WAKEUP) != 0) {
+        specific_worker->reevaluate_polling_on_wakeup = 1;
+      }
+      grpc_wakeup_fd_wakeup(&specific_worker->wakeup_fd);
+    } else if ((flags & GRPC_POLLSET_CAN_KICK_SELF) != 0) {
+      GPR_TIMER_MARK("kick_yoself", 0);
+      if ((flags & GRPC_POLLSET_REEVALUATE_POLLING_ON_WAKEUP) != 0) {
+        specific_worker->reevaluate_polling_on_wakeup = 1;
+      }
       grpc_wakeup_fd_wakeup(&specific_worker->wakeup_fd);
     }
   } else if (gpr_tls_get(&g_current_thread_poller) != (gpr_intptr)p) {
+    GPR_ASSERT((flags & GRPC_POLLSET_REEVALUATE_POLLING_ON_WAKEUP) == 0);
+    GPR_TIMER_MARK("kick_anonymous", 0);
     specific_worker = pop_front_worker(p);
     if (specific_worker != NULL) {
-      push_back_worker(p, specific_worker);
-      grpc_wakeup_fd_wakeup(&specific_worker->wakeup_fd);
+      if (gpr_tls_get(&g_current_thread_worker) ==
+          (gpr_intptr)specific_worker) {
+        GPR_TIMER_MARK("kick_anonymous_not_self", 0);
+        push_back_worker(p, specific_worker);
+        specific_worker = pop_front_worker(p);
+        if ((flags & GRPC_POLLSET_CAN_KICK_SELF) == 0 &&
+            gpr_tls_get(&g_current_thread_worker) ==
+                (gpr_intptr)specific_worker) {
+          push_back_worker(p, specific_worker);
+          specific_worker = NULL;
+        }
+      }
+      if (specific_worker != NULL) {
+        GPR_TIMER_MARK("finally_kick", 0);
+        push_back_worker(p, specific_worker);
+        grpc_wakeup_fd_wakeup(&specific_worker->wakeup_fd);
+      }
     } else {
+      GPR_TIMER_MARK("kicked_no_pollers", 0);
       p->kicked_without_pollers = 1;
     }
   }
+
+  GPR_TIMER_END("grpc_pollset_kick_ext", 0);
+}
+
+void grpc_pollset_kick(grpc_pollset *p, grpc_pollset_worker *specific_worker) {
+  grpc_pollset_kick_ext(p, specific_worker, 0);
 }
 
 /* global state management */
@@ -195,52 +236,91 @@ void grpc_pollset_work(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset,
   /* pollset->mu already held */
   int added_worker = 0;
   int locked = 1;
+  int queued_work = 0;
+  int keep_polling = 0;
+  GPR_TIMER_BEGIN("grpc_pollset_work", 0);
   /* this must happen before we (potentially) drop pollset->mu */
   worker->next = worker->prev = NULL;
+  worker->reevaluate_polling_on_wakeup = 0;
   /* TODO(ctiller): pool these */
   grpc_wakeup_fd_init(&worker->wakeup_fd);
+  /* If there's work waiting for the pollset to be idle, and the
+     pollset is idle, then do that work */
   if (!grpc_pollset_has_workers(pollset) &&
       !grpc_closure_list_empty(pollset->idle_jobs)) {
     grpc_exec_ctx_enqueue_list(exec_ctx, &pollset->idle_jobs);
     goto done;
   }
+  /* Check alarms - these are a global resource so we just ping
+     each time through on every pollset.
+     May update deadline to ensure timely wakeups.
+     TODO(ctiller): can this work be localized? */
   if (grpc_alarm_check(exec_ctx, now, &deadline)) {
     gpr_mu_unlock(&pollset->mu);
     locked = 0;
     goto done;
   }
+  /* If we're shutting down then we don't execute any extended work */
   if (pollset->shutting_down) {
     goto done;
   }
+  /* Give do_promote priority so we don't starve it out */
   if (pollset->in_flight_cbs) {
-    /* Give do_promote priority so we don't starve it out */
     gpr_mu_unlock(&pollset->mu);
     locked = 0;
     goto done;
   }
-  if (!pollset->kicked_without_pollers) {
-    push_front_worker(pollset, worker);
-    added_worker = 1;
-    gpr_tls_set(&g_current_thread_poller, (gpr_intptr)pollset);
-    gpr_tls_set(&g_current_thread_worker, (gpr_intptr)worker);
-    pollset->vtable->maybe_work_and_unlock(exec_ctx, pollset, worker, deadline,
-                                           now);
-    locked = 0;
-    gpr_tls_set(&g_current_thread_poller, 0);
-    gpr_tls_set(&g_current_thread_worker, 0);
-  } else {
-    pollset->kicked_without_pollers = 0;
-  }
-done:
-  if (!locked) {
-    grpc_exec_ctx_flush(exec_ctx);
-    gpr_mu_lock(&pollset->mu);
-    locked = 1;
+  /* Start polling, and keep doing so while we're being asked to
+     re-evaluate our pollers (this allows poll() based pollers to
+     ensure they don't miss wakeups) */
+  keep_polling = 1;
+  while (keep_polling) {
+    keep_polling = 0;
+    if (!pollset->kicked_without_pollers) {
+      if (!added_worker) {
+        push_front_worker(pollset, worker);
+        added_worker = 1;
+      }
+      gpr_tls_set(&g_current_thread_poller, (gpr_intptr)pollset);
+      gpr_tls_set(&g_current_thread_worker, (gpr_intptr)worker);
+      GPR_TIMER_BEGIN("maybe_work_and_unlock", 0);
+      pollset->vtable->maybe_work_and_unlock(exec_ctx, pollset, worker,
+                                             deadline, now);
+      GPR_TIMER_END("maybe_work_and_unlock", 0);
+      locked = 0;
+      gpr_tls_set(&g_current_thread_poller, 0);
+      gpr_tls_set(&g_current_thread_worker, 0);
+    } else {
+      pollset->kicked_without_pollers = 0;
+    }
+  /* Finished execution - start cleaning up.
+     Note that we may arrive here from outside the enclosing while() loop.
+     In that case we won't loop though as we haven't added worker to the
+     worker list, which means nobody could ask us to re-evaluate polling). */
+  done:
+    if (!locked) {
+      queued_work |= grpc_exec_ctx_flush(exec_ctx);
+      gpr_mu_lock(&pollset->mu);
+      locked = 1;
+    }
+    /* If we're forced to re-evaluate polling (via grpc_pollset_kick with
+       GRPC_POLLSET_REEVALUATE_POLLING_ON_WAKEUP) then we land here and force
+       a loop */
+    if (worker->reevaluate_polling_on_wakeup) {
+      worker->reevaluate_polling_on_wakeup = 0;
+      pollset->kicked_without_pollers = 0;
+      if (queued_work) {
+        /* If there's queued work on the list, then set the deadline to be
+           immediate so we get back out of the polling loop quickly */
+        deadline = gpr_inf_past(GPR_CLOCK_MONOTONIC);
+      }
+      keep_polling = 1;
+    }
   }
-  grpc_wakeup_fd_destroy(&worker->wakeup_fd);
   if (added_worker) {
     remove_worker(pollset, worker);
   }
+  grpc_wakeup_fd_destroy(&worker->wakeup_fd);
   if (pollset->shutting_down) {
     if (grpc_pollset_has_workers(pollset)) {
       grpc_pollset_kick(pollset, NULL);
@@ -261,6 +341,7 @@ done:
       gpr_mu_lock(&pollset->mu);
     }
   }
+  GPR_TIMER_END("grpc_pollset_work", 0);
 }
 
 void grpc_pollset_shutdown(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset,
@@ -454,6 +535,9 @@ static void basic_pollset_maybe_work_and_unlock(grpc_exec_ctx *exec_ctx,
                                                 grpc_pollset_worker *worker,
                                                 gpr_timespec deadline,
                                                 gpr_timespec now) {
+#define POLLOUT_CHECK (POLLOUT | POLLHUP | POLLERR)
+#define POLLIN_CHECK (POLLIN | POLLHUP | POLLERR)
+
   struct pollfd pfd[3];
   grpc_fd *fd;
   grpc_fd_watcher fd_watcher;
@@ -479,8 +563,8 @@ static void basic_pollset_maybe_work_and_unlock(grpc_exec_ctx *exec_ctx,
     pfd[2].revents = 0;
     GRPC_FD_REF(fd, "basicpoll_begin");
     gpr_mu_unlock(&pollset->mu);
-    pfd[2].events =
-        (short)grpc_fd_begin_poll(fd, pollset, POLLIN, POLLOUT, &fd_watcher);
+    pfd[2].events = (short)grpc_fd_begin_poll(fd, pollset, worker, POLLIN,
+                                              POLLOUT, &fd_watcher);
     if (pfd[2].events != 0) {
       nfds++;
     }
@@ -492,36 +576,33 @@ static void basic_pollset_maybe_work_and_unlock(grpc_exec_ctx *exec_ctx,
      even going into the blocking annotation if possible */
   /* poll fd count (argument 2) is shortened by one if we have no events
      to poll on - such that it only includes the kicker */
+  GPR_TIMER_BEGIN("poll", 0);
   GRPC_SCHEDULING_START_BLOCKING_REGION;
   r = grpc_poll_function(pfd, nfds, timeout);
   GRPC_SCHEDULING_END_BLOCKING_REGION;
-  GRPC_TIMER_MARK(GRPC_PTAG_POLL_FINISHED, r);
-
-  if (fd) {
-    grpc_fd_end_poll(exec_ctx, &fd_watcher, pfd[2].revents & POLLIN,
-                     pfd[2].revents & POLLOUT);
-  }
+  GPR_TIMER_END("poll", 0);
 
   if (r < 0) {
-    if (errno != EINTR) {
-      gpr_log(GPR_ERROR, "poll() failed: %s", strerror(errno));
+    gpr_log(GPR_ERROR, "poll() failed: %s", strerror(errno));
+    if (fd) {
+      grpc_fd_end_poll(exec_ctx, &fd_watcher, 0, 0);
     }
   } else if (r == 0) {
-    /* do nothing */
+    if (fd) {
+      grpc_fd_end_poll(exec_ctx, &fd_watcher, 0, 0);
+    }
   } else {
-    if (pfd[0].revents & POLLIN) {
+    if (pfd[0].revents & POLLIN_CHECK) {
       grpc_wakeup_fd_consume_wakeup(&grpc_global_wakeup_fd);
     }
-    if (pfd[1].revents & POLLIN) {
+    if (pfd[1].revents & POLLIN_CHECK) {
       grpc_wakeup_fd_consume_wakeup(&worker->wakeup_fd);
     }
     if (nfds > 2) {
-      if (pfd[2].revents & (POLLIN | POLLHUP | POLLERR)) {
-        grpc_fd_become_readable(exec_ctx, fd);
-      }
-      if (pfd[2].revents & (POLLOUT | POLLHUP | POLLERR)) {
-        grpc_fd_become_writable(exec_ctx, fd);
-      }
+      grpc_fd_end_poll(exec_ctx, &fd_watcher, pfd[2].revents & POLLIN_CHECK,
+                       pfd[2].revents & POLLOUT_CHECK);
+    } else if (fd) {
+      grpc_fd_end_poll(exec_ctx, &fd_watcher, 0, 0);
     }
   }
 
diff --git a/src/core/iomgr/pollset_posix.h b/src/core/iomgr/pollset_posix.h
index 83c525853905b41dd0f06ace430362fa3dd7be48..34f76db2afa93190047d8e827e5a862d180bf690 100644
--- a/src/core/iomgr/pollset_posix.h
+++ b/src/core/iomgr/pollset_posix.h
@@ -50,6 +50,7 @@ struct grpc_fd;
 
 typedef struct grpc_pollset_worker {
   grpc_wakeup_fd wakeup_fd;
+  int reevaluate_polling_on_wakeup;
   struct grpc_pollset_worker *next;
   struct grpc_pollset_worker *prev;
 } grpc_pollset_worker;
@@ -111,6 +112,16 @@ void grpc_kick_drain(grpc_pollset *p);
 int grpc_poll_deadline_to_millis_timeout(gpr_timespec deadline,
                                          gpr_timespec now);
 
+/* Allow kick to wakeup the currently polling worker */
+#define GRPC_POLLSET_CAN_KICK_SELF 1
+/* Force the wakee to repoll when awoken */
+#define GRPC_POLLSET_REEVALUATE_POLLING_ON_WAKEUP 2
+/* As per grpc_pollset_kick, with an extended set of flags (defined above)
+   -- mostly for fd_posix's use. */
+void grpc_pollset_kick_ext(grpc_pollset *p,
+                           grpc_pollset_worker *specific_worker,
+                           gpr_uint32 flags);
+
 /* turn a pollset into a multipoller: platform specific */
 typedef void (*grpc_platform_become_multipoller_type)(grpc_exec_ctx *exec_ctx,
                                                       grpc_pollset *pollset,
diff --git a/src/core/iomgr/tcp_client_posix.c b/src/core/iomgr/tcp_client_posix.c
index aca2691c416e64f29d9ea81db9e223fc82ace368..fe20039264121585feaeb058bba68535597f7429 100644
--- a/src/core/iomgr/tcp_client_posix.c
+++ b/src/core/iomgr/tcp_client_posix.c
@@ -191,7 +191,7 @@ static void on_writable(grpc_exec_ctx *exec_ctx, void *acp, int success) {
     goto finish;
   }
 
-  abort();
+  GPR_UNREACHABLE_CODE(return );
 
 finish:
   if (fd != NULL) {
diff --git a/src/core/iomgr/tcp_posix.c b/src/core/iomgr/tcp_posix.c
index 4a57037a720e3a00f3049a77419c901fa6974041..915553d50984b68bb289bbabc330898422095810 100644
--- a/src/core/iomgr/tcp_posix.c
+++ b/src/core/iomgr/tcp_posix.c
@@ -180,7 +180,7 @@ static void tcp_continue_read(grpc_exec_ctx *exec_ctx, grpc_tcp *tcp) {
   GPR_ASSERT(!tcp->finished_edge);
   GPR_ASSERT(tcp->iov_size <= MAX_READ_IOVEC);
   GPR_ASSERT(tcp->incoming_buffer->count <= MAX_READ_IOVEC);
-  GRPC_TIMER_BEGIN(GRPC_PTAG_HANDLE_READ, 0);
+  GPR_TIMER_BEGIN("tcp_continue_read", 0);
 
   while (tcp->incoming_buffer->count < (size_t)tcp->iov_size) {
     gpr_slice_buffer_add_indexed(tcp->incoming_buffer,
@@ -199,11 +199,11 @@ static void tcp_continue_read(grpc_exec_ctx *exec_ctx, grpc_tcp *tcp) {
   msg.msg_controllen = 0;
   msg.msg_flags = 0;
 
-  GRPC_TIMER_BEGIN(GRPC_PTAG_RECVMSG, 0);
+  GPR_TIMER_BEGIN("recvmsg", 1);
   do {
     read_bytes = recvmsg(tcp->fd, &msg, 0);
   } while (read_bytes < 0 && errno == EINTR);
-  GRPC_TIMER_END(GRPC_PTAG_RECVMSG, 0);
+  GPR_TIMER_END("recvmsg", 0);
 
   if (read_bytes < 0) {
     /* NB: After calling call_read_cb a parallel call of the read handler may
@@ -240,7 +240,7 @@ static void tcp_continue_read(grpc_exec_ctx *exec_ctx, grpc_tcp *tcp) {
     TCP_UNREF(exec_ctx, tcp, "read");
   }
 
-  GRPC_TIMER_END(GRPC_PTAG_HANDLE_READ, 0);
+  GPR_TIMER_END("tcp_continue_read", 0);
 }
 
 static void tcp_handle_read(grpc_exec_ctx *exec_ctx, void *arg /* grpc_tcp */,
@@ -316,12 +316,12 @@ static flush_result tcp_flush(grpc_tcp *tcp) {
     msg.msg_controllen = 0;
     msg.msg_flags = 0;
 
-    GRPC_TIMER_BEGIN(GRPC_PTAG_SENDMSG, 0);
+    GPR_TIMER_BEGIN("sendmsg", 1);
     do {
       /* TODO(klempner): Cork if this is a partial write */
       sent_length = sendmsg(tcp->fd, &msg, SENDMSG_FLAGS);
     } while (sent_length < 0 && errno == EINTR);
-    GRPC_TIMER_END(GRPC_PTAG_SENDMSG, 0);
+    GPR_TIMER_END("sendmsg", 0);
 
     if (sent_length < 0) {
       if (errno == EAGAIN) {
@@ -370,17 +370,17 @@ static void tcp_handle_write(grpc_exec_ctx *exec_ctx, void *arg /* grpc_tcp */,
     return;
   }
 
-  GRPC_TIMER_BEGIN(GRPC_PTAG_TCP_CB_WRITE, 0);
   status = tcp_flush(tcp);
   if (status == FLUSH_PENDING) {
     grpc_fd_notify_on_write(exec_ctx, tcp->em_fd, &tcp->write_closure);
   } else {
     cb = tcp->write_cb;
     tcp->write_cb = NULL;
+    GPR_TIMER_BEGIN("tcp_handle_write.cb", 0);
     cb->cb(exec_ctx, cb->cb_arg, status == FLUSH_DONE);
+    GPR_TIMER_END("tcp_handle_write.cb", 0);
     TCP_UNREF(exec_ctx, tcp, "write");
   }
-  GRPC_TIMER_END(GRPC_PTAG_TCP_CB_WRITE, 0);
 }
 
 static void tcp_write(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
@@ -399,11 +399,11 @@ static void tcp_write(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
     }
   }
 
-  GRPC_TIMER_BEGIN(GRPC_PTAG_TCP_WRITE, 0);
+  GPR_TIMER_BEGIN("tcp_write", 0);
   GPR_ASSERT(tcp->write_cb == NULL);
 
   if (buf->length == 0) {
-    GRPC_TIMER_END(GRPC_PTAG_TCP_WRITE, 0);
+    GPR_TIMER_END("tcp_write", 0);
     grpc_exec_ctx_enqueue(exec_ctx, cb, 1);
     return;
   }
@@ -420,7 +420,7 @@ static void tcp_write(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
     grpc_exec_ctx_enqueue(exec_ctx, cb, status == FLUSH_DONE);
   }
 
-  GRPC_TIMER_END(GRPC_PTAG_TCP_WRITE, 0);
+  GPR_TIMER_END("tcp_write", 0);
 }
 
 static void tcp_add_to_pollset(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
diff --git a/src/core/iomgr/tcp_server_posix.c b/src/core/iomgr/tcp_server_posix.c
index 13bd67576f55d9adf90d36c64c69efcaed7f3c41..99c76dcbe9aeddfd7d303e994fba5526e9057bea 100644
--- a/src/core/iomgr/tcp_server_posix.c
+++ b/src/core/iomgr/tcp_server_posix.c
@@ -352,7 +352,7 @@ static void on_read(grpc_exec_ctx *exec_ctx, void *arg, int success) {
     gpr_free(addr_str);
   }
 
-  abort();
+  GPR_UNREACHABLE_CODE(return );
 
 error:
   gpr_mu_lock(&sp->server->mu);
diff --git a/src/core/iomgr/tcp_server_windows.c b/src/core/iomgr/tcp_server_windows.c
index db3319b3c6c3ab79dff03d1e4e3f9af8bb29d283..3fea8b5b35059cebda7c044de874415662f2844f 100644
--- a/src/core/iomgr/tcp_server_windows.c
+++ b/src/core/iomgr/tcp_server_windows.c
@@ -336,6 +336,8 @@ static void on_accept(grpc_exec_ctx *exec_ctx, void *arg, int from_iocp) {
                            peer_name_string);
       gpr_free(fd_name);
       gpr_free(peer_name_string);
+    } else {
+      closesocket(sock);
     }
   }
 
diff --git a/src/core/iomgr/udp_server.c b/src/core/iomgr/udp_server.c
index 1304f2067ea53133d6aaebb4d422a96ff83e82e4..9903e970e6643d1286be825c71d77d0cc50a2ee8 100644
--- a/src/core/iomgr/udp_server.c
+++ b/src/core/iomgr/udp_server.c
@@ -278,7 +278,7 @@ static void on_read(grpc_exec_ctx *exec_ctx, void *arg, int success) {
 
   /* Tell the registered callback that data is available to read. */
   GPR_ASSERT(sp->read_cb);
-  sp->read_cb(sp->emfd, sp->server->grpc_server);
+  sp->read_cb(exec_ctx, sp->emfd, sp->server->grpc_server);
 
   /* Re-arm the notification event so we get another chance to read. */
   grpc_fd_notify_on_read(exec_ctx, sp->emfd, &sp->read_closure);
diff --git a/src/core/iomgr/udp_server.h b/src/core/iomgr/udp_server.h
index dbbe09710932d615875ee77f53dca2b357222291..de5736c426221ff5a7e909f29fb857b3cc2525a4 100644
--- a/src/core/iomgr/udp_server.h
+++ b/src/core/iomgr/udp_server.h
@@ -43,7 +43,8 @@ typedef struct grpc_server grpc_server;
 typedef struct grpc_udp_server grpc_udp_server;
 
 /* Called when data is available to read from the socket. */
-typedef void (*grpc_udp_server_read_cb)(grpc_fd *emfd, grpc_server *server);
+typedef void (*grpc_udp_server_read_cb)(grpc_exec_ctx *exec_ctx, grpc_fd *emfd,
+                                        grpc_server *server);
 
 /* Create a server, initially not bound to any ports */
 grpc_udp_server *grpc_udp_server_create(void);
diff --git a/src/core/iomgr/wakeup_fd_eventfd.c b/src/core/iomgr/wakeup_fd_eventfd.c
index 48eb1afb3d8b4e15eb38afd2a723df0d446860d2..f67379e4fcfaf709bf9964e4eebd58b7e2481c13 100644
--- a/src/core/iomgr/wakeup_fd_eventfd.c
+++ b/src/core/iomgr/wakeup_fd_eventfd.c
@@ -39,9 +39,11 @@
 #include <sys/eventfd.h>
 #include <unistd.h>
 
-#include "src/core/iomgr/wakeup_fd_posix.h"
 #include <grpc/support/log.h>
 
+#include "src/core/iomgr/wakeup_fd_posix.h"
+#include "src/core/profiling/timers.h"
+
 static void eventfd_create(grpc_wakeup_fd* fd_info) {
   int efd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
   /* TODO(klempner): Handle failure more gracefully */
@@ -60,9 +62,11 @@ static void eventfd_consume(grpc_wakeup_fd* fd_info) {
 
 static void eventfd_wakeup(grpc_wakeup_fd* fd_info) {
   int err;
+  GPR_TIMER_BEGIN("eventfd_wakeup", 0);
   do {
     err = eventfd_write(fd_info->read_fd, 1);
   } while (err < 0 && errno == EINTR);
+  GPR_TIMER_END("eventfd_wakeup", 0);
 }
 
 static void eventfd_destroy(grpc_wakeup_fd* fd_info) {
diff --git a/src/core/profiling/basic_timers.c b/src/core/profiling/basic_timers.c
index 2f6c88daacfbdad1b09d65c2e41f6e52917fa066..b49cdd07b3e2f29bc5acf809b3c60a77e582e15e 100644
--- a/src/core/profiling/basic_timers.c
+++ b/src/core/profiling/basic_timers.c
@@ -44,98 +44,91 @@
 #include <grpc/support/thd.h>
 #include <stdio.h>
 
-typedef enum {
-  BEGIN = '{',
-  END = '}',
-  MARK = '.',
-  IMPORTANT = '!'
-} marker_type;
-
-typedef struct grpc_timer_entry {
+typedef enum { BEGIN = '{', END = '}', MARK = '.' } marker_type;
+
+typedef struct gpr_timer_entry {
   gpr_timespec tm;
-  int tag;
   const char *tagstr;
-  marker_type type;
-  void *id;
   const char *file;
   int line;
-} grpc_timer_entry;
+  char type;
+  gpr_uint8 important;
+} gpr_timer_entry;
+
+#define MAX_COUNT (1024 * 1024 / sizeof(gpr_timer_entry))
 
-#define MAX_COUNT (1024 * 1024 / sizeof(grpc_timer_entry))
+static __thread gpr_timer_entry g_log[MAX_COUNT];
+static __thread int g_count;
+static gpr_once g_once_init = GPR_ONCE_INIT;
+static FILE *output_file;
 
-static __thread grpc_timer_entry log[MAX_COUNT];
-static __thread int count;
+static void close_output() { fclose(output_file); }
+
+static void init_output() {
+  output_file = fopen("latency_trace.txt", "w");
+  GPR_ASSERT(output_file);
+  atexit(close_output);
+}
 
 static void log_report() {
   int i;
-  for (i = 0; i < count; i++) {
-    grpc_timer_entry *entry = &(log[i]);
-    printf("GRPC_LAT_PROF %ld.%09d  %p %c %d(%s) %p %s %d\n", entry->tm.tv_sec,
-           entry->tm.tv_nsec, (void *)(gpr_intptr)gpr_thd_currentid(),
-           entry->type, entry->tag, entry->tagstr, entry->id, entry->file,
-           entry->line);
+  gpr_once_init(&g_once_init, init_output);
+  for (i = 0; i < g_count; i++) {
+    gpr_timer_entry *entry = &(g_log[i]);
+    fprintf(output_file,
+            "{\"t\": %ld.%09d, \"thd\": \"%p\", \"type\": \"%c\", \"tag\": "
+            "\"%s\", \"file\": \"%s\", \"line\": %d, \"imp\": %d}\n",
+            entry->tm.tv_sec, entry->tm.tv_nsec,
+            (void *)(gpr_intptr)gpr_thd_currentid(), entry->type, entry->tagstr,
+            entry->file, entry->line, entry->important);
   }
 
   /* Now clear out the log */
-  count = 0;
+  g_count = 0;
 }
 
-static void grpc_timers_log_add(int tag, const char *tagstr, marker_type type,
-                                void *id, const char *file, int line) {
-  grpc_timer_entry *entry;
+static void gpr_timers_log_add(const char *tagstr, marker_type type,
+                               int important, const char *file, int line) {
+  gpr_timer_entry *entry;
 
   /* TODO (vpai) : Improve concurrency */
-  if (count == MAX_COUNT) {
+  if (g_count == MAX_COUNT) {
     log_report();
   }
 
-  entry = &log[count++];
+  entry = &g_log[g_count++];
 
   entry->tm = gpr_now(GPR_CLOCK_PRECISE);
-  entry->tag = tag;
   entry->tagstr = tagstr;
   entry->type = type;
-  entry->id = id;
   entry->file = file;
   entry->line = line;
+  entry->important = important != 0;
 }
 
 /* Latency profiler API implementation. */
-void grpc_timer_add_mark(int tag, const char *tagstr, void *id,
-                         const char *file, int line) {
-  if (tag < GRPC_PTAG_IGNORE_THRESHOLD) {
-    grpc_timers_log_add(tag, tagstr, MARK, id, file, line);
-  }
+void gpr_timer_add_mark(const char *tagstr, int important, const char *file,
+                        int line) {
+  gpr_timers_log_add(tagstr, MARK, important, file, line);
 }
 
-void grpc_timer_add_important_mark(int tag, const char *tagstr, void *id,
-                                   const char *file, int line) {
-  if (tag < GRPC_PTAG_IGNORE_THRESHOLD) {
-    grpc_timers_log_add(tag, tagstr, IMPORTANT, id, file, line);
-  }
+void gpr_timer_begin(const char *tagstr, int important, const char *file,
+                     int line) {
+  gpr_timers_log_add(tagstr, BEGIN, important, file, line);
 }
 
-void grpc_timer_begin(int tag, const char *tagstr, void *id, const char *file,
-                      int line) {
-  if (tag < GRPC_PTAG_IGNORE_THRESHOLD) {
-    grpc_timers_log_add(tag, tagstr, BEGIN, id, file, line);
-  }
-}
-
-void grpc_timer_end(int tag, const char *tagstr, void *id, const char *file,
-                    int line) {
-  if (tag < GRPC_PTAG_IGNORE_THRESHOLD) {
-    grpc_timers_log_add(tag, tagstr, END, id, file, line);
-  }
+void gpr_timer_end(const char *tagstr, int important, const char *file,
+                   int line) {
+  gpr_timers_log_add(tagstr, END, important, file, line);
 }
 
 /* Basic profiler specific API functions. */
-void grpc_timers_global_init(void) {}
+void gpr_timers_global_init(void) {}
 
-void grpc_timers_global_destroy(void) {}
+void gpr_timers_global_destroy(void) {}
 
 #else  /* !GRPC_BASIC_PROFILER */
-void grpc_timers_global_init(void) {}
+void gpr_timers_global_init(void) {}
 
-void grpc_timers_global_destroy(void) {}
+void gpr_timers_global_destroy(void) {}
 #endif /* GRPC_BASIC_PROFILER */
diff --git a/src/core/profiling/stap_timers.c b/src/core/profiling/stap_timers.c
index 6868a674a986c8c1075f9d388070b9c0d1741225..efcd1af4a1c8a6599954ecf441b8dfa3e3ea8cd2 100644
--- a/src/core/profiling/stap_timers.c
+++ b/src/core/profiling/stap_timers.c
@@ -42,23 +42,23 @@
 #include "src/core/profiling/stap_probes.h"
 
 /* Latency profiler API implementation. */
-void grpc_timer_add_mark(int tag, const char *tagstr, void *id,
-                         const char *file, int line) {
+void gpr_timer_add_mark(int tag, const char *tagstr, void *id, const char *file,
+                        int line) {
   _STAP_ADD_MARK(tag);
 }
 
-void grpc_timer_add_important_mark(int tag, const char *tagstr, void *id,
-                                   const char *file, int line) {
+void gpr_timer_add_important_mark(int tag, const char *tagstr, void *id,
+                                  const char *file, int line) {
   _STAP_ADD_IMPORTANT_MARK(tag);
 }
 
-void grpc_timer_begin(int tag, const char *tagstr, void *id, const char *file,
-                      int line) {
+void gpr_timer_begin(int tag, const char *tagstr, void *id, const char *file,
+                     int line) {
   _STAP_TIMING_NS_BEGIN(tag);
 }
 
-void grpc_timer_end(int tag, const char *tagstr, void *id, const char *file,
-                    int line) {
+void gpr_timer_end(int tag, const char *tagstr, void *id, const char *file,
+                   int line) {
   _STAP_TIMING_NS_END(tag);
 }
 
diff --git a/src/core/profiling/timers.h b/src/core/profiling/timers.h
index a70520408c33fe93b2399b5bba569d43ef1d02b1..0d112e7248551a2aa2e88b6b1f74ea5deb23c399 100644
--- a/src/core/profiling/timers.h
+++ b/src/core/profiling/timers.h
@@ -38,65 +38,28 @@
 extern "C" {
 #endif
 
-void grpc_timers_global_init(void);
-void grpc_timers_global_destroy(void);
-
-void grpc_timer_add_mark(int tag, const char *tagstr, void *id,
-                         const char *file, int line);
-void grpc_timer_add_important_mark(int tag, const char *tagstr, void *id,
-                                   const char *file, int line);
-void grpc_timer_begin(int tag, const char *tagstr, void *id, const char *file,
-                      int line);
-void grpc_timer_end(int tag, const char *tagstr, void *id, const char *file,
-                    int line);
-
-enum grpc_profiling_tags {
-  /* Any GRPC_PTAG_* >= than the threshold won't generate any profiling mark. */
-  GRPC_PTAG_IGNORE_THRESHOLD = 1000000,
-
-  /* Re. Protos. */
-  GRPC_PTAG_PROTO_SERIALIZE = 100 + GRPC_PTAG_IGNORE_THRESHOLD,
-  GRPC_PTAG_PROTO_DESERIALIZE = 101 + GRPC_PTAG_IGNORE_THRESHOLD,
-
-  /* Re. sockets. */
-  GRPC_PTAG_HANDLE_READ = 200 + GRPC_PTAG_IGNORE_THRESHOLD,
-  GRPC_PTAG_SENDMSG = 201 + GRPC_PTAG_IGNORE_THRESHOLD,
-  GRPC_PTAG_RECVMSG = 202 + GRPC_PTAG_IGNORE_THRESHOLD,
-  GRPC_PTAG_POLL_FINISHED = 203 + GRPC_PTAG_IGNORE_THRESHOLD,
-  GRPC_PTAG_TCP_CB_WRITE = 204 + GRPC_PTAG_IGNORE_THRESHOLD,
-  GRPC_PTAG_TCP_WRITE = 205 + GRPC_PTAG_IGNORE_THRESHOLD,
-  GRPC_PTAG_CALL_ON_DONE_RECV = 206 + GRPC_PTAG_IGNORE_THRESHOLD,
-
-  /* C++ */
-  GRPC_PTAG_CPP_CALL_CREATED = 300 + GRPC_PTAG_IGNORE_THRESHOLD,
-  GRPC_PTAG_CPP_PERFORM_OPS = 301 + GRPC_PTAG_IGNORE_THRESHOLD,
-
-  /* Transports */
-  GRPC_PTAG_HTTP2_UNLOCK = 401 + GRPC_PTAG_IGNORE_THRESHOLD,
-  GRPC_PTAG_HTTP2_UNLOCK_CLEANUP = 402 + GRPC_PTAG_IGNORE_THRESHOLD,
-
-  /* > 1024 Unassigned reserved. For any miscellaneous use.
-   * Use addition to generate tags from this base or take advantage of the 10
-   * zero'd bits for OR-ing. */
-  GRPC_PTAG_OTHER_BASE = 1024
-};
+void gpr_timers_global_init(void);
+void gpr_timers_global_destroy(void);
+
+void gpr_timer_add_mark(const char *tagstr, int important, const char *file,
+                        int line);
+void gpr_timer_begin(const char *tagstr, int important, const char *file,
+                     int line);
+void gpr_timer_end(const char *tagstr, int important, const char *file,
+                   int line);
 
 #if !(defined(GRPC_STAP_PROFILER) + defined(GRPC_BASIC_PROFILER))
 /* No profiling. No-op all the things. */
-#define GRPC_TIMER_MARK(tag, id) \
-  do {                           \
-  } while (0)
-
-#define GRPC_TIMER_IMPORTANT_MARK(tag, id) \
-  do {                                     \
+#define GPR_TIMER_MARK(tag, important) \
+  do {                                 \
   } while (0)
 
-#define GRPC_TIMER_BEGIN(tag, id) \
-  do {                            \
+#define GPR_TIMER_BEGIN(tag, important) \
+  do {                                  \
   } while (0)
 
-#define GRPC_TIMER_END(tag, id) \
-  do {                          \
+#define GPR_TIMER_END(tag, important) \
+  do {                                \
   } while (0)
 
 #else /* at least one profiler requested... */
@@ -106,28 +69,14 @@ enum grpc_profiling_tags {
 #endif
 
 /* Generic profiling interface. */
-#define GRPC_TIMER_MARK(tag, id)                                         \
-  if (tag < GRPC_PTAG_IGNORE_THRESHOLD) {                                \
-    grpc_timer_add_mark(tag, #tag, ((void *)(gpr_intptr)(id)), __FILE__, \
-                        __LINE__);                                       \
-  }
-
-#define GRPC_TIMER_IMPORTANT_MARK(tag, id)                               \
-  if (tag < GRPC_PTAG_IGNORE_THRESHOLD) {                                \
-    grpc_timer_add_important_mark(tag, #tag, ((void *)(gpr_intptr)(id)), \
-                                  __FILE__, __LINE__);                   \
-  }
+#define GPR_TIMER_MARK(tag, important) \
+  gpr_timer_add_mark(tag, important, __FILE__, __LINE__);
 
-#define GRPC_TIMER_BEGIN(tag, id)                                     \
-  if (tag < GRPC_PTAG_IGNORE_THRESHOLD) {                             \
-    grpc_timer_begin(tag, #tag, ((void *)(gpr_intptr)(id)), __FILE__, \
-                     __LINE__);                                       \
-  }
+#define GPR_TIMER_BEGIN(tag, important) \
+  gpr_timer_begin(tag, important, __FILE__, __LINE__);
 
-#define GRPC_TIMER_END(tag, id)                                                \
-  if (tag < GRPC_PTAG_IGNORE_THRESHOLD) {                                      \
-    grpc_timer_end(tag, #tag, ((void *)(gpr_intptr)(id)), __FILE__, __LINE__); \
-  }
+#define GPR_TIMER_END(tag, important) \
+  gpr_timer_end(tag, important, __FILE__, __LINE__);
 
 #ifdef GRPC_STAP_PROFILER
 /* Empty placeholder for now. */
@@ -141,6 +90,28 @@ enum grpc_profiling_tags {
 
 #ifdef __cplusplus
 }
+
+#if (defined(GRPC_STAP_PROFILER) + defined(GRPC_BASIC_PROFILER))
+namespace grpc {
+class ProfileScope {
+ public:
+  ProfileScope(const char *desc, bool important) : desc_(desc) {
+    GPR_TIMER_BEGIN(desc_, important ? 1 : 0);
+  }
+  ~ProfileScope() { GPR_TIMER_END(desc_, 0); }
+
+ private:
+  const char *const desc_;
+};
+}
+
+#define GPR_TIMER_SCOPE(tag, important) \
+  ::grpc::ProfileScope _profile_scope_##__LINE__((tag), (important))
+#else
+#define GPR_TIMER_SCOPE(tag, important) \
+  do {                                  \
+  } while (false)
+#endif
 #endif
 
 #endif /* GRPC_CORE_PROFILING_TIMERS_H */
diff --git a/src/core/security/credentials.c b/src/core/security/credentials.c
index 398db20e8cf0ad817d30a1f5ffda0fed2076bd9b..5e155d83b9cf9ec6c7d7caf8ba6f02297a649231 100644
--- a/src/core/security/credentials.c
+++ b/src/core/security/credentials.c
@@ -181,6 +181,48 @@ void grpc_server_credentials_set_auth_metadata_processor(
   creds->processor = processor;
 }
 
+static void server_credentials_pointer_arg_destroy(void *p) {
+  grpc_server_credentials_unref(p);
+}
+
+static void *server_credentials_pointer_arg_copy(void *p) {
+  return grpc_server_credentials_ref(p);
+}
+
+grpc_arg grpc_server_credentials_to_arg(grpc_server_credentials *p) {
+  grpc_arg arg;
+  memset(&arg, 0, sizeof(grpc_arg));
+  arg.type = GRPC_ARG_POINTER;
+  arg.key = GRPC_SERVER_CREDENTIALS_ARG;
+  arg.value.pointer.p = p;
+  arg.value.pointer.copy = server_credentials_pointer_arg_copy;
+  arg.value.pointer.destroy = server_credentials_pointer_arg_destroy;
+  return arg;
+}
+
+grpc_server_credentials *grpc_server_credentials_from_arg(
+    const grpc_arg *arg) {
+  if (strcmp(arg->key, GRPC_SERVER_CREDENTIALS_ARG) != 0) return NULL;
+  if (arg->type != GRPC_ARG_POINTER) {
+    gpr_log(GPR_ERROR, "Invalid type %d for arg %s", arg->type,
+            GRPC_SERVER_CREDENTIALS_ARG);
+    return NULL;
+  }
+  return arg->value.pointer.p;
+}
+
+grpc_server_credentials *grpc_find_server_credentials_in_args(
+    const grpc_channel_args *args) {
+  size_t i;
+  if (args == NULL) return NULL;
+  for (i = 0; i < args->num_args; i++) {
+    grpc_server_credentials *p =
+        grpc_server_credentials_from_arg(&args->args[i]);
+    if (p != NULL) return p;
+  }
+  return NULL;
+}
+
 /* -- Ssl credentials. -- */
 
 static void ssl_destruct(grpc_credentials *creds) {
diff --git a/src/core/security/credentials.h b/src/core/security/credentials.h
index b213e052d34c02d8c48ebecc968b57e05cd11a04..01203b08f1faf6dcc84a6553d1d4a87b0cec09c7 100644
--- a/src/core/security/credentials.h
+++ b/src/core/security/credentials.h
@@ -215,7 +215,6 @@ typedef struct {
       grpc_server_credentials *c, grpc_security_connector **sc);
 } grpc_server_credentials_vtable;
 
-/* TODO(jboeuf): Add a refcount. */
 struct grpc_server_credentials {
   const grpc_server_credentials_vtable *vtable;
   const char *type;
@@ -231,6 +230,13 @@ grpc_server_credentials *grpc_server_credentials_ref(
 
 void grpc_server_credentials_unref(grpc_server_credentials *creds);
 
+#define GRPC_SERVER_CREDENTIALS_ARG "grpc.server_credentials"
+
+grpc_arg grpc_server_credentials_to_arg(grpc_server_credentials *c);
+grpc_server_credentials *grpc_server_credentials_from_arg(const grpc_arg *arg);
+grpc_server_credentials *grpc_find_server_credentials_in_args(
+    const grpc_channel_args *args);
+
 /* -- Ssl credentials. -- */
 
 typedef struct {
diff --git a/src/core/security/security_context.c b/src/core/security/security_context.c
index fb905e0b228fa06a5b40ebe0599eacf307225b8c..f544c1d943d313d8b9ff21eaa12f85ee1038e0bd 100644
--- a/src/core/security/security_context.c
+++ b/src/core/security/security_context.c
@@ -305,33 +305,43 @@ void grpc_auth_property_reset(grpc_auth_property *property) {
   memset(property, 0, sizeof(grpc_auth_property));
 }
 
-grpc_arg grpc_auth_metadata_processor_to_arg(grpc_auth_metadata_processor *p) {
+static void auth_context_pointer_arg_destroy(void *p) {
+  GRPC_AUTH_CONTEXT_UNREF(p, "auth_context_pointer_arg");
+}
+
+static void *auth_context_pointer_arg_copy(void *p) {
+  return GRPC_AUTH_CONTEXT_REF(p, "auth_context_pointer_arg");
+}
+
+grpc_arg grpc_auth_context_to_arg(grpc_auth_context *p) {
   grpc_arg arg;
   memset(&arg, 0, sizeof(grpc_arg));
   arg.type = GRPC_ARG_POINTER;
-  arg.key = GRPC_AUTH_METADATA_PROCESSOR_ARG;
+  arg.key = GRPC_AUTH_CONTEXT_ARG;
   arg.value.pointer.p = p;
+  arg.value.pointer.copy = auth_context_pointer_arg_copy;
+  arg.value.pointer.destroy = auth_context_pointer_arg_destroy;
   return arg;
 }
 
-grpc_auth_metadata_processor *grpc_auth_metadata_processor_from_arg(
+grpc_auth_context *grpc_auth_context_from_arg(
     const grpc_arg *arg) {
-  if (strcmp(arg->key, GRPC_AUTH_METADATA_PROCESSOR_ARG) != 0) return NULL;
+  if (strcmp(arg->key, GRPC_AUTH_CONTEXT_ARG) != 0) return NULL;
   if (arg->type != GRPC_ARG_POINTER) {
     gpr_log(GPR_ERROR, "Invalid type %d for arg %s", arg->type,
-            GRPC_AUTH_METADATA_PROCESSOR_ARG);
+            GRPC_AUTH_CONTEXT_ARG);
     return NULL;
   }
   return arg->value.pointer.p;
 }
 
-grpc_auth_metadata_processor *grpc_find_auth_metadata_processor_in_args(
+grpc_auth_context *grpc_find_auth_context_in_args(
     const grpc_channel_args *args) {
   size_t i;
   if (args == NULL) return NULL;
   for (i = 0; i < args->num_args; i++) {
-    grpc_auth_metadata_processor *p =
-        grpc_auth_metadata_processor_from_arg(&args->args[i]);
+    grpc_auth_context *p =
+        grpc_auth_context_from_arg(&args->args[i]);
     if (p != NULL) return p;
   }
   return NULL;
diff --git a/src/core/security/security_context.h b/src/core/security/security_context.h
index a9a03064108a162c08efd4de9f33c0f0f654724e..2bbdc4be973e3f66237663b83ea59e6a10536fa0 100644
--- a/src/core/security/security_context.h
+++ b/src/core/security/security_context.h
@@ -103,13 +103,12 @@ typedef struct {
 grpc_server_security_context *grpc_server_security_context_create(void);
 void grpc_server_security_context_destroy(void *ctx);
 
-/* --- Auth metadata processing. --- */
-#define GRPC_AUTH_METADATA_PROCESSOR_ARG "grpc.auth_metadata_processor"
+/* --- Channel args for auth context --- */
+#define GRPC_AUTH_CONTEXT_ARG "grpc.auth_context"
 
-grpc_arg grpc_auth_metadata_processor_to_arg(grpc_auth_metadata_processor *p);
-grpc_auth_metadata_processor *grpc_auth_metadata_processor_from_arg(
-    const grpc_arg *arg);
-grpc_auth_metadata_processor *grpc_find_auth_metadata_processor_in_args(
+grpc_arg grpc_auth_context_to_arg(grpc_auth_context *c);
+grpc_auth_context *grpc_auth_context_from_arg(const grpc_arg *arg);
+grpc_auth_context *grpc_find_auth_context_in_args(
     const grpc_channel_args *args);
 
 #endif /* GRPC_INTERNAL_CORE_SECURITY_SECURITY_CONTEXT_H */
diff --git a/src/core/security/server_auth_filter.c b/src/core/security/server_auth_filter.c
index 30ca9f57a25e2ae770afeba65c4070badf3ea436..2e18369fe8c0deb2c27c0d01236f279a3a2be034 100644
--- a/src/core/security/server_auth_filter.c
+++ b/src/core/security/server_auth_filter.c
@@ -34,7 +34,7 @@
 #include <string.h>
 
 #include "src/core/security/auth_filters.h"
-#include "src/core/security/security_connector.h"
+#include "src/core/security/credentials.h"
 #include "src/core/security/security_context.h"
 
 #include <grpc/support/alloc.h>
@@ -58,8 +58,8 @@ typedef struct call_data {
 } call_data;
 
 typedef struct channel_data {
-  grpc_security_connector *security_connector;
-  grpc_auth_metadata_processor processor;
+  grpc_auth_context *auth_context;
+  grpc_server_credentials *creds;
   grpc_mdctx *mdctx;
 } channel_data;
 
@@ -160,12 +160,12 @@ static void auth_on_recv(grpc_exec_ctx *exec_ctx, void *user_data,
       grpc_stream_op *op = &ops[i];
       if (op->type != GRPC_OP_METADATA || calld->got_client_metadata) continue;
       calld->got_client_metadata = 1;
-      if (chand->processor.process == NULL) continue;
+      if (chand->creds->processor.process == NULL) continue;
       calld->md_op = op;
       calld->md = metadata_batch_to_md_array(&op->data.metadata);
-      chand->processor.process(chand->processor.state, calld->auth_context,
-                               calld->md.metadata, calld->md.count,
-                               on_md_processing_done, elem);
+      chand->creds->processor.process(
+          chand->creds->processor.state, calld->auth_context,
+          calld->md.metadata, calld->md.count, on_md_processing_done, elem);
       return;
     }
   }
@@ -221,7 +221,7 @@ static void init_call_elem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
   }
   server_ctx = grpc_server_security_context_create();
   server_ctx->auth_context =
-      grpc_auth_context_create(chand->security_connector->auth_context);
+      grpc_auth_context_create(chand->auth_context);
   server_ctx->auth_context->pollset = initial_op->bind_pollset;
   initial_op->context[GRPC_CONTEXT_SECURITY].value = server_ctx;
   initial_op->context[GRPC_CONTEXT_SECURITY].destroy =
@@ -241,9 +241,8 @@ static void init_channel_elem(grpc_exec_ctx *exec_ctx,
                               grpc_channel_element *elem, grpc_channel *master,
                               const grpc_channel_args *args, grpc_mdctx *mdctx,
                               int is_first, int is_last) {
-  grpc_security_connector *sc = grpc_find_security_connector_in_args(args);
-  grpc_auth_metadata_processor *processor =
-      grpc_find_auth_metadata_processor_in_args(args);
+  grpc_auth_context *auth_context = grpc_find_auth_context_in_args(args);
+  grpc_server_credentials *creds = grpc_find_server_credentials_in_args(args);
   /* grab pointers to our data from the channel element */
   channel_data *chand = elem->channel_data;
 
@@ -252,15 +251,14 @@ static void init_channel_elem(grpc_exec_ctx *exec_ctx,
      path */
   GPR_ASSERT(!is_first);
   GPR_ASSERT(!is_last);
-  GPR_ASSERT(sc != NULL);
-  GPR_ASSERT(processor != NULL);
+  GPR_ASSERT(auth_context != NULL);
+  GPR_ASSERT(creds != NULL);
 
   /* initialize members */
-  GPR_ASSERT(!sc->is_client_side);
-  chand->security_connector =
-      GRPC_SECURITY_CONNECTOR_REF(sc, "server_auth_filter");
+  chand->auth_context =
+      GRPC_AUTH_CONTEXT_REF(auth_context, "server_auth_filter");
+  chand->creds = grpc_server_credentials_ref(creds);
   chand->mdctx = mdctx;
-  chand->processor = *processor;
 }
 
 /* Destructor for channel data */
@@ -268,8 +266,8 @@ static void destroy_channel_elem(grpc_exec_ctx *exec_ctx,
                                  grpc_channel_element *elem) {
   /* grab pointers to our data from the channel element */
   channel_data *chand = elem->channel_data;
-  GRPC_SECURITY_CONNECTOR_UNREF(chand->security_connector,
-                                "server_auth_filter");
+  GRPC_AUTH_CONTEXT_UNREF(chand->auth_context, "server_auth_filter");
+  grpc_server_credentials_unref(chand->creds);
 }
 
 const grpc_channel_filter grpc_server_auth_filter = {
diff --git a/src/core/security/server_secure_chttp2.c b/src/core/security/server_secure_chttp2.c
index 881e44a3fedd012397298dad20ad5872ac07a419..82c639e8301debc2fd8f7a5a31d9bc5ef1dda4e8 100644
--- a/src/core/security/server_secure_chttp2.c
+++ b/src/core/security/server_secure_chttp2.c
@@ -93,9 +93,9 @@ static void setup_transport(grpc_exec_ctx *exec_ctx, void *statep,
   grpc_server_secure_state *state = statep;
   grpc_channel_args *args_copy;
   grpc_arg args_to_add[2];
-  args_to_add[0] = grpc_security_connector_to_arg(state->sc);
+  args_to_add[0] = grpc_server_credentials_to_arg(state->creds);
   args_to_add[1] =
-      grpc_auth_metadata_processor_to_arg(&state->creds->processor);
+      grpc_auth_context_to_arg(state->sc->auth_context);
   args_copy = grpc_channel_args_copy_and_add(
       grpc_server_get_channel_args(state->server), args_to_add,
       GPR_ARRAY_SIZE(args_to_add));
diff --git a/src/core/support/alloc.c b/src/core/support/alloc.c
index d2ed82e7717b328adff2ba1e093f05efea68cd41..bfcb77956b31fda7b9474139575bca073a1e8d85 100644
--- a/src/core/support/alloc.c
+++ b/src/core/support/alloc.c
@@ -35,22 +35,32 @@
 
 #include <stdlib.h>
 #include <grpc/support/port_platform.h>
+#include "src/core/profiling/timers.h"
 
 void *gpr_malloc(size_t size) {
-  void *p = malloc(size);
+  void *p;
+  GPR_TIMER_BEGIN("gpr_malloc", 0);
+  p = malloc(size);
   if (!p) {
     abort();
   }
+  GPR_TIMER_END("gpr_malloc", 0);
   return p;
 }
 
-void gpr_free(void *p) { free(p); }
+void gpr_free(void *p) {
+  GPR_TIMER_BEGIN("gpr_free", 0);
+  free(p);
+  GPR_TIMER_END("gpr_free", 0);
+}
 
 void *gpr_realloc(void *p, size_t size) {
+  GPR_TIMER_BEGIN("gpr_realloc", 0);
   p = realloc(p, size);
   if (!p) {
     abort();
   }
+  GPR_TIMER_END("gpr_realloc", 0);
   return p;
 }
 
diff --git a/src/core/support/sync_posix.c b/src/core/support/sync_posix.c
index 91c30989ce8676a55194504609cc9a3ec5f5eee5..39c96feb137c890eb2d5b35eeea704ffab9386e9 100644
--- a/src/core/support/sync_posix.c
+++ b/src/core/support/sync_posix.c
@@ -40,14 +40,23 @@
 #include <grpc/support/log.h>
 #include <grpc/support/sync.h>
 #include <grpc/support/time.h>
+#include "src/core/profiling/timers.h"
 
 void gpr_mu_init(gpr_mu* mu) { GPR_ASSERT(pthread_mutex_init(mu, NULL) == 0); }
 
 void gpr_mu_destroy(gpr_mu* mu) { GPR_ASSERT(pthread_mutex_destroy(mu) == 0); }
 
-void gpr_mu_lock(gpr_mu* mu) { GPR_ASSERT(pthread_mutex_lock(mu) == 0); }
+void gpr_mu_lock(gpr_mu* mu) {
+  GPR_TIMER_BEGIN("gpr_mu_lock", 0);
+  GPR_ASSERT(pthread_mutex_lock(mu) == 0);
+  GPR_TIMER_END("gpr_mu_lock", 0);
+}
 
-void gpr_mu_unlock(gpr_mu* mu) { GPR_ASSERT(pthread_mutex_unlock(mu) == 0); }
+void gpr_mu_unlock(gpr_mu* mu) {
+  GPR_TIMER_BEGIN("gpr_mu_unlock", 0);
+  GPR_ASSERT(pthread_mutex_unlock(mu) == 0);
+  GPR_TIMER_END("gpr_mu_unlock", 0);
+}
 
 int gpr_mu_trylock(gpr_mu* mu) {
   int err = pthread_mutex_trylock(mu);
diff --git a/src/core/support/time_posix.c b/src/core/support/time_posix.c
index 78f2c2bb77a6fb2c40155cbb90190d610fa86827..02cfca85552a5a87f2a098584871429cc1bcf70e 100644
--- a/src/core/support/time_posix.c
+++ b/src/core/support/time_posix.c
@@ -63,7 +63,7 @@ static gpr_timespec gpr_from_timespec(struct timespec ts,
 /** maps gpr_clock_type --> clockid_t for clock_gettime */
 static clockid_t clockid_for_gpr_clock[] = {CLOCK_MONOTONIC, CLOCK_REALTIME};
 
-void gpr_time_init(void) {}
+void gpr_time_init(void) { gpr_precise_clock_init(); }
 
 gpr_timespec gpr_now(gpr_clock_type clock_type) {
   struct timespec now;
@@ -89,6 +89,7 @@ static uint64_t g_time_start;
 
 void gpr_time_init(void) {
   mach_timebase_info_data_t tb = {0, 1};
+  gpr_precise_clock_init();
   mach_timebase_info(&tb);
   g_time_scale = tb.numer;
   g_time_scale /= tb.denom;
diff --git a/src/core/support/time_precise.c b/src/core/support/time_precise.c
new file mode 100644
index 0000000000000000000000000000000000000000..b37517e639eb7f626faed1580225ed42f8819a08
--- /dev/null
+++ b/src/core/support/time_precise.c
@@ -0,0 +1,89 @@
+/*
+ *
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <grpc/support/log.h>
+#include <grpc/support/time.h>
+#include <stdio.h>
+
+#ifdef GRPC_TIMERS_RDTSC
+#if defined(__i386__)
+static void gpr_get_cycle_counter(long long int *clk) {
+  long long int ret;
+  __asm__ volatile("rdtsc" : "=A"(ret));
+  *clk = ret;
+}
+
+// ----------------------------------------------------------------
+#elif defined(__x86_64__) || defined(__amd64__)
+static void gpr_get_cycle_counter(long long int *clk) {
+  unsigned long long low, high;
+  __asm__ volatile("rdtsc" : "=a"(low), "=d"(high));
+  *clk = (long long)(high << 32) | (long long)low;
+}
+#endif
+
+static double cycles_per_second = 0;
+static long long int start_cycle;
+void gpr_precise_clock_init(void) {
+  time_t start;
+  long long end_cycle;
+  gpr_log(GPR_DEBUG, "Calibrating timers");
+  start = time(NULL);
+  while (time(NULL) == start)
+    ;
+  gpr_get_cycle_counter(&start_cycle);
+  while (time(NULL) <= start + 10)
+    ;
+  gpr_get_cycle_counter(&end_cycle);
+  cycles_per_second = (double)(end_cycle - start_cycle) / 10.0;
+  gpr_log(GPR_DEBUG, "... cycles_per_second = %f\n", cycles_per_second);
+}
+
+void gpr_precise_clock_now(gpr_timespec *clk) {
+  long long int counter;
+  double secs;
+  gpr_get_cycle_counter(&counter);
+  secs = (double)(counter - start_cycle) / cycles_per_second;
+  clk->clock_type = GPR_CLOCK_PRECISE;
+  clk->tv_sec = (time_t)secs;
+  clk->tv_nsec = (int)(1e9 * (secs - (double)clk->tv_sec));
+}
+
+#else  /* GRPC_TIMERS_RDTSC */
+void gpr_precise_clock_init(void) {}
+
+void gpr_precise_clock_now(gpr_timespec *clk) {
+  *clk = gpr_now(GPR_CLOCK_REALTIME);
+  clk->clock_type = GPR_CLOCK_PRECISE;
+}
+#endif /* GRPC_TIMERS_RDTSC */
diff --git a/src/core/support/time_precise.h b/src/core/support/time_precise.h
index cd201faab95af882db27764e3560ada2376cf667..80c5000123d6bf7767a8a28dac682121af332e48 100644
--- a/src/core/support/time_precise.h
+++ b/src/core/support/time_precise.h
@@ -34,60 +34,9 @@
 #ifndef GRPC_CORE_SUPPORT_TIME_PRECISE_H_
 #define GRPC_CORE_SUPPORT_TIME_PRECISE_H_
 
-#include <grpc/support/sync.h>
 #include <grpc/support/time.h>
-#include <stdio.h>
 
-#ifdef GRPC_TIMERS_RDTSC
-#if defined(__i386__)
-static void gpr_get_cycle_counter(long long int *clk) {
-  long long int ret;
-  __asm__ volatile("rdtsc" : "=A"(ret));
-  *clk = ret;
-}
-
-// ----------------------------------------------------------------
-#elif defined(__x86_64__) || defined(__amd64__)
-static void gpr_get_cycle_counter(long long int *clk) {
-  unsigned long long low, high;
-  __asm__ volatile("rdtsc" : "=a"(low), "=d"(high));
-  *clk = (high << 32) | low;
-}
-#endif
-
-static gpr_once precise_clock_init = GPR_ONCE_INIT;
-static long long cycles_per_second = 0;
-static void gpr_precise_clock_init() {
-  time_t start = time(NULL);
-  gpr_precise_clock start_cycle;
-  gpr_precise_clock end_cycle;
-  while (time(NULL) == start)
-    ;
-  gpr_get_cycle_counter(&start_cycle);
-  while (time(NULL) == start + 1)
-    ;
-  gpr_get_cycle_counter(&end_cycle);
-  cycles_per_second = end_cycle - start_cycle;
-}
-
-static double grpc_precise_clock_scaling_factor() {
-  gpr_once_init(&precise_clock_init, grpc_precise_clock_init);
-  return 1e6 / cycles_per_second;
-}
-
-static void gpr_precise_clock_now(gpr_timespec *clk) {
-  long long int counter;
-  gpr_get_cycle_counter(&counter);
-  clk->clock = GPR_CLOCK_REALTIME;
-  clk->tv_sec = counter / cycles_per_second;
-  clk->tv_nsec = counter % cycles_per_second;
-}
-
-#else  /* GRPC_TIMERS_RDTSC */
-static void gpr_precise_clock_now(gpr_timespec *clk) {
-  *clk = gpr_now(GPR_CLOCK_REALTIME);
-  clk->clock_type = GPR_CLOCK_PRECISE;
-}
-#endif /* GRPC_TIMERS_RDTSC */
+void gpr_precise_clock_init(void);
+void gpr_precise_clock_now(gpr_timespec *clk);
 
 #endif /* GRPC_CORE_SUPPORT_TIME_PRECISE_ */
diff --git a/src/core/surface/byte_buffer.c b/src/core/surface/byte_buffer.c
index a930949f2d4690fea58ee987205659cc66c7e1f7..fb39c4531d9acca2d2cd2bd21ec4de2098fb2e5d 100644
--- a/src/core/surface/byte_buffer.c
+++ b/src/core/surface/byte_buffer.c
@@ -75,9 +75,7 @@ grpc_byte_buffer *grpc_byte_buffer_copy(grpc_byte_buffer *bb) {
       return grpc_raw_byte_buffer_create(bb->data.raw.slice_buffer.slices,
                                          bb->data.raw.slice_buffer.count);
   }
-  gpr_log(GPR_INFO, "should never get here");
-  abort();
-  return NULL;
+  GPR_UNREACHABLE_CODE(return NULL);
 }
 
 void grpc_byte_buffer_destroy(grpc_byte_buffer *bb) {
@@ -95,6 +93,5 @@ size_t grpc_byte_buffer_length(grpc_byte_buffer *bb) {
     case GRPC_BB_RAW:
       return bb->data.raw.slice_buffer.length;
   }
-  gpr_log(GPR_ERROR, "should never reach here");
-  abort();
+  GPR_UNREACHABLE_CODE(return 0);
 }
diff --git a/src/core/surface/call.c b/src/core/surface/call.c
index d15a3bcbade6ebf2d8b7038dbf3d1e45de1dc5e0..b40e74d61b767aaa43c3f73512b6975e2a58781a 100644
--- a/src/core/surface/call.c
+++ b/src/core/surface/call.c
@@ -306,8 +306,9 @@ grpc_call *grpc_call_create(grpc_channel *channel, grpc_call *parent_call,
   grpc_transport_stream_op *initial_op_ptr = NULL;
   grpc_channel_stack *channel_stack = grpc_channel_get_channel_stack(channel);
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_call *call =
-      gpr_malloc(sizeof(grpc_call) + channel_stack->call_stack_size);
+  grpc_call *call;
+  GPR_TIMER_BEGIN("grpc_call_create", 0);
+  call = gpr_malloc(sizeof(grpc_call) + channel_stack->call_stack_size);
   memset(call, 0, sizeof(grpc_call));
   gpr_mu_init(&call->mu);
   gpr_mu_init(&call->completion_mu);
@@ -401,6 +402,7 @@ grpc_call *grpc_call_create(grpc_channel *channel, grpc_call *parent_call,
     set_deadline_alarm(&exec_ctx, call, send_deadline);
   }
   grpc_exec_ctx_finish(&exec_ctx);
+  GPR_TIMER_END("grpc_call_create", 0);
   return call;
 }
 
@@ -425,12 +427,17 @@ static grpc_cq_completion *allocate_completion(grpc_call *call) {
     if (call->allocated_completions & (1u << i)) {
       continue;
     }
-    call->allocated_completions |= (gpr_uint8)(1u << i);
+    /* NB: the following integer arithmetic operation needs to be in its
+     * expanded form due to the "integral promotion" performed (see section
+     * 3.2.1.1 of the C89 draft standard). A cast to the smaller container type
+     * is then required to avoid the compiler warning */
+    call->allocated_completions =
+        (gpr_uint8)(call->allocated_completions | (1u << i));
     gpr_mu_unlock(&call->completion_mu);
     return &call->completions[i];
   }
-  gpr_log(GPR_ERROR, "should never reach here");
-  abort();
+  GPR_UNREACHABLE_CODE(return NULL);
+  return NULL;
 }
 
 static void done_completion(grpc_exec_ctx *exec_ctx, void *call,
@@ -456,6 +463,7 @@ void grpc_call_internal_ref(grpc_call *c) {
 static void destroy_call(grpc_exec_ctx *exec_ctx, grpc_call *call) {
   size_t i;
   grpc_call *c = call;
+  GPR_TIMER_BEGIN("destroy_call", 0);
   grpc_call_stack_destroy(exec_ctx, CALL_STACK_FROM_CALL(c));
   GRPC_CHANNEL_INTERNAL_UNREF(exec_ctx, c->channel, "call");
   gpr_mu_destroy(&c->mu);
@@ -488,6 +496,7 @@ static void destroy_call(grpc_exec_ctx *exec_ctx, grpc_call *call) {
     GRPC_CQ_INTERNAL_UNREF(c->cq, "bind");
   }
   gpr_free(c);
+  GPR_TIMER_END("destroy_call", 0);
 }
 
 #ifdef GRPC_CALL_REF_COUNT_DEBUG
@@ -521,9 +530,13 @@ static void set_compression_algorithm(grpc_call *call,
   call->compression_algorithm = algo;
 }
 
-grpc_compression_algorithm grpc_call_get_compression_algorithm(
-    const grpc_call *call) {
-  return call->compression_algorithm;
+grpc_compression_algorithm grpc_call_test_only_get_compression_algorithm(
+    grpc_call *call) {
+  grpc_compression_algorithm algorithm;
+  gpr_mu_lock(&call->mu);
+  algorithm = call->compression_algorithm;
+  gpr_mu_unlock(&call->mu);
+  return algorithm;
 }
 
 static void set_encodings_accepted_by_peer(
@@ -557,12 +570,20 @@ static void set_encodings_accepted_by_peer(
   }
 }
 
-gpr_uint32 grpc_call_get_encodings_accepted_by_peer(grpc_call *call) {
-  return call->encodings_accepted_by_peer;
+gpr_uint32 grpc_call_test_only_get_encodings_accepted_by_peer(grpc_call *call) {
+  gpr_uint32 encodings_accepted_by_peer;
+  gpr_mu_lock(&call->mu);
+  encodings_accepted_by_peer = call->encodings_accepted_by_peer;
+  gpr_mu_unlock(&call->mu);
+  return encodings_accepted_by_peer;
 }
 
-gpr_uint32 grpc_call_get_message_flags(const grpc_call *call) {
-  return call->incoming_message_flags;
+gpr_uint32 grpc_call_test_only_get_message_flags(grpc_call *call) {
+  gpr_uint32 flags;
+  gpr_mu_lock(&call->mu);
+  flags = call->incoming_message_flags;
+  gpr_mu_unlock(&call->mu);
+  return flags;
 }
 
 static void set_status_details(grpc_call *call, status_source source,
@@ -607,6 +628,8 @@ static void unlock(grpc_exec_ctx *exec_ctx, grpc_call *call) {
   const size_t MAX_RECV_PEEK_AHEAD = 65536;
   size_t buffered_bytes;
 
+  GPR_TIMER_BEGIN("unlock", 0);
+
   memset(&op, 0, sizeof(op));
 
   op.cancel_with_status = call->cancel_with_status;
@@ -677,6 +700,8 @@ static void unlock(grpc_exec_ctx *exec_ctx, grpc_call *call) {
     unlock(exec_ctx, call);
     GRPC_CALL_INTERNAL_UNREF(exec_ctx, call, "completing");
   }
+
+  GPR_TIMER_END("unlock", 0);
 }
 
 static void get_final_status(grpc_call *call, grpc_ioreq_data out) {
@@ -736,7 +761,11 @@ static void finish_live_ioreq_op(grpc_call *call, grpc_ioreq_op op,
   size_t i;
   /* ioreq is live: we need to do something */
   master = &call->masters[master_set];
-  master->complete_mask |= (gpr_uint16)(1u << op);
+  /* NB: the following integer arithmetic operation needs to be in its
+   * expanded form due to the "integral promotion" performed (see section
+   * 3.2.1.1 of the C89 draft standard). A cast to the smaller container type
+   * is then required to avoid the compiler warning */
+  master->complete_mask = (gpr_uint16)(master->complete_mask | (1u << op));
   if (!success) {
     master->success = 0;
   }
@@ -822,6 +851,7 @@ static void early_out_write_ops(grpc_call *call) {
 
 static void call_on_done_send(grpc_exec_ctx *exec_ctx, void *pc, int success) {
   grpc_call *call = pc;
+  GPR_TIMER_BEGIN("call_on_done_send", 0);
   lock(call);
   if (call->last_send_contains & (1 << GRPC_IOREQ_SEND_INITIAL_METADATA)) {
     finish_ioreq_op(call, GRPC_IOREQ_SEND_INITIAL_METADATA, success);
@@ -845,9 +875,11 @@ static void call_on_done_send(grpc_exec_ctx *exec_ctx, void *pc, int success) {
   call->sending = 0;
   unlock(exec_ctx, call);
   GRPC_CALL_INTERNAL_UNREF(exec_ctx, call, "sending");
+  GPR_TIMER_END("call_on_done_send", 0);
 }
 
 static void finish_message(grpc_call *call) {
+  GPR_TIMER_BEGIN("finish_message", 0);
   if (call->error_status_set == 0) {
     /* TODO(ctiller): this could be a lot faster if coded directly */
     grpc_byte_buffer *byte_buffer;
@@ -867,6 +899,7 @@ static void finish_message(grpc_call *call) {
   gpr_slice_buffer_reset_and_unref(&call->incoming_message);
   GPR_ASSERT(call->incoming_message.count == 0);
   call->reading_message = 0;
+  GPR_TIMER_END("finish_message", 0);
 }
 
 static int begin_message(grpc_call *call, grpc_begin_message msg) {
@@ -927,6 +960,7 @@ static int add_slice_to_message(grpc_call *call, gpr_slice slice) {
   }
   /* we have to be reading a message to know what to do here */
   if (!call->reading_message) {
+    gpr_slice_unref(slice);
     cancel_with_status(call, GRPC_STATUS_INVALID_ARGUMENT,
                        "Received payload data while not reading a message");
     return 0;
@@ -955,7 +989,7 @@ static void call_on_done_recv(grpc_exec_ctx *exec_ctx, void *pc, int success) {
   grpc_call *child_call;
   grpc_call *next_child_call;
   size_t i;
-  GRPC_TIMER_BEGIN(GRPC_PTAG_CALL_ON_DONE_RECV, 0);
+  GPR_TIMER_BEGIN("call_on_done_recv", 0);
   lock(call);
   call->receiving = 0;
   if (success) {
@@ -965,13 +999,19 @@ static void call_on_done_recv(grpc_exec_ctx *exec_ctx, void *pc, int success) {
         case GRPC_NO_OP:
           break;
         case GRPC_OP_METADATA:
+          GPR_TIMER_BEGIN("recv_metadata", 0);
           recv_metadata(exec_ctx, call, &op->data.metadata);
+          GPR_TIMER_END("recv_metadata", 0);
           break;
         case GRPC_OP_BEGIN_MESSAGE:
+          GPR_TIMER_BEGIN("begin_message", 0);
           success = begin_message(call, op->data.begin_message);
+          GPR_TIMER_END("begin_message", 0);
           break;
         case GRPC_OP_SLICE:
+          GPR_TIMER_BEGIN("add_slice_to_message", 0);
           success = add_slice_to_message(call, op->data.slice);
+          GPR_TIMER_END("add_slice_to_message", 0);
           break;
       }
     }
@@ -1017,7 +1057,7 @@ static void call_on_done_recv(grpc_exec_ctx *exec_ctx, void *pc, int success) {
   unlock(exec_ctx, call);
 
   GRPC_CALL_INTERNAL_UNREF(exec_ctx, call, "receiving");
-  GRPC_TIMER_END(GRPC_PTAG_CALL_ON_DONE_RECV, 0);
+  GPR_TIMER_END("call_on_done_recv", 0);
 }
 
 static int prepare_application_metadata(grpc_call *call, size_t count,
@@ -1246,7 +1286,11 @@ static grpc_call_error start_ioreq(grpc_call *call, const grpc_ioreq *reqs,
                            GRPC_MDSTR_REF(reqs[i].data.send_status.details));
       }
     }
-    have_ops |= (gpr_uint16)(1u << op);
+    /* NB: the following integer arithmetic operation needs to be in its
+     * expanded form due to the "integral promotion" performed (see section
+     * 3.2.1.1 of the C89 draft standard). A cast to the smaller container type
+     * is then required to avoid the compiler warning */
+    have_ops = (gpr_uint16)(have_ops | (1u << op));
 
     call->request_data[op] = data;
     call->request_flags[op] = reqs[i].flags;
@@ -1491,16 +1535,25 @@ static void recv_metadata(grpc_exec_ctx *exec_ctx, grpc_call *call,
     grpc_mdelem *mdel = l->md;
     grpc_mdstr *key = mdel->key;
     if (key == grpc_channel_get_status_string(call->channel)) {
+      GPR_TIMER_BEGIN("status", 0);
       set_status_code(call, STATUS_FROM_WIRE, decode_status(mdel));
+      GPR_TIMER_END("status", 0);
     } else if (key == grpc_channel_get_message_string(call->channel)) {
+      GPR_TIMER_BEGIN("status-details", 0);
       set_status_details(call, STATUS_FROM_WIRE, GRPC_MDSTR_REF(mdel->value));
+      GPR_TIMER_END("status-details", 0);
     } else if (key ==
                grpc_channel_get_compression_algorithm_string(call->channel)) {
+      GPR_TIMER_BEGIN("compression_algorithm", 0);
       set_compression_algorithm(call, decode_compression(mdel));
+      GPR_TIMER_END("compression_algorithm", 0);
     } else if (key == grpc_channel_get_encodings_accepted_by_peer_string(
                           call->channel)) {
+      GPR_TIMER_BEGIN("encodings_accepted_by_peer", 0);
       set_encodings_accepted_by_peer(call, mdel->value->slice);
+      GPR_TIMER_END("encodings_accepted_by_peer", 0);
     } else {
+      GPR_TIMER_BEGIN("report_up", 0);
       dest = &call->buffered_metadata[is_trailing];
       if (dest->count == dest->capacity) {
         dest->capacity = GPR_MAX(dest->capacity + 8, dest->capacity * 2);
@@ -1521,12 +1574,15 @@ static void recv_metadata(grpc_exec_ctx *exec_ctx, grpc_call *call,
       }
       call->owned_metadata[call->owned_metadata_count++] = mdel;
       l->md = NULL;
+      GPR_TIMER_END("report_up", 0);
     }
   }
   if (gpr_time_cmp(md->deadline, gpr_inf_future(md->deadline.clock_type)) !=
           0 &&
       !call->is_client) {
+    GPR_TIMER_BEGIN("set_deadline_alarm", 0);
     set_deadline_alarm(exec_ctx, call, md->deadline);
+    GPR_TIMER_END("set_deadline_alarm", 0);
   }
   if (!is_trailing) {
     call->read_state = READ_STATE_GOT_INITIAL_METADATA;
@@ -1589,6 +1645,8 @@ grpc_call_error grpc_call_start_batch(grpc_call *call, const grpc_op *ops,
   grpc_call_error error;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
 
+  GPR_TIMER_BEGIN("grpc_call_start_batch", 0);
+
   GRPC_API_TRACE(
       "grpc_call_start_batch(call=%p, ops=%p, nops=%lu, tag=%p, reserved=%p)",
       5, (call, ops, (unsigned long)nops, tag, reserved));
@@ -1826,6 +1884,7 @@ grpc_call_error grpc_call_start_batch(grpc_call *call, const grpc_op *ops,
                                               finish_func, tag);
 done:
   grpc_exec_ctx_finish(&exec_ctx);
+  GPR_TIMER_END("grpc_call_start_batch", 0);
   return error;
 }
 
diff --git a/src/core/surface/call.h b/src/core/surface/call.h
index f421a81619f7854c0f3024afea7721feadc5876c..9b7c6f9bfbed9e4bc174820fac8759bb5b449c9a 100644
--- a/src/core/surface/call.h
+++ b/src/core/surface/call.h
@@ -169,17 +169,6 @@ void *grpc_call_context_get(grpc_call *call, grpc_context_index elem);
 
 gpr_uint8 grpc_call_is_client(grpc_call *call);
 
-grpc_compression_algorithm grpc_call_get_compression_algorithm(
-    const grpc_call *call);
-
-gpr_uint32 grpc_call_get_message_flags(const grpc_call *call);
-
-/** Returns a bitset for the encodings (compression algorithms) supported by \a
- * call's peer.
- *
- * To be indexed by grpc_compression_algorithm enum values. */
-gpr_uint32 grpc_call_get_encodings_accepted_by_peer(grpc_call *call);
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/node/examples/stock_client.js b/src/core/surface/call_test_only.h
similarity index 63%
rename from src/node/examples/stock_client.js
rename to src/core/surface/call_test_only.h
index ab9b050e9b16790f8288ce0fef2300a5c33624f7..df4be3248b2a0baa58f16fdfcea7c10f131f01bb 100644
--- a/src/node/examples/stock_client.js
+++ b/src/core/surface/call_test_only.h
@@ -31,17 +31,35 @@
  *
  */
 
-var grpc = require('..');
-var examples = grpc.load(__dirname + '/stock.proto').examples;
-
-/**
- * This exports a client constructor for the Stock service. The usage looks like
- *
- * var StockClient = require('stock_client.js');
- * var stockClient = new StockClient(server_address,
- *                                   grpc.Credentials.createInsecure());
- * stockClient.getLastTradePrice({symbol: 'GOOG'}, function(error, response) {
- *   console.log(error || response);
- * });
- */
-module.exports = examples.Stock;
+#ifndef GRPC_INTERNAL_CORE_SURFACE_CALL_TEST_ONLY_H
+#define GRPC_INTERNAL_CORE_SURFACE_CALL_TEST_ONLY_H
+
+#include <grpc/grpc.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** Return the compression algorithm from \a call.
+ *
+ * \warning This function should \b only be used in test code. */
+grpc_compression_algorithm grpc_call_test_only_get_compression_algorithm(
+    grpc_call *call);
+
+/** Return the message flags from \a call.
+ *
+ * \warning This function should \b only be used in test code. */
+gpr_uint32 grpc_call_test_only_get_message_flags(grpc_call *call);
+
+/** Returns a bitset for the encodings (compression algorithms) supported by \a
+ * call's peer.
+ *
+ * To be indexed by grpc_compression_algorithm enum values. */
+gpr_uint32 grpc_call_test_only_get_encodings_accepted_by_peer(grpc_call *call);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* GRPC_INTERNAL_CORE_SURFACE_CALL_TEST_ONLY_H */
diff --git a/src/core/surface/channel_connectivity.c b/src/core/surface/channel_connectivity.c
index 01430785dc0d0db16ab627a44681683605eb16e6..52a64fb2cdffb54c3c3ff54f19c65b55a3a3a464 100644
--- a/src/core/surface/channel_connectivity.c
+++ b/src/core/surface/channel_connectivity.c
@@ -117,9 +117,7 @@ static void finished_completion(grpc_exec_ctx *exec_ctx, void *pw,
   switch (w->phase) {
     case WAITING:
     case CALLED_BACK:
-      gpr_log(GPR_ERROR, "should never reach here");
-      abort();
-      break;
+      GPR_UNREACHABLE_CODE(return );
     case CALLING_BACK:
       w->phase = CALLED_BACK;
       break;
@@ -171,9 +169,7 @@ static void partly_done(grpc_exec_ctx *exec_ctx, state_watcher *w,
       w->phase = CALLING_BACK_AND_FINISHED;
       break;
     case CALLING_BACK_AND_FINISHED:
-      gpr_log(GPR_ERROR, "should never reach here");
-      abort();
-      break;
+      GPR_UNREACHABLE_CODE(return );
     case CALLED_BACK:
       delete = 1;
       break;
diff --git a/src/core/surface/completion_queue.c b/src/core/surface/completion_queue.c
index e818ccba488b86c15360751306988fe2bf3820b7..bcdb3638733c9f2d900cad97d7217435d4fd9094 100644
--- a/src/core/surface/completion_queue.c
+++ b/src/core/surface/completion_queue.c
@@ -42,6 +42,7 @@
 #include "src/core/surface/call.h"
 #include "src/core/surface/event_string.h"
 #include "src/core/surface/surface_trace.h"
+#include "src/core/profiling/timers.h"
 #include <grpc/support/alloc.h>
 #include <grpc/support/atm.h>
 #include <grpc/support/log.h>
@@ -143,6 +144,8 @@ void grpc_cq_end_op(grpc_exec_ctx *exec_ctx, grpc_completion_queue *cc,
   int i;
   grpc_pollset_worker *pluck_worker;
 
+  GPR_TIMER_BEGIN("grpc_cq_end_op", 0);
+
   storage->tag = tag;
   storage->done = done;
   storage->done_arg = done_arg;
@@ -174,6 +177,8 @@ void grpc_cq_end_op(grpc_exec_ctx *exec_ctx, grpc_completion_queue *cc,
     gpr_mu_unlock(GRPC_POLLSET_MU(&cc->pollset));
     grpc_pollset_shutdown(exec_ctx, &cc->pollset, &cc->pollset_destroy_done);
   }
+
+  GPR_TIMER_END("grpc_cq_end_op", 0);
 }
 
 grpc_event grpc_completion_queue_next(grpc_completion_queue *cc,
@@ -184,6 +189,8 @@ grpc_event grpc_completion_queue_next(grpc_completion_queue *cc,
   gpr_timespec now;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
 
+  GPR_TIMER_BEGIN("grpc_completion_queue_next", 0);
+
   GRPC_API_TRACE(
       "grpc_completion_queue_next("
       "cc=%p, "
@@ -230,6 +237,9 @@ grpc_event grpc_completion_queue_next(grpc_completion_queue *cc,
   GRPC_SURFACE_TRACE_RETURNED_EVENT(cc, &ret);
   GRPC_CQ_INTERNAL_UNREF(cc, "next");
   grpc_exec_ctx_finish(&exec_ctx);
+
+  GPR_TIMER_END("grpc_completion_queue_next", 0);
+
   return ret;
 }
 
@@ -254,8 +264,7 @@ static void del_plucker(grpc_completion_queue *cc, void *tag,
       return;
     }
   }
-  gpr_log(GPR_ERROR, "should never reach here");
-  abort();
+  GPR_UNREACHABLE_CODE(return );
 }
 
 grpc_event grpc_completion_queue_pluck(grpc_completion_queue *cc, void *tag,
@@ -268,6 +277,8 @@ grpc_event grpc_completion_queue_pluck(grpc_completion_queue *cc, void *tag,
   int first_loop = 1;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
 
+  GPR_TIMER_BEGIN("grpc_completion_queue_pluck", 0);
+
   GRPC_API_TRACE(
       "grpc_completion_queue_pluck("
       "cc=%p, tag=%p, "
@@ -333,6 +344,9 @@ done:
   GRPC_SURFACE_TRACE_RETURNED_EVENT(cc, &ret);
   GRPC_CQ_INTERNAL_UNREF(cc, "pluck");
   grpc_exec_ctx_finish(&exec_ctx);
+
+  GPR_TIMER_END("grpc_completion_queue_pluck", 0);
+
   return ret;
 }
 
diff --git a/src/core/surface/init.c b/src/core/surface/init.c
index 95011cab178a3fe42d0d92b90216b96c3c319b09..715c90a5e1d46785a38c97dd9499e6fde835a506 100644
--- a/src/core/surface/init.c
+++ b/src/core/surface/init.c
@@ -115,7 +115,7 @@ void grpc_init(void) {
         gpr_log(GPR_ERROR, "Could not initialize census.");
       }
     }
-    grpc_timers_global_init();
+    gpr_timers_global_init();
     for (i = 0; i < g_number_of_plugins; i++) {
       if (g_all_of_the_plugins[i].init != NULL) {
         g_all_of_the_plugins[i].init();
@@ -133,7 +133,7 @@ void grpc_shutdown(void) {
   if (--g_initializations == 0) {
     grpc_iomgr_shutdown();
     census_shutdown();
-    grpc_timers_global_destroy();
+    gpr_timers_global_destroy();
     grpc_tracer_shutdown();
     grpc_resolver_registry_shutdown();
     for (i = 0; i < g_number_of_plugins; i++) {
diff --git a/src/core/transport/chttp2/bin_encoder.c b/src/core/transport/chttp2/bin_encoder.c
index f1bbf9aa918160f2a2fc58ac3304486739d4529c..9c9070ede4f46a19a3b03dcaac8a06fdea516059 100644
--- a/src/core/transport/chttp2/bin_encoder.c
+++ b/src/core/transport/chttp2/bin_encoder.c
@@ -185,8 +185,12 @@ gpr_slice grpc_chttp2_huffman_compress(gpr_slice input) {
   }
 
   if (temp_length) {
-    *out++ = (gpr_uint8)(temp << (8u - temp_length)) |
-             (gpr_uint8)(0xffu >> temp_length);
+    /* NB: the following integer arithmetic operation needs to be in its
+     * expanded form due to the "integral promotion" performed (see section
+     * 3.2.1.1 of the C89 draft standard). A cast to the smaller container type
+     * is then required to avoid the compiler warning */
+    *out++ = (gpr_uint8)((gpr_uint8)(temp << (8u - temp_length)) |
+                         (gpr_uint8)(0xffu >> temp_length));
   }
 
   GPR_ASSERT(out == GPR_SLICE_END_PTR(output));
@@ -265,8 +269,12 @@ gpr_slice grpc_chttp2_base64_encode_and_huffman_compress(gpr_slice input) {
   }
 
   if (out.temp_length) {
-    *out.out++ = (gpr_uint8)(out.temp << (8u - out.temp_length)) |
-                 (gpr_uint8)(0xffu >> out.temp_length);
+    /* NB: the following integer arithmetic operation needs to be in its
+     * expanded form due to the "integral promotion" performed (see section
+     * 3.2.1.1 of the C89 draft standard). A cast to the smaller container type
+     * is then required to avoid the compiler warning */
+    *out.out++ = (gpr_uint8)((gpr_uint8)(out.temp << (8u - out.temp_length)) |
+                             (gpr_uint8)(0xffu >> out.temp_length));
   }
 
   GPR_ASSERT(out.out <= GPR_SLICE_END_PTR(output));
diff --git a/src/core/transport/chttp2/frame_data.c b/src/core/transport/chttp2/frame_data.c
index acfa7c002ebac93f934fbb7ce43dff63d9c7a43e..07179a4571e9b139ba17d93c623a0841d6fa6d8d 100644
--- a/src/core/transport/chttp2/frame_data.c
+++ b/src/core/transport/chttp2/frame_data.c
@@ -168,7 +168,5 @@ grpc_chttp2_parse_error grpc_chttp2_data_parser_parse(
       }
   }
 
-  gpr_log(GPR_ERROR, "should never reach here");
-  abort();
-  return GRPC_CHTTP2_CONNECTION_ERROR;
+  GPR_UNREACHABLE_CODE(return GRPC_CHTTP2_CONNECTION_ERROR);
 }
diff --git a/src/core/transport/chttp2/frame_goaway.c b/src/core/transport/chttp2/frame_goaway.c
index 2ff1eda89b60d7c219f08db1698f9ecb21a05d02..c5758bcb7147b84623250d25ea47810dd736581b 100644
--- a/src/core/transport/chttp2/frame_goaway.c
+++ b/src/core/transport/chttp2/frame_goaway.c
@@ -152,9 +152,7 @@ grpc_chttp2_parse_error grpc_chttp2_goaway_parser_parse(
       }
       return GRPC_CHTTP2_PARSE_OK;
   }
-  gpr_log(GPR_ERROR, "Should never end up here");
-  abort();
-  return GRPC_CHTTP2_CONNECTION_ERROR;
+  GPR_UNREACHABLE_CODE(return GRPC_CHTTP2_CONNECTION_ERROR);
 }
 
 void grpc_chttp2_goaway_append(gpr_uint32 last_stream_id, gpr_uint32 error_code,
diff --git a/src/core/transport/chttp2/hpack_parser.c b/src/core/transport/chttp2/hpack_parser.c
index 20ea51337517bd0fa65a18a8482981aee6bc11a9..20d8312d547bc72392b6c75667c520ad718e3fea 100644
--- a/src/core/transport/chttp2/hpack_parser.c
+++ b/src/core/transport/chttp2/hpack_parser.c
@@ -1166,9 +1166,7 @@ static int append_string(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
       append_bytes(str, decoded, 3);
       goto b64_byte0;
   }
-  gpr_log(GPR_ERROR, "should never reach here");
-  abort();
-  return 1;
+  GPR_UNREACHABLE_CODE(return 1);
 }
 
 /* append a null terminator to a string */
@@ -1313,9 +1311,7 @@ static int parse_value_string(grpc_chttp2_hpack_parser *p, const gpr_uint8 *cur,
       return 0;
   }
   /* Add code to prevent return without value error */
-  gpr_log(GPR_ERROR, "Should never reach beyond switch in parse_value_string");
-  abort();
-  return 0;
+  GPR_UNREACHABLE_CODE(return 0);
 }
 
 static int parse_value_string_with_indexed_key(grpc_chttp2_hpack_parser *p,
diff --git a/src/core/transport/chttp2/parsing.c b/src/core/transport/chttp2/parsing.c
index f7a0a10581b879418c401b26682d74ca7334766a..5d4d8e70c4680dd892b20441384c719c82aa9d30 100644
--- a/src/core/transport/chttp2/parsing.c
+++ b/src/core/transport/chttp2/parsing.c
@@ -35,6 +35,7 @@
 
 #include <string.h>
 
+#include "src/core/profiling/timers.h"
 #include "src/core/transport/chttp2/http2_errors.h"
 #include "src/core/transport/chttp2/status_conversion.h"
 #include "src/core/transport/chttp2/timeout_encoding.h"
@@ -68,6 +69,8 @@ void grpc_chttp2_prepare_to_read(
   grpc_chttp2_stream_global *stream_global;
   grpc_chttp2_stream_parsing *stream_parsing;
 
+  GPR_TIMER_BEGIN("grpc_chttp2_prepare_to_read", 0);
+
   transport_parsing->next_stream_id = transport_global->next_stream_id;
 
   /* update the parsing view of incoming window */
@@ -89,6 +92,8 @@ void grpc_chttp2_prepare_to_read(
       stream_parsing->incoming_window = stream_global->incoming_window;
     }
   }
+
+  GPR_TIMER_END("grpc_chttp2_prepare_to_read", 0);
 }
 
 void grpc_chttp2_publish_reads(
@@ -417,14 +422,10 @@ int grpc_chttp2_perform_read(grpc_exec_ctx *exec_ctx,
         transport_parsing->incoming_frame_size -= (gpr_uint32)(end - cur);
         return 1;
       }
-      gpr_log(GPR_ERROR, "should never reach here");
-      abort();
+      GPR_UNREACHABLE_CODE(return 0);
   }
 
-  gpr_log(GPR_ERROR, "should never reach here");
-  abort();
-
-  return 0;
+  GPR_UNREACHABLE_CODE(return 0);
 }
 
 static int init_frame_parser(grpc_chttp2_transport_parsing *transport_parsing) {
@@ -580,9 +581,7 @@ static int init_data_frame_parser(
     case GRPC_CHTTP2_CONNECTION_ERROR:
       return 0;
   }
-  gpr_log(GPR_ERROR, "should never reach here");
-  abort();
-  return 0;
+  GPR_UNREACHABLE_CODE(return 0);
 }
 
 static void free_timeout(void *p) { gpr_free(p); }
@@ -820,7 +819,5 @@ static int parse_frame_slice(grpc_exec_ctx *exec_ctx,
     case GRPC_CHTTP2_CONNECTION_ERROR:
       return 0;
   }
-  gpr_log(GPR_ERROR, "should never reach here");
-  abort();
-  return 0;
+  GPR_UNREACHABLE_CODE(return 0);
 }
diff --git a/src/core/transport/chttp2/stream_encoder.c b/src/core/transport/chttp2/stream_encoder.c
index 83227e677db07cacf633799bba2fc312034ad435..6c7f7a9ea7f068c4e24ea8c0de96278d1fb23936 100644
--- a/src/core/transport/chttp2/stream_encoder.c
+++ b/src/core/transport/chttp2/stream_encoder.c
@@ -428,7 +428,7 @@ static grpc_mdelem *hpack_enc(grpc_chttp2_hpack_compressor *c,
       emit_lithdr_noidx(c, dynidx(c, indices_key), elem, st);
       return elem;
     }
-    abort();
+    GPR_UNREACHABLE_CODE(return NULL);
   }
 
   indices_key = c->indices_keys[HASH_FRAGMENT_3(key_hash)];
@@ -442,7 +442,7 @@ static grpc_mdelem *hpack_enc(grpc_chttp2_hpack_compressor *c,
       emit_lithdr_noidx(c, dynidx(c, indices_key), elem, st);
       return elem;
     }
-    abort();
+    GPR_UNREACHABLE_CODE(return NULL);
   }
 
   /* no elem, key in the table... fall back to literal emission */
@@ -454,7 +454,7 @@ static grpc_mdelem *hpack_enc(grpc_chttp2_hpack_compressor *c,
     emit_lithdr_noidx_v(c, elem, st);
     return elem;
   }
-  abort();
+  GPR_UNREACHABLE_CODE(return NULL);
 }
 
 #define STRLEN_LIT(x) (sizeof(x) - 1)
diff --git a/src/core/transport/chttp2/writing.c b/src/core/transport/chttp2/writing.c
index d1c9da6df091bec6f2a97d93e5d1d0d9e9ff06cb..69ad8854ba66f6ceeebc7f1a6815178ee4a2f46d 100644
--- a/src/core/transport/chttp2/writing.c
+++ b/src/core/transport/chttp2/writing.c
@@ -37,6 +37,7 @@
 
 #include <grpc/support/log.h>
 
+#include "src/core/profiling/timers.h"
 #include "src/core/transport/chttp2/http2_errors.h"
 
 static void finalize_outbuf(grpc_chttp2_transport_writing *transport_writing);
@@ -180,6 +181,8 @@ void grpc_chttp2_perform_writes(
 static void finalize_outbuf(grpc_chttp2_transport_writing *transport_writing) {
   grpc_chttp2_stream_writing *stream_writing;
 
+  GPR_TIMER_BEGIN("finalize_outbuf", 0);
+
   while (
       grpc_chttp2_list_pop_writing_stream(transport_writing, &stream_writing)) {
     if (stream_writing->sopb.nops > 0 ||
@@ -208,6 +211,8 @@ static void finalize_outbuf(grpc_chttp2_transport_writing *transport_writing) {
     }
     grpc_chttp2_list_add_written_stream(transport_writing, stream_writing);
   }
+
+  GPR_TIMER_END("finalize_outbuf", 0);
 }
 
 void grpc_chttp2_cleanup_writing(
diff --git a/src/core/transport/chttp2_transport.c b/src/core/transport/chttp2_transport.c
index de743795462968dc2340b141bfd73a721d744843..effc3c4b3becf8858aac8070c6d006db024e3e77 100644
--- a/src/core/transport/chttp2_transport.c
+++ b/src/core/transport/chttp2_transport.c
@@ -510,6 +510,7 @@ grpc_chttp2_stream_parsing *grpc_chttp2_parsing_accept_stream(
 static void lock(grpc_chttp2_transport *t) { gpr_mu_lock(&t->mu); }
 
 static void unlock(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t) {
+  GPR_TIMER_BEGIN("unlock", 0);
   unlock_check_read_write_state(exec_ctx, t);
   if (!t->writing_active && !t->closed &&
       grpc_chttp2_unlocking_check_writes(&t->global, &t->writing)) {
@@ -520,6 +521,7 @@ static void unlock(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t) {
   }
 
   gpr_mu_unlock(&t->mu);
+  GPR_TIMER_END("unlock", 0);
 }
 
 /*
@@ -546,6 +548,8 @@ void grpc_chttp2_terminate_writing(grpc_exec_ctx *exec_ctx,
   grpc_chttp2_transport_writing *transport_writing = transport_writing_ptr;
   grpc_chttp2_transport *t = TRANSPORT_FROM_WRITING(transport_writing);
 
+  GPR_TIMER_BEGIN("grpc_chttp2_terminate_writing", 0);
+
   lock(t);
 
   allow_endpoint_shutdown_locked(exec_ctx, t);
@@ -567,12 +571,16 @@ void grpc_chttp2_terminate_writing(grpc_exec_ctx *exec_ctx,
   unlock(exec_ctx, t);
 
   UNREF_TRANSPORT(exec_ctx, t, "writing");
+
+  GPR_TIMER_END("grpc_chttp2_terminate_writing", 0);
 }
 
 static void writing_action(grpc_exec_ctx *exec_ctx, void *gt,
                            int iomgr_success_ignored) {
   grpc_chttp2_transport *t = gt;
+  GPR_TIMER_BEGIN("writing_action", 0);
   grpc_chttp2_perform_writes(exec_ctx, &t->writing, t->ep);
+  GPR_TIMER_END("writing_action", 0);
 }
 
 void grpc_chttp2_add_incoming_goaway(
@@ -642,6 +650,7 @@ static void maybe_start_some_streams(
 static void perform_stream_op_locked(
     grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_global *transport_global,
     grpc_chttp2_stream_global *stream_global, grpc_transport_stream_op *op) {
+  GPR_TIMER_BEGIN("perform_stream_op_locked", 0);
   if (op->cancel_with_status != GRPC_STATUS_OK) {
     cancel_from_api(transport_global, stream_global, op->cancel_with_status);
   }
@@ -713,6 +722,7 @@ static void perform_stream_op_locked(
   }
 
   grpc_exec_ctx_enqueue(exec_ctx, op->on_consumed, 1);
+  GPR_TIMER_END("perform_stream_op_locked", 0);
 }
 
 static void perform_stream_op(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
@@ -1103,6 +1113,8 @@ static void recv_data(grpc_exec_ctx *exec_ctx, void *tp, int success) {
   int keep_reading = 0;
   grpc_chttp2_transport *t = tp;
 
+  GPR_TIMER_BEGIN("recv_data", 0);
+
   lock(t);
   i = 0;
   GPR_ASSERT(!t->parsing_active);
@@ -1113,11 +1125,13 @@ static void recv_data(grpc_exec_ctx *exec_ctx, void *tp, int success) {
                                      &t->parsing_stream_map);
     grpc_chttp2_prepare_to_read(&t->global, &t->parsing);
     gpr_mu_unlock(&t->mu);
+    GPR_TIMER_BEGIN("recv_data.parse", 0);
     for (; i < t->read_buffer.count &&
                grpc_chttp2_perform_read(exec_ctx, &t->parsing,
                                         t->read_buffer.slices[i]);
          i++)
       ;
+    GPR_TIMER_END("recv_data.parse", 0);
     gpr_mu_lock(&t->mu);
     if (i != t->read_buffer.count) {
       drop_connection(exec_ctx, t);
@@ -1154,6 +1168,8 @@ static void recv_data(grpc_exec_ctx *exec_ctx, void *tp, int success) {
   } else {
     UNREF_TRANSPORT(exec_ctx, t, "recv_data");
   }
+
+  GPR_TIMER_END("recv_data", 0);
 }
 
 /*
diff --git a/src/core/transport/stream_op.c b/src/core/transport/stream_op.c
index 1cb2bd7c598558e2b029d35ac92c2b8d131a13f1..6493e77bc516c186fcb13ac77f91427703e6a1d8 100644
--- a/src/core/transport/stream_op.c
+++ b/src/core/transport/stream_op.c
@@ -38,6 +38,8 @@
 #include <grpc/support/alloc.h>
 #include <grpc/support/log.h>
 
+#include "src/core/profiling/timers.h"
+
 /* Exponential growth function: Given x, return a larger x.
    Currently we grow by 1.5 times upon reallocation. */
 #define GROW(x) (3 * (x) / 2)
@@ -300,6 +302,8 @@ void grpc_metadata_batch_filter(grpc_metadata_batch *batch,
   grpc_linked_mdelem *l;
   grpc_linked_mdelem *next;
 
+  GPR_TIMER_BEGIN("grpc_metadata_batch_filter", 0);
+
   assert_valid_list(&batch->list);
   assert_valid_list(&batch->garbage);
   for (l = batch->list.head; l; l = next) {
@@ -328,4 +332,6 @@ void grpc_metadata_batch_filter(grpc_metadata_batch *batch,
   }
   assert_valid_list(&batch->list);
   assert_valid_list(&batch->garbage);
+
+  GPR_TIMER_END("grpc_metadata_batch_filter", 0);
 }
diff --git a/src/core/tsi/fake_transport_security.c b/src/core/tsi/fake_transport_security.c
index cbb6f17ae185911bab0a69abe5db3f910488f744..99e28ab63b2d6eb1032cbd8b64b92c197602ea3a 100644
--- a/src/core/tsi/fake_transport_security.c
+++ b/src/core/tsi/fake_transport_security.c
@@ -118,10 +118,10 @@ static gpr_uint32 load32_little_endian(const unsigned char *buf) {
 }
 
 static void store32_little_endian(gpr_uint32 value, unsigned char *buf) {
-  buf[3] = (unsigned char)(value >> 24) & 0xFF;
-  buf[2] = (unsigned char)(value >> 16) & 0xFF;
-  buf[1] = (unsigned char)(value >> 8) & 0xFF;
-  buf[0] = (unsigned char)(value)&0xFF;
+  buf[3] = (unsigned char)((value >> 24) & 0xFF);
+  buf[2] = (unsigned char)((value >> 16) & 0xFF);
+  buf[1] = (unsigned char)((value >> 8) & 0xFF);
+  buf[0] = (unsigned char)((value)&0xFF);
 }
 
 static void tsi_fake_frame_reset(tsi_fake_frame *frame, int needs_draining) {
diff --git a/src/core/tsi/ssl_transport_security.c b/src/core/tsi/ssl_transport_security.c
index 05789f07d497434ecda33b5baf98c5dc34fb5599..22b57964ccabb295a5c37e00bd3814c74602de26 100644
--- a/src/core/tsi/ssl_transport_security.c
+++ b/src/core/tsi/ssl_transport_security.c
@@ -319,8 +319,9 @@ static tsi_result peer_from_x509(X509 *cert, int include_certificate_type,
   /* TODO(jboeuf): Maybe add more properties. */
   GENERAL_NAMES *subject_alt_names =
       X509_get_ext_d2i(cert, NID_subject_alt_name, 0, 0);
-  int subject_alt_name_count =
-      (subject_alt_names != NULL) ? sk_GENERAL_NAME_num(subject_alt_names) : 0;
+  int subject_alt_name_count = (subject_alt_names != NULL)
+                                   ? (int)sk_GENERAL_NAME_num(subject_alt_names)
+                                   : 0;
   size_t property_count;
   tsi_result result;
   GPR_ASSERT(subject_alt_name_count >= 0);
@@ -358,7 +359,7 @@ static void log_ssl_error_stack(void) {
   unsigned long err;
   while ((err = ERR_get_error()) != 0) {
     char details[256];
-    ERR_error_string_n(err, details, sizeof(details));
+    ERR_error_string_n((uint32_t)err, details, sizeof(details));
     gpr_log(GPR_ERROR, "%s", details);
   }
 }
@@ -668,7 +669,7 @@ static tsi_result ssl_protector_protect(tsi_frame_protector *self,
   tsi_result result = TSI_OK;
 
   /* First see if we have some pending data in the SSL BIO. */
-  int pending_in_ssl = BIO_pending(impl->from_ssl);
+  int pending_in_ssl = (int)BIO_pending(impl->from_ssl);
   if (pending_in_ssl > 0) {
     *unprotected_bytes_size = 0;
     GPR_ASSERT(*protected_output_frames_size <= INT_MAX);
@@ -726,7 +727,7 @@ static tsi_result ssl_protector_protect_flush(
     impl->buffer_offset = 0;
   }
 
-  pending = BIO_pending(impl->from_ssl);
+  pending = (int)BIO_pending(impl->from_ssl);
   GPR_ASSERT(pending >= 0);
   *still_pending_size = (size_t)pending;
   if (*still_pending_size == 0) return TSI_OK;
@@ -739,7 +740,7 @@ static tsi_result ssl_protector_protect_flush(
     return TSI_INTERNAL_ERROR;
   }
   *protected_output_frames_size = (size_t)read_from_ssl;
-  pending = BIO_pending(impl->from_ssl);
+  pending = (int)BIO_pending(impl->from_ssl);
   GPR_ASSERT(pending >= 0);
   *still_pending_size = (size_t)pending;
   return TSI_OK;
diff --git a/src/cpp/client/channel.cc b/src/cpp/client/channel.cc
index dc8e3046648fae1acdb799e0ccf4ff75008cf091..c7974d655bfc574ee958ea4b089289dd4e3d91f7 100644
--- a/src/cpp/client/channel.cc
+++ b/src/cpp/client/channel.cc
@@ -78,7 +78,6 @@ Call Channel::CreateCall(const RpcMethod& method, ClientContext* context,
                                       context->raw_deadline(), nullptr);
   }
   grpc_census_call_set_context(c_call, context->census_context());
-  GRPC_TIMER_MARK(GRPC_PTAG_CPP_CALL_CREATED, c_call);
   context->set_call(c_call, shared_from_this());
   return Call(c_call, this, cq);
 }
@@ -87,11 +86,9 @@ void Channel::PerformOpsOnCall(CallOpSetInterface* ops, Call* call) {
   static const size_t MAX_OPS = 8;
   size_t nops = 0;
   grpc_op cops[MAX_OPS];
-  GRPC_TIMER_BEGIN(GRPC_PTAG_CPP_PERFORM_OPS, call->call());
   ops->FillOps(cops, &nops);
   GPR_ASSERT(GRPC_CALL_OK ==
              grpc_call_start_batch(call->call(), cops, nops, ops, nullptr));
-  GRPC_TIMER_END(GRPC_PTAG_CPP_PERFORM_OPS, call->call());
 }
 
 void* Channel::RegisterMethod(const char* method) {
diff --git a/src/cpp/proto/proto_utils.cc b/src/cpp/proto/proto_utils.cc
index 4131fbe5e50d310973b192b3e6b9965dcbe2a81c..b1330fde7f6541ddd55cfb9fac841228f3d45383 100644
--- a/src/cpp/proto/proto_utils.cc
+++ b/src/cpp/proto/proto_utils.cc
@@ -42,6 +42,8 @@
 #include <grpc/support/port_platform.h>
 #include <grpc++/support/config.h>
 
+#include "src/core/profiling/timers.h"
+
 const int kMaxBufferLength = 8192;
 
 class GrpcBufferWriter GRPC_FINAL
@@ -158,6 +160,7 @@ namespace grpc {
 
 Status SerializeProto(const grpc::protobuf::Message& msg,
                       grpc_byte_buffer** bp) {
+  GPR_TIMER_SCOPE("SerializeProto", 0);
   int byte_size = msg.ByteSize();
   if (byte_size <= kMaxBufferLength) {
     gpr_slice slice = gpr_slice_malloc(byte_size);
@@ -176,6 +179,7 @@ Status SerializeProto(const grpc::protobuf::Message& msg,
 
 Status DeserializeProto(grpc_byte_buffer* buffer, grpc::protobuf::Message* msg,
                         int max_message_size) {
+  GPR_TIMER_SCOPE("DeserializeProto", 0);
   if (!buffer) {
     return Status(StatusCode::INTERNAL, "No payload");
   }
diff --git a/src/cpp/server/server.cc b/src/cpp/server/server.cc
index a44e1d202503415ca0eb711ab985e09f73697254..f5063a079e184097d745001df5bc009c1b610e52 100644
--- a/src/cpp/server/server.cc
+++ b/src/cpp/server/server.cc
@@ -153,8 +153,7 @@ class Server::SyncRequest GRPC_FINAL : public CompletionQueueTag {
         GPR_ASSERT((*req)->in_flight_);
         return true;
     }
-    gpr_log(GPR_ERROR, "Should never reach here");
-    abort();
+    GPR_UNREACHABLE_CODE(return false);
   }
 
   void SetupRequest() { cq_ = grpc_completion_queue_create(nullptr); }
@@ -541,6 +540,7 @@ void Server::ScheduleCallback() {
 void Server::RunRpc() {
   // Wait for one more incoming rpc.
   bool ok;
+  GPR_TIMER_SCOPE("Server::RunRpc", 0);
   auto* mrd = SyncRequest::Wait(&cq_, &ok);
   if (mrd) {
     ScheduleCallback();
@@ -556,6 +556,7 @@ void Server::RunRpc() {
           mrd->TeardownRequest();
         }
       }
+      GPR_TIMER_SCOPE("cd.Run()", 0);
       cd.Run();
     }
   }
diff --git a/src/csharp/Grpc.Auth/AuthInterceptors.cs b/src/csharp/Grpc.Auth/GoogleAuthInterceptors.cs
similarity index 70%
rename from src/csharp/Grpc.Auth/AuthInterceptors.cs
rename to src/csharp/Grpc.Auth/GoogleAuthInterceptors.cs
index c8ab4d9af6f8966b6dcc1354ee1da6c02954adfc..1c14c5bb5b44634c76cf40915bd1928becd04670 100644
--- a/src/csharp/Grpc.Auth/AuthInterceptors.cs
+++ b/src/csharp/Grpc.Auth/GoogleAuthInterceptors.cs
@@ -41,40 +41,38 @@ using Grpc.Core.Utils;
 namespace Grpc.Auth
 {
     /// <summary>
-    /// Factory methods to create authorization interceptors. Interceptors created can be registered with gRPC client classes (autogenerated client stubs that
-    /// inherit from <see cref="Grpc.Core.ClientBase"/>).
+    /// Factory methods to create authorization interceptors for Google credentials.
+    /// <seealso cref="GoogleGrpcCredentials"/>
     /// </summary>
-    public static class AuthInterceptors
+    public static class GoogleAuthInterceptors
     {
         private const string AuthorizationHeader = "Authorization";
         private const string Schema = "Bearer";
 
         /// <summary>
-        /// Creates interceptor that will obtain access token from any credential type that implements
+        /// Creates an <see cref="AsyncAuthInterceptor"/> that will obtain access token from any credential type that implements
         /// <c>ITokenAccess</c>. (e.g. <c>GoogleCredential</c>).
         /// </summary>
         /// <param name="credential">The credential to use to obtain access tokens.</param>
-        /// <returns>The header interceptor.</returns>
-        public static HeaderInterceptor FromCredential(ITokenAccess credential)
+        /// <returns>The interceptor.</returns>
+        public static AsyncAuthInterceptor FromCredential(ITokenAccess credential)
         {
-            return new HeaderInterceptor((method, authUri, metadata) =>
+            return new AsyncAuthInterceptor(async (authUri, metadata) =>
             {
-                // TODO(jtattermusch): Rethink synchronous wait to obtain the result.
-                var accessToken = credential.GetAccessTokenForRequestAsync(authUri, CancellationToken.None)
-                        .ConfigureAwait(false).GetAwaiter().GetResult();
+                var accessToken = await credential.GetAccessTokenForRequestAsync(authUri, CancellationToken.None).ConfigureAwait(false);
                 metadata.Add(CreateBearerTokenHeader(accessToken));
             });
         }
 
         /// <summary>
-        /// Creates OAuth2 interceptor that will use given access token as authorization.
+        /// Creates an <see cref="AsyncAuthInterceptor"/> that will use given access token as authorization.
         /// </summary>
         /// <param name="accessToken">OAuth2 access token.</param>
-        /// <returns>The header interceptor.</returns>
-        public static HeaderInterceptor FromAccessToken(string accessToken)
+        /// <returns>The interceptor.</returns>
+        public static AsyncAuthInterceptor FromAccessToken(string accessToken)
         {
             Preconditions.CheckNotNull(accessToken);
-            return new HeaderInterceptor((method, authUri, metadata) =>
+            return new AsyncAuthInterceptor(async (authUri, metadata) =>
             {
                 metadata.Add(CreateBearerTokenHeader(accessToken));
             });
diff --git a/src/csharp/Grpc.Auth/GoogleGrpcCredentials.cs b/src/csharp/Grpc.Auth/GoogleGrpcCredentials.cs
new file mode 100644
index 0000000000000000000000000000000000000000..a1e7db13bdf353cf1319a7fc1a0bfda48c8e803e
--- /dev/null
+++ b/src/csharp/Grpc.Auth/GoogleGrpcCredentials.cs
@@ -0,0 +1,96 @@
+#region Copyright notice and license
+
+// Copyright 2015, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+
+using Google.Apis.Auth.OAuth2;
+using Grpc.Core;
+using Grpc.Core.Utils;
+
+namespace Grpc.Auth
+{
+    /// <summary>
+    /// Factory/extension methods to create instances of <see cref="ChannelCredentials"/> and <see cref="CallCredentials"/> classes
+    /// based on credential objects originating from Google auth library.
+    /// </summary>
+    public static class GoogleGrpcCredentials
+    {
+        /// <summary>
+        /// Retrieves an instance of Google's Application Default Credentials using
+        /// <c>GoogleCredential.GetApplicationDefaultAsync()</c> and converts them
+        /// into a gRPC <see cref="ChannelCredentials"/> that use the default SSL credentials.
+        /// </summary>
+        /// <returns>The <c>ChannelCredentials</c> instance.</returns>
+        public static async Task<ChannelCredentials> GetApplicationDefaultAsync()
+        {
+            var googleCredential = await GoogleCredential.GetApplicationDefaultAsync().ConfigureAwait(false);
+            return googleCredential.ToChannelCredentials();
+        }
+
+        /// <summary>
+        /// Creates an instance of <see cref="CallCredentials"/> that will use given access token to authenticate
+        /// with a gRPC service.
+        /// </summary>
+        /// <param name="accessToken">OAuth2 access token.</param>
+        /// /// <returns>The <c>MetadataCredentials</c> instance.</returns>
+        public static CallCredentials FromAccessToken(string accessToken)
+        {
+            return CallCredentials.FromInterceptor(GoogleAuthInterceptors.FromAccessToken(accessToken));
+        }
+
+        /// <summary>
+        /// Converts a <c>ITokenAccess</c> (e.g. <c>GoogleCredential</c>) object
+        /// into a gRPC <see cref="CallCredentials"/> object.
+        /// </summary>
+        /// <param name="credential">The credential to use to obtain access tokens.</param>
+        /// <returns>The <c>CallCredentials</c> instance.</returns>
+        public static CallCredentials ToCallCredentials(this ITokenAccess credential)
+        {
+            return CallCredentials.FromInterceptor(GoogleAuthInterceptors.FromCredential(credential));
+        }
+
+        /// <summary>
+        /// Converts a <c>ITokenAccess</c> (e.g. <c>GoogleCredential</c>) object
+        /// into a gRPC <see cref="ChannelCredentials"/> object.
+        /// Default SSL credentials are used.
+        /// </summary>
+        /// <param name="googleCredential">The credential to use to obtain access tokens.</param>
+        /// <returns>>The <c>ChannelCredentials</c> instance.</returns>
+        public static ChannelCredentials ToChannelCredentials(this ITokenAccess googleCredential)
+        {
+            return ChannelCredentials.Create(new SslCredentials(), googleCredential.ToCallCredentials());
+        }
+    }
+}
diff --git a/src/csharp/Grpc.Auth/Grpc.Auth.csproj b/src/csharp/Grpc.Auth/Grpc.Auth.csproj
index 4fb087d4a342686c0acc4d75da04ea22240e851a..55bde6e194234566750ac5df30661789b2e112e7 100644
--- a/src/csharp/Grpc.Auth/Grpc.Auth.csproj
+++ b/src/csharp/Grpc.Auth/Grpc.Auth.csproj
@@ -78,8 +78,9 @@
     <Compile Include="..\Grpc.Core\Version.cs">
       <Link>Version.cs</Link>
     </Compile>
+    <Compile Include="GoogleGrpcCredentials.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="AuthInterceptors.cs" />
+    <Compile Include="GoogleAuthInterceptors.cs" />
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <ItemGroup>
diff --git a/src/csharp/Grpc.Core.Tests/ClientBaseTest.cs b/src/csharp/Grpc.Core.Tests/CallCredentialsTest.cs
similarity index 66%
rename from src/csharp/Grpc.Core.Tests/ClientBaseTest.cs
rename to src/csharp/Grpc.Core.Tests/CallCredentialsTest.cs
index 2dc10ebe971a2c536bda5dc903b93e23f2b9c389..82f881969ebf5496f976c3158d783bd9ae1aec73 100644
--- a/src/csharp/Grpc.Core.Tests/ClientBaseTest.cs
+++ b/src/csharp/Grpc.Core.Tests/CallCredentialsTest.cs
@@ -32,6 +32,10 @@
 #endregion
 
 using System;
+using System.Diagnostics;
+using System.Runtime.InteropServices;
+using System.Threading;
+using System.Threading.Tasks;
 using Grpc.Core;
 using Grpc.Core.Internal;
 using Grpc.Core.Utils;
@@ -39,24 +43,23 @@ using NUnit.Framework;
 
 namespace Grpc.Core.Tests
 {
-    public class ClientBaseTest
+    public class CallCredentialsTest
     {
         [Test]
-        public void GetAuthUriBase_Valid()
+        public void CallCredentials_ComposeAtLeastTwo()
         {
-            Assert.AreEqual("https://some.googleapi.com/", ClientBase.GetAuthUriBase("some.googleapi.com"));
-            Assert.AreEqual("https://some.googleapi.com/", ClientBase.GetAuthUriBase("dns:///some.googleapi.com/"));
-            Assert.AreEqual("https://some.googleapi.com/", ClientBase.GetAuthUriBase("dns:///some.googleapi.com:443/"));
-            Assert.AreEqual("https://some.googleapi.com/", ClientBase.GetAuthUriBase("some.googleapi.com:443/"));
+            Assert.Throws(typeof(ArgumentException), () => CallCredentials.Compose(new FakeCallCredentials()));
         }
 
         [Test]
-        public void GetAuthUriBase_Invalid()
+        public void CallCredentials_ToNativeCredentials()
         {
-            Assert.IsNull(ClientBase.GetAuthUriBase("some.googleapi.com:"));
-            Assert.IsNull(ClientBase.GetAuthUriBase("https://some.googleapi.com/"));
-            Assert.IsNull(ClientBase.GetAuthUriBase("dns://some.googleapi.com:443"));  // just two slashes
-            Assert.IsNull(ClientBase.GetAuthUriBase(""));
+            var composite = CallCredentials.Compose(
+                CallCredentials.FromInterceptor(async (uri, m) => { await Task.Delay(1); }),
+                CallCredentials.FromInterceptor(async (uri, m) => { await Task.Delay(2); }));
+            using (var nativeComposite = composite.ToNativeCredentials())
+            {
+            }
         }
     }
 }
diff --git a/src/node/interop/empty.proto b/src/csharp/Grpc.Core.Tests/ChannelCredentialsTest.cs
similarity index 55%
rename from src/node/interop/empty.proto
rename to src/csharp/Grpc.Core.Tests/ChannelCredentialsTest.cs
index 6d0eb937d674ca3ee9aaf9c2ed8313250cd76647..d5315ed39b40da3dd5c706d27fa3aef2a87c28d8 100644
--- a/src/node/interop/empty.proto
+++ b/src/csharp/Grpc.Core.Tests/ChannelCredentialsTest.cs
@@ -1,3 +1,4 @@
+#region Copyright notice and license
 
 // Copyright 2015, Google Inc.
 // All rights reserved.
@@ -28,16 +29,39 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-syntax = "proto3";
+#endregion
 
-package grpc.testing;
+using System;
+using System.Diagnostics;
+using System.Runtime.InteropServices;
+using System.Threading;
+using System.Threading.Tasks;
+using Grpc.Core;
+using Grpc.Core.Internal;
+using Grpc.Core.Utils;
+using NUnit.Framework;
 
-// An empty message that you can re-use to avoid defining duplicated empty
-// messages in your project. A typical example is to use it as argument or the
-// return value of a service API. For instance:
-//
-//   service Foo {
-//     rpc Bar (grpc.testing.Empty) returns (grpc.testing.Empty) { };
-//   };
-//
-message Empty {}
+namespace Grpc.Core.Tests
+{
+    public class ChannelCredentialsTest
+    {
+        [Test]
+        public void InsecureCredentials_IsNonComposable()
+        {
+            Assert.IsFalse(ChannelCredentials.Insecure.IsComposable);
+        }
+
+        [Test]
+        public void ChannelCredentials_CreateComposite()
+        {
+            var composite = ChannelCredentials.Create(new FakeChannelCredentials(true), new FakeCallCredentials());
+            Assert.IsFalse(composite.IsComposable);
+
+            Assert.Throws(typeof(ArgumentNullException), () => ChannelCredentials.Create(null, new FakeCallCredentials()));
+            Assert.Throws(typeof(ArgumentNullException), () => ChannelCredentials.Create(new FakeChannelCredentials(true), null));
+            
+            // forbid composing non-composable
+            Assert.Throws(typeof(ArgumentException), () => ChannelCredentials.Create(new FakeChannelCredentials(false), new FakeCallCredentials()));
+        }
+    }
+}
diff --git a/src/csharp/Grpc.Core.Tests/ChannelTest.cs b/src/csharp/Grpc.Core.Tests/ChannelTest.cs
index dfbd92879e7cb969b7f7f9225b5de3bc34d1a8cf..f4ae9abefd803002a91685a86400260b471824bc 100644
--- a/src/csharp/Grpc.Core.Tests/ChannelTest.cs
+++ b/src/csharp/Grpc.Core.Tests/ChannelTest.cs
@@ -44,13 +44,13 @@ namespace Grpc.Core.Tests
         [Test]
         public void Constructor_RejectsInvalidParams()
         {
-            Assert.Throws(typeof(ArgumentNullException), () => new Channel(null, Credentials.Insecure));
+            Assert.Throws(typeof(ArgumentNullException), () => new Channel(null, ChannelCredentials.Insecure));
         }
 
         [Test]
         public void State_IdleAfterCreation()
         {
-            var channel = new Channel("localhost", Credentials.Insecure);
+            var channel = new Channel("localhost", ChannelCredentials.Insecure);
             Assert.AreEqual(ChannelState.Idle, channel.State);
             channel.ShutdownAsync().Wait();
         }
@@ -58,7 +58,7 @@ namespace Grpc.Core.Tests
         [Test]
         public void WaitForStateChangedAsync_InvalidArgument()
         {
-            var channel = new Channel("localhost", Credentials.Insecure);
+            var channel = new Channel("localhost", ChannelCredentials.Insecure);
             Assert.Throws(typeof(ArgumentException), () => channel.WaitForStateChangedAsync(ChannelState.FatalFailure));
             channel.ShutdownAsync().Wait();
         }
@@ -66,7 +66,7 @@ namespace Grpc.Core.Tests
         [Test]
         public void ResolvedTarget()
         {
-            var channel = new Channel("127.0.0.1", Credentials.Insecure);
+            var channel = new Channel("127.0.0.1", ChannelCredentials.Insecure);
             Assert.IsTrue(channel.ResolvedTarget.Contains("127.0.0.1"));
             channel.ShutdownAsync().Wait();
         }
@@ -74,7 +74,7 @@ namespace Grpc.Core.Tests
         [Test]
         public void Shutdown_AllowedOnlyOnce()
         {
-            var channel = new Channel("localhost", Credentials.Insecure);
+            var channel = new Channel("localhost", ChannelCredentials.Insecure);
             channel.ShutdownAsync().Wait();
             Assert.Throws(typeof(InvalidOperationException), () => channel.ShutdownAsync().GetAwaiter().GetResult());
         }
diff --git a/src/node/examples/stock.proto b/src/csharp/Grpc.Core.Tests/FakeCredentials.cs
similarity index 62%
rename from src/node/examples/stock.proto
rename to src/csharp/Grpc.Core.Tests/FakeCredentials.cs
index 5ee2bcbce66cbc72ad3bb2d533c634c0c1b8c8ad..87d55cd276ae5601b84a1dd3b7db97dd4aac5fe7 100644
--- a/src/node/examples/stock.proto
+++ b/src/csharp/Grpc.Core.Tests/FakeCredentials.cs
@@ -1,3 +1,5 @@
+#region Copyright notice and license
+
 // Copyright 2015, Google Inc.
 // All rights reserved.
 //
@@ -27,36 +29,45 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-syntax = "proto3";
+#endregion
 
-package examples;
+using System;
+using System.Diagnostics;
+using System.Runtime.InteropServices;
+using System.Threading;
+using System.Threading.Tasks;
+using Grpc.Core;
+using Grpc.Core.Internal;
+using Grpc.Core.Utils;
+using NUnit.Framework;
 
-// Protocol type definitions
-message StockRequest {
-  string symbol = 1;
-  int32 num_trades_to_watch = 2;
-}
+namespace Grpc.Core.Tests
+{
+    internal class FakeChannelCredentials : ChannelCredentials
+    {
+        readonly bool composable;
 
-message StockReply {
-  float price = 1;
-  string symbol = 2;
-}
+        public FakeChannelCredentials(bool composable)
+        {
+            this.composable = composable;
+        }
 
+        internal override bool IsComposable
+        {
+            get { return composable; }
+        }
 
-// Interface exported by the server
-service Stock {
-  // Simple blocking RPC
-  rpc GetLastTradePrice(StockRequest) returns (StockReply) {
-  }
-  // Bidirectional streaming RPC
-  rpc GetLastTradePriceMultiple(stream StockRequest) returns
-    (stream StockReply) {
-  }
-  // Unidirectional server-to-client streaming RPC
-  rpc WatchFutureTrades(StockRequest) returns (stream StockReply) {
-  }
-  // Unidirectional client-to-server streaming RPC
-  rpc GetHighestTradePrice(stream StockRequest) returns (StockReply) {
-  }
+        internal override CredentialsSafeHandle ToNativeCredentials()
+        {
+            return null;
+        }
+    }
 
+    internal class FakeCallCredentials : CallCredentials
+    {
+        internal override CredentialsSafeHandle ToNativeCredentials()
+        {
+            return null;
+        }
+    }
 }
diff --git a/src/csharp/Grpc.Core.Tests/Grpc.Core.Tests.csproj b/src/csharp/Grpc.Core.Tests/Grpc.Core.Tests.csproj
index f730936062daa1efeec6c00c425a27cbcde9a25d..91d072ababecdd6360923320f302fd7a086b74a2 100644
--- a/src/csharp/Grpc.Core.Tests/Grpc.Core.Tests.csproj
+++ b/src/csharp/Grpc.Core.Tests/Grpc.Core.Tests.csproj
@@ -63,8 +63,10 @@
     <Compile Include="..\Grpc.Core\Version.cs">
       <Link>Version.cs</Link>
     </Compile>
-    <Compile Include="ClientBaseTest.cs" />
+    <Compile Include="CallCredentialsTest.cs" />
+    <Compile Include="FakeCredentials.cs" />
     <Compile Include="MarshallingErrorsTest.cs" />
+    <Compile Include="ChannelCredentialsTest.cs" />
     <Compile Include="ShutdownTest.cs" />
     <Compile Include="Internal\AsyncCallTest.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
diff --git a/src/csharp/Grpc.Core.Tests/Internal/AsyncCallTest.cs b/src/csharp/Grpc.Core.Tests/Internal/AsyncCallTest.cs
index 685c5f7d6cb7a314cbfdee015e07ed79cd1a5efd..246072bff1305cc605e671fa3c766eb5d235acb7 100644
--- a/src/csharp/Grpc.Core.Tests/Internal/AsyncCallTest.cs
+++ b/src/csharp/Grpc.Core.Tests/Internal/AsyncCallTest.cs
@@ -49,7 +49,7 @@ namespace Grpc.Core.Internal.Tests
         [SetUp]
         public void Init()
         {
-            channel = new Channel("localhost", Credentials.Insecure);
+            channel = new Channel("localhost", ChannelCredentials.Insecure);
 
             fakeCall = new FakeNativeCall();
 
diff --git a/src/csharp/Grpc.Core.Tests/MarshallingErrorsTest.cs b/src/csharp/Grpc.Core.Tests/MarshallingErrorsTest.cs
index 83707e0c6da91c35da05d321341a6617537925d0..37fb36946aff1a3d8a5fce783eb94ea72e50e9bc 100644
--- a/src/csharp/Grpc.Core.Tests/MarshallingErrorsTest.cs
+++ b/src/csharp/Grpc.Core.Tests/MarshallingErrorsTest.cs
@@ -119,7 +119,7 @@ namespace Grpc.Core.Tests
         [Test]
         public void RequestParsingError_UnaryRequest()
         {
-            helper.UnaryHandler = new  UnaryServerMethod<string, string>((request, context) =>
+            helper.UnaryHandler = new UnaryServerMethod<string, string>((request, context) =>
             {
                 return Task.FromResult("RESPONSE");
             });
@@ -161,7 +161,7 @@ namespace Grpc.Core.Tests
         {
             helper.ClientStreamingHandler = new ClientStreamingServerMethod<string, string>(async (requestStream, context) =>
             {
-                CollectionAssert.AreEqual(new [] {"A", "B"}, await requestStream.ToListAsync());
+                CollectionAssert.AreEqual(new[] { "A", "B" }, await requestStream.ToListAsync());
                 return "RESPONSE";
             });
             var call = Calls.AsyncClientStreamingCall(helper.CreateClientStreamingCall());
diff --git a/src/csharp/Grpc.Core.Tests/MockServiceHelper.cs b/src/csharp/Grpc.Core.Tests/MockServiceHelper.cs
index 765732c7687eaa7a34e490cc6ad93c450fad5f9c..567e04eddccbc4cf95d1a11b79267ca1571fae23 100644
--- a/src/csharp/Grpc.Core.Tests/MockServiceHelper.cs
+++ b/src/csharp/Grpc.Core.Tests/MockServiceHelper.cs
@@ -154,7 +154,7 @@ namespace Grpc.Core.Tests
         {
             if (channel == null)
             {
-                channel = new Channel(Host, GetServer().Ports.Single().BoundPort, Credentials.Insecure);
+                channel = new Channel(Host, GetServer().Ports.Single().BoundPort, ChannelCredentials.Insecure);
             }
             return channel;
         }
diff --git a/src/csharp/Grpc.Core.Tests/PInvokeTest.cs b/src/csharp/Grpc.Core.Tests/PInvokeTest.cs
index 714c2f7494cc3aa071d43dcb1142d56f504543b1..073c502daf3f7583b9cd28f35ae4944d09a29ab4 100644
--- a/src/csharp/Grpc.Core.Tests/PInvokeTest.cs
+++ b/src/csharp/Grpc.Core.Tests/PInvokeTest.cs
@@ -60,7 +60,7 @@ namespace Grpc.Core.Tests
         public void CompletionQueueCreateDestroyBenchmark()
         {
             BenchmarkUtil.RunBenchmark(
-                100000, 1000000,
+                10, 10,
                 () =>
                 {
                     CompletionQueueSafeHandle cq = CompletionQueueSafeHandle.Create();
diff --git a/src/csharp/Grpc.Core/CallCredentials.cs b/src/csharp/Grpc.Core/CallCredentials.cs
new file mode 100644
index 0000000000000000000000000000000000000000..400a9825de220029cb0d2e5fbf39acf4345f2041
--- /dev/null
+++ b/src/csharp/Grpc.Core/CallCredentials.cs
@@ -0,0 +1,152 @@
+#region Copyright notice and license
+
+// Copyright 2015, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+
+using Grpc.Core.Internal;
+using Grpc.Core.Utils;
+
+namespace Grpc.Core
+{
+    /// <summary>
+    /// Asynchronous authentication interceptor for <see cref="CallCredentials"/>.
+    /// </summary>
+    /// <param name="authUri">URL of a service to which current remote call needs to authenticate</param>
+    /// <param name="metadata">Metadata to populate with entries that will be added to outgoing call's headers.</param>
+    /// <returns></returns>
+    public delegate Task AsyncAuthInterceptor(string authUri, Metadata metadata);
+
+    /// <summary>
+    /// Client-side call credentials. Provide authorization with per-call granularity.
+    /// </summary>
+    public abstract class CallCredentials
+    {
+        /// <summary>
+        /// Composes multiple multiple <c>CallCredentials</c> objects into
+        /// a single <c>CallCredentials</c> object.
+        /// </summary>
+        /// <param name="credentials">credentials to compose</param>
+        /// <returns>The new <c>CompositeCallCredentials</c></returns>
+        public static CallCredentials Compose(params CallCredentials[] credentials)
+        {
+            return new CompositeCallCredentials(credentials);
+        }
+
+        /// <summary>
+        /// Creates a new instance of <c>CallCredentials</c> class from an
+        /// interceptor that can attach metadata to outgoing calls.
+        /// </summary>
+        /// <param name="interceptor">authentication interceptor</param>
+        public static CallCredentials FromInterceptor(AsyncAuthInterceptor interceptor)
+        {
+            return new MetadataCredentials(interceptor);
+        }
+
+        /// <summary>
+        /// Creates native object for the credentials.
+        /// </summary>
+        /// <returns>The native credentials.</returns>
+        internal abstract CredentialsSafeHandle ToNativeCredentials();
+    }
+
+    /// <summary>
+    /// Client-side credentials that delegate metadata based auth to an interceptor.
+    /// The interceptor is automatically invoked for each remote call that uses <c>MetadataCredentials.</c>
+    /// </summary>
+    internal sealed class MetadataCredentials : CallCredentials
+    {
+        readonly AsyncAuthInterceptor interceptor;
+
+        /// <summary>
+        /// Initializes a new instance of <c>MetadataCredentials</c> class.
+        /// </summary>
+        /// <param name="interceptor">authentication interceptor</param>
+        public MetadataCredentials(AsyncAuthInterceptor interceptor)
+        {
+            this.interceptor = Preconditions.CheckNotNull(interceptor);
+        }
+
+        internal override CredentialsSafeHandle ToNativeCredentials()
+        {
+            NativeMetadataCredentialsPlugin plugin = new NativeMetadataCredentialsPlugin(interceptor);
+            return plugin.Credentials;
+        }
+    }
+
+    /// <summary>
+    /// Credentials that allow composing multiple credentials objects into one <see cref="CallCredentials"/> object.
+    /// </summary>
+    internal sealed class CompositeCallCredentials : CallCredentials
+    {
+        readonly List<CallCredentials> credentials;
+
+        /// <summary>
+        /// Initializes a new instance of <c>CompositeCallCredentials</c> class.
+        /// The resulting credentials object will be composite of all the credentials specified as parameters.
+        /// </summary>
+        /// <param name="credentials">credentials to compose</param>
+        public CompositeCallCredentials(params CallCredentials[] credentials)
+        {
+            Preconditions.CheckArgument(credentials.Length >= 2, "Composite credentials object can only be created from 2 or more credentials.");
+            this.credentials = new List<CallCredentials>(credentials);
+        }
+
+        internal override CredentialsSafeHandle ToNativeCredentials()
+        {
+            return ToNativeRecursive(0);
+        }
+
+        // Recursive descent makes managing lifetime of intermediate CredentialSafeHandle instances easier.
+        // In practice, we won't usually see composites from more than two credentials anyway.
+        private CredentialsSafeHandle ToNativeRecursive(int startIndex)
+        {
+            if (startIndex == credentials.Count - 1)
+            {
+                return credentials[startIndex].ToNativeCredentials();
+            }
+
+            using (var cred1 = credentials[startIndex].ToNativeCredentials())
+            using (var cred2 = ToNativeRecursive(startIndex + 1))
+            {
+                var nativeComposite = CredentialsSafeHandle.CreateComposite(cred1, cred2);
+                if (nativeComposite.IsInvalid)
+                {
+                    throw new ArgumentException("Error creating native composite credentials. Likely, this is because you are trying to compose incompatible credentials.");
+                }
+                return nativeComposite;
+            }
+        }
+    }
+}
diff --git a/src/csharp/Grpc.Core/CallOptions.cs b/src/csharp/Grpc.Core/CallOptions.cs
index c3bc9c31564753582c156b54a169353c8662430e..c0f94c63c2f01bc3853fd7b42f55b2f6812a1d94 100644
--- a/src/csharp/Grpc.Core/CallOptions.cs
+++ b/src/csharp/Grpc.Core/CallOptions.cs
@@ -49,6 +49,7 @@ namespace Grpc.Core
         CancellationToken cancellationToken;
         WriteOptions writeOptions;
         ContextPropagationToken propagationToken;
+        CallCredentials credentials;
 
         /// <summary>
         /// Creates a new instance of <c>CallOptions</c> struct.
@@ -58,14 +59,16 @@ namespace Grpc.Core
         /// <param name="cancellationToken">Can be used to request cancellation of the call.</param>
         /// <param name="writeOptions">Write options that will be used for this call.</param>
         /// <param name="propagationToken">Context propagation token obtained from <see cref="ServerCallContext"/>.</param>
+        /// <param name="credentials">Credentials to use for this call.</param>
         public CallOptions(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken),
-                           WriteOptions writeOptions = null, ContextPropagationToken propagationToken = null)
+                           WriteOptions writeOptions = null, ContextPropagationToken propagationToken = null, CallCredentials credentials = null)
         {
             this.headers = headers;
             this.deadline = deadline;
             this.cancellationToken = cancellationToken;
             this.writeOptions = writeOptions;
             this.propagationToken = propagationToken;
+            this.credentials = credentials;
         }
 
         /// <summary>
@@ -114,6 +117,17 @@ namespace Grpc.Core
             }
         }
 
+        /// <summary>
+        /// Credentials to use for this call.
+        /// </summary>
+        public CallCredentials Credentials
+        {
+            get
+            {
+                return this.credentials;
+            }
+        }
+
         /// <summary>
         /// Returns new instance of <see cref="CallOptions"/> with
         /// <c>Headers</c> set to the value provided. Values of all other fields are preserved.
diff --git a/src/csharp/Grpc.Core/Channel.cs b/src/csharp/Grpc.Core/Channel.cs
index f1942727cde48a9837a533332e7f9a34bcd3aac1..6b99055d4c893cb7b92d703d11b4bdbc2360fb71 100644
--- a/src/csharp/Grpc.Core/Channel.cs
+++ b/src/csharp/Grpc.Core/Channel.cs
@@ -68,7 +68,7 @@ namespace Grpc.Core
         /// <param name="target">Target of the channel.</param>
         /// <param name="credentials">Credentials to secure the channel.</param>
         /// <param name="options">Channel options.</param>
-        public Channel(string target, Credentials credentials, IEnumerable<ChannelOption> options = null)
+        public Channel(string target, ChannelCredentials credentials, IEnumerable<ChannelOption> options = null)
         {
             this.target = Preconditions.CheckNotNull(target, "target");
             this.environment = GrpcEnvironment.AddRef();
@@ -96,7 +96,7 @@ namespace Grpc.Core
         /// <param name="port">The port.</param>
         /// <param name="credentials">Credentials to secure the channel.</param>
         /// <param name="options">Channel options.</param>
-        public Channel(string host, int port, Credentials credentials, IEnumerable<ChannelOption> options = null) :
+        public Channel(string host, int port, ChannelCredentials credentials, IEnumerable<ChannelOption> options = null) :
             this(string.Format("{0}:{1}", host, port), credentials, options)
         {
         }
diff --git a/src/csharp/Grpc.Core/Credentials.cs b/src/csharp/Grpc.Core/ChannelCredentials.cs
similarity index 56%
rename from src/csharp/Grpc.Core/Credentials.cs
rename to src/csharp/Grpc.Core/ChannelCredentials.cs
index 4fcac0c4c00e97d6c5c25390ee1027c8912e8c0a..9d2bcdabe843abc2799d04fcdf7d581de37cbe62 100644
--- a/src/csharp/Grpc.Core/Credentials.cs
+++ b/src/csharp/Grpc.Core/ChannelCredentials.cs
@@ -32,22 +32,26 @@
 #endregion
 
 using System;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+
 using Grpc.Core.Internal;
+using Grpc.Core.Utils;
 
 namespace Grpc.Core
 {
     /// <summary>
-    /// Client-side credentials. Used for creation of a secure channel.
+    /// Client-side channel credentials. Used for creation of a secure channel.
     /// </summary>
-    public abstract class Credentials
+    public abstract class ChannelCredentials
     {
-        static readonly Credentials InsecureInstance = new InsecureCredentialsImpl();
+        static readonly ChannelCredentials InsecureInstance = new InsecureCredentialsImpl();
 
         /// <summary>
-        /// Returns instance of credential that provides no security and 
+        /// Returns instance of credentials that provides no security and 
         /// will result in creating an unsecure channel with no encryption whatsoever.
         /// </summary>
-        public static Credentials Insecure
+        public static ChannelCredentials Insecure
         {
             get
             {
@@ -55,6 +59,18 @@ namespace Grpc.Core
             }
         }
 
+        /// <summary>
+        /// Creates a new instance of <c>ChannelCredentials</c> class by composing
+        /// given channel credentials with call credentials.
+        /// </summary>
+        /// <param name="channelCredentials">Channel credentials.</param>
+        /// <param name="callCredentials">Call credentials.</param>
+        /// <returns>The new composite <c>ChannelCredentials</c></returns>
+        public static ChannelCredentials Create(ChannelCredentials channelCredentials, CallCredentials callCredentials)
+        {
+            return new CompositeChannelCredentials(channelCredentials, callCredentials);
+        }
+
         /// <summary>
         /// Creates native object for the credentials. May return null if insecure channel
         /// should be created.
@@ -62,7 +78,15 @@ namespace Grpc.Core
         /// <returns>The native credentials.</returns>
         internal abstract CredentialsSafeHandle ToNativeCredentials();
 
-        private sealed class InsecureCredentialsImpl : Credentials
+        /// <summary>
+        /// Returns <c>true</c> if this credential type allows being composed by <c>CompositeCredentials</c>.
+        /// </summary>
+        internal virtual bool IsComposable
+        {
+            get { return false; }
+        }
+
+        private sealed class InsecureCredentialsImpl : ChannelCredentials
         {
             internal override CredentialsSafeHandle ToNativeCredentials()
             {
@@ -74,7 +98,7 @@ namespace Grpc.Core
     /// <summary>
     /// Client-side SSL credentials.
     /// </summary>
-    public sealed class SslCredentials : Credentials
+    public sealed class SslCredentials : ChannelCredentials
     {
         readonly string rootCertificates;
         readonly KeyCertificatePair keyCertificatePair;
@@ -130,9 +154,52 @@ namespace Grpc.Core
             }
         }
 
+        // Composing composite makes no sense.
+        internal override bool IsComposable
+        {
+            get { return true; }
+        }
+
         internal override CredentialsSafeHandle ToNativeCredentials()
         {
             return CredentialsSafeHandle.CreateSslCredentials(rootCertificates, keyCertificatePair);
         }
     }
+
+    /// <summary>
+    /// Credentials that allow composing one <see cref="ChannelCredentials"/> object and 
+    /// one or more <see cref="CallCredentials"/> objects into a single <see cref="ChannelCredentials"/>.
+    /// </summary>
+    internal sealed class CompositeChannelCredentials : ChannelCredentials
+    {
+        readonly ChannelCredentials channelCredentials;
+        readonly CallCredentials callCredentials;
+
+        /// <summary>
+        /// Initializes a new instance of <c>CompositeChannelCredentials</c> class.
+        /// The resulting credentials object will be composite of all the credentials specified as parameters.
+        /// </summary>
+        /// <param name="channelCredentials">channelCredentials to compose</param>
+        /// <param name="callCredentials">channelCredentials to compose</param>
+        public CompositeChannelCredentials(ChannelCredentials channelCredentials, CallCredentials callCredentials)
+        {
+            this.channelCredentials = Preconditions.CheckNotNull(channelCredentials);
+            this.callCredentials = Preconditions.CheckNotNull(callCredentials);
+            Preconditions.CheckArgument(channelCredentials.IsComposable, "Supplied channel credentials do not allow composition.");
+        }
+
+        internal override CredentialsSafeHandle ToNativeCredentials()
+        {
+            using (var cred1 = channelCredentials.ToNativeCredentials())
+            using (var cred2 = callCredentials.ToNativeCredentials())
+            {
+                var nativeComposite = CredentialsSafeHandle.CreateComposite(cred1, cred2);
+                if (nativeComposite.IsInvalid)
+                {
+                    throw new ArgumentException("Error creating native composite credentials. Likely, this is because you are trying to compose incompatible credentials.");
+                }
+                return nativeComposite;
+            }
+        }
+    }
 }
diff --git a/src/csharp/Grpc.Core/ClientBase.cs b/src/csharp/Grpc.Core/ClientBase.cs
index f4533e735cbc802fbab34ee1766c13b3a5af7c7f..e5b398062b2c489891d38cc71ffee03eb274e059 100644
--- a/src/csharp/Grpc.Core/ClientBase.cs
+++ b/src/csharp/Grpc.Core/ClientBase.cs
@@ -40,18 +40,17 @@ namespace Grpc.Core
     /// <summary>
     /// Interceptor for call headers.
     /// </summary>
-    public delegate void HeaderInterceptor(IMethod method, string authUri, Metadata metadata);
+    /// <remarks>Header interceptor is no longer to recommented way to perform authentication.
+    /// For header (initial metadata) based auth such as OAuth2 or JWT access token, use <see cref="MetadataCredentials"/>.
+    /// </remarks>
+    public delegate void HeaderInterceptor(IMethod method, Metadata metadata);
 
     /// <summary>
     /// Base class for client-side stubs.
     /// </summary>
     public abstract class ClientBase
     {
-        // Regex for removal of the optional DNS scheme, trailing port, and trailing backslash
-        static readonly Regex ChannelTargetPattern = new Regex(@"^(dns:\/{3})?([^:\/]+)(:\d+)?\/?$");
-
         readonly Channel channel;
-        readonly string authUriBase;
 
         /// <summary>
         /// Initializes a new instance of <c>ClientBase</c> class.
@@ -60,13 +59,14 @@ namespace Grpc.Core
         public ClientBase(Channel channel)
         {
             this.channel = channel;
-            this.authUriBase = GetAuthUriBase(channel.Target);
         }
 
         /// <summary>
-        /// Can be used to register a custom header (request metadata) interceptor.
+        /// Can be used to register a custom header interceptor.
         /// The interceptor is invoked each time a new call on this client is started.
+        /// It is not recommented to use header interceptor to add auth headers to RPC calls.
         /// </summary>
+        /// <seealso cref="HeaderInterceptor"/>
         public HeaderInterceptor HeaderInterceptor
         {
             get;
@@ -115,24 +115,9 @@ namespace Grpc.Core
                 {
                     options = options.WithHeaders(new Metadata());
                 }
-                var authUri = authUriBase != null ? authUriBase + method.ServiceName : null;
-                interceptor(method, authUri, options.Headers);
+                interceptor(method, options.Headers);
             }
             return new CallInvocationDetails<TRequest, TResponse>(channel, method, Host, options);
         }
-
-        /// <summary>
-        /// Creates Auth URI base from channel's target (the one passed at channel creation).
-        /// Fully-qualified service name is to be appended to this.
-        /// </summary>
-        internal static string GetAuthUriBase(string target)
-        {
-            var match = ChannelTargetPattern.Match(target);
-            if (!match.Success)
-            {
-                return null;
-            }
-            return "https://" + match.Groups[2].Value + "/";
-        }
     }
 }
diff --git a/src/csharp/Grpc.Core/Grpc.Core.csproj b/src/csharp/Grpc.Core/Grpc.Core.csproj
index ad2af17bc75abcd8b81568f35ee8b35a6a127c5a..92d4e19eac25bc10c5d908be065230273a5e8f85 100644
--- a/src/csharp/Grpc.Core/Grpc.Core.csproj
+++ b/src/csharp/Grpc.Core/Grpc.Core.csproj
@@ -48,7 +48,9 @@
   <ItemGroup>
     <Compile Include="AsyncDuplexStreamingCall.cs" />
     <Compile Include="AsyncServerStreamingCall.cs" />
+    <Compile Include="CallCredentials.cs" />
     <Compile Include="IClientStreamWriter.cs" />
+    <Compile Include="Internal\NativeMetadataCredentialsPlugin.cs" />
     <Compile Include="Internal\INativeCall.cs" />
     <Compile Include="IServerStreamWriter.cs" />
     <Compile Include="IAsyncStreamWriter.cs" />
@@ -79,7 +81,7 @@
     <Compile Include="Utils\AsyncStreamExtensions.cs" />
     <Compile Include="Utils\BenchmarkUtil.cs" />
     <Compile Include="Internal\CredentialsSafeHandle.cs" />
-    <Compile Include="Credentials.cs" />
+    <Compile Include="ChannelCredentials.cs" />
     <Compile Include="Internal\ChannelArgsSafeHandle.cs" />
     <Compile Include="Internal\AsyncCompletion.cs" />
     <Compile Include="Internal\AsyncCallBase.cs" />
diff --git a/src/csharp/Grpc.Core/Grpc.Core.nuspec b/src/csharp/Grpc.Core/Grpc.Core.nuspec
index 06de55c8c3c012149fa119c4eeeece7258c3d1c1..67a04afc22d2b83ed625e328c7bec3673d27ff3f 100644
--- a/src/csharp/Grpc.Core/Grpc.Core.nuspec
+++ b/src/csharp/Grpc.Core/Grpc.Core.nuspec
@@ -16,7 +16,7 @@
     <tags>gRPC RPC Protocol HTTP/2</tags>
     <dependencies>
       <dependency id="Ix-Async" version="1.2.3" />
-      <dependency id="grpc.native.csharp_ext" version="$GrpcNativeCsharpExtVersion$" />
+      <dependency id="grpc.native.csharp" version="$GrpcNativeCsharpVersion$" />
     </dependencies>
   </metadata>
   <files>
diff --git a/src/csharp/Grpc.Core/Internal/AsyncCall.cs b/src/csharp/Grpc.Core/Internal/AsyncCall.cs
index e3b00781c6216885cc9025ed26f3ef35d388e5b7..800462c85407a45a822a4fa5e00aa863255787b3 100644
--- a/src/csharp/Grpc.Core/Internal/AsyncCall.cs
+++ b/src/csharp/Grpc.Core/Internal/AsyncCall.cs
@@ -344,9 +344,13 @@ namespace Grpc.Core.Internal
 
             var parentCall = details.Options.PropagationToken != null ? details.Options.PropagationToken.ParentCall : CallSafeHandle.NullInstance;
 
-            return details.Channel.Handle.CreateCall(environment.CompletionRegistry,
-                parentCall, ContextPropagationToken.DefaultMask, cq,
-                details.Method, details.Host, Timespec.FromDateTime(details.Options.Deadline.Value));
+            var credentials = details.Options.Credentials;
+            using (var nativeCredentials = credentials != null ? credentials.ToNativeCredentials() : null)
+            {
+                return details.Channel.Handle.CreateCall(environment.CompletionRegistry,
+                    parentCall, ContextPropagationToken.DefaultMask, cq,
+                    details.Method, details.Host, Timespec.FromDateTime(details.Options.Deadline.Value), nativeCredentials);
+            }
         }
 
         // Make sure that once cancellationToken for this call is cancelled, Cancel() will be called.
diff --git a/src/csharp/Grpc.Core/Internal/CallSafeHandle.cs b/src/csharp/Grpc.Core/Internal/CallSafeHandle.cs
index c3611a7761f5213e58c84a08a30a67b693a88f97..0be7a4dd3a1f3033321072360457ca7865baef95 100644
--- a/src/csharp/Grpc.Core/Internal/CallSafeHandle.cs
+++ b/src/csharp/Grpc.Core/Internal/CallSafeHandle.cs
@@ -98,6 +98,9 @@ namespace Grpc.Core.Internal
         static extern GRPCCallError grpcsharp_call_send_initial_metadata(CallSafeHandle call,
             BatchContextSafeHandle ctx, MetadataArraySafeHandle metadataArray);
 
+        [DllImport("grpc_csharp_ext.dll")]
+        static extern GRPCCallError grpcsharp_call_set_credentials(CallSafeHandle call, CredentialsSafeHandle credentials);
+
         [DllImport("grpc_csharp_ext.dll")]
         static extern CStringSafeHandle grpcsharp_call_get_peer(CallSafeHandle call);
 
@@ -113,6 +116,11 @@ namespace Grpc.Core.Internal
             this.completionRegistry = completionRegistry;
         }
 
+        public void SetCredentials(CredentialsSafeHandle credentials)
+        {
+            grpcsharp_call_set_credentials(this, credentials).CheckOk();
+        }
+
         public void StartUnary(UnaryResponseClientHandler callback, byte[] payload, MetadataArraySafeHandle metadataArray, WriteFlags writeFlags)
         {
             var ctx = BatchContextSafeHandle.Create();
diff --git a/src/csharp/Grpc.Core/Internal/ChannelSafeHandle.cs b/src/csharp/Grpc.Core/Internal/ChannelSafeHandle.cs
index 7a1c6e3dacd59885feaf6ce4020e3dc7ac30b168..d270d77526ffd44e69e6da66728bf614deef9852 100644
--- a/src/csharp/Grpc.Core/Internal/ChannelSafeHandle.cs
+++ b/src/csharp/Grpc.Core/Internal/ChannelSafeHandle.cs
@@ -82,9 +82,13 @@ namespace Grpc.Core.Internal
             return grpcsharp_secure_channel_create(credentials, target, channelArgs);
         }
 
-        public CallSafeHandle CreateCall(CompletionRegistry registry, CallSafeHandle parentCall, ContextPropagationFlags propagationMask, CompletionQueueSafeHandle cq, string method, string host, Timespec deadline)
+        public CallSafeHandle CreateCall(CompletionRegistry registry, CallSafeHandle parentCall, ContextPropagationFlags propagationMask, CompletionQueueSafeHandle cq, string method, string host, Timespec deadline, CredentialsSafeHandle credentials)
         {
             var result = grpcsharp_channel_create_call(this, parentCall, propagationMask, cq, method, host, deadline);
+            if (credentials != null)
+            {
+                result.SetCredentials(credentials);
+            }
             result.SetCompletionRegistry(registry);
             return result;
         }
diff --git a/src/csharp/Grpc.Core/Internal/CredentialsSafeHandle.cs b/src/csharp/Grpc.Core/Internal/CredentialsSafeHandle.cs
index feed33536246720f578c66223165c44752dc36b9..bab45108e02a060952e8b96dcc64cd807dd63779 100644
--- a/src/csharp/Grpc.Core/Internal/CredentialsSafeHandle.cs
+++ b/src/csharp/Grpc.Core/Internal/CredentialsSafeHandle.cs
@@ -43,6 +43,9 @@ namespace Grpc.Core.Internal
         [DllImport("grpc_csharp_ext.dll", CharSet = CharSet.Ansi)]
         static extern CredentialsSafeHandle grpcsharp_ssl_credentials_create(string pemRootCerts, string keyCertPairCertChain, string keyCertPairPrivateKey);
 
+        [DllImport("grpc_csharp_ext.dll")]
+        static extern CredentialsSafeHandle grpcsharp_composite_credentials_create(CredentialsSafeHandle creds1, CredentialsSafeHandle creds2);
+
         [DllImport("grpc_csharp_ext.dll")]
         static extern void grpcsharp_credentials_release(IntPtr credentials);
 
@@ -69,6 +72,11 @@ namespace Grpc.Core.Internal
             }
         }
 
+        public static CredentialsSafeHandle CreateComposite(CredentialsSafeHandle creds1, CredentialsSafeHandle creds2)
+        {
+            return grpcsharp_composite_credentials_create(creds1, creds2);
+        }
+
         protected override bool ReleaseHandle()
         {
             grpcsharp_credentials_release(handle);
diff --git a/src/csharp/Grpc.Core/Internal/NativeMetadataCredentialsPlugin.cs b/src/csharp/Grpc.Core/Internal/NativeMetadataCredentialsPlugin.cs
new file mode 100644
index 0000000000000000000000000000000000000000..f76492cba4a90b9b7151a52bafe5f026e62c9cfe
--- /dev/null
+++ b/src/csharp/Grpc.Core/Internal/NativeMetadataCredentialsPlugin.cs
@@ -0,0 +1,113 @@
+#region Copyright notice and license
+// Copyright 2015, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#endregion
+using System;
+using System.Runtime.InteropServices;
+using System.Threading;
+using System.Threading.Tasks;
+
+using Grpc.Core.Logging;
+using Grpc.Core.Utils;
+
+namespace Grpc.Core.Internal
+{
+    internal delegate void NativeMetadataInterceptor(IntPtr statePtr, IntPtr serviceUrlPtr, IntPtr callbackPtr, IntPtr userDataPtr, bool isDestroy);
+
+    internal class NativeMetadataCredentialsPlugin
+    {
+        const string GetMetadataExceptionMsg = "Exception occured in metadata credentials plugin.";
+        static readonly ILogger Logger = GrpcEnvironment.Logger.ForType<NativeMetadataCredentialsPlugin>();
+
+        [DllImport("grpc_csharp_ext.dll")]
+        static extern CredentialsSafeHandle grpcsharp_metadata_credentials_create_from_plugin(NativeMetadataInterceptor interceptor);
+        
+        [DllImport("grpc_csharp_ext.dll", CharSet = CharSet.Ansi)]
+        static extern void grpcsharp_metadata_credentials_notify_from_plugin(IntPtr callbackPtr, IntPtr userData, MetadataArraySafeHandle metadataArray, StatusCode statusCode, string errorDetails);
+
+        AsyncAuthInterceptor interceptor;
+        GCHandle gcHandle;
+        NativeMetadataInterceptor nativeInterceptor;
+        CredentialsSafeHandle credentials;
+
+        public NativeMetadataCredentialsPlugin(AsyncAuthInterceptor interceptor)
+        {
+            this.interceptor = Preconditions.CheckNotNull(interceptor, "interceptor");
+            this.nativeInterceptor = NativeMetadataInterceptorHandler;
+
+            // Make sure the callback doesn't get garbage collected until it is destroyed.
+            this.gcHandle = GCHandle.Alloc(this.nativeInterceptor, GCHandleType.Normal);
+            this.credentials = grpcsharp_metadata_credentials_create_from_plugin(nativeInterceptor);
+        }
+
+        public CredentialsSafeHandle Credentials
+        {
+            get { return credentials; }
+        }
+
+        private void NativeMetadataInterceptorHandler(IntPtr statePtr, IntPtr serviceUrlPtr, IntPtr callbackPtr, IntPtr userDataPtr, bool isDestroy)
+        {
+            if (isDestroy)
+            {
+                gcHandle.Free();
+                return;
+            }
+
+            try
+            {
+                string serviceUrl = Marshal.PtrToStringAnsi(serviceUrlPtr);
+                StartGetMetadata(serviceUrl, callbackPtr, userDataPtr);
+            }
+            catch (Exception e)
+            {
+                grpcsharp_metadata_credentials_notify_from_plugin(callbackPtr, userDataPtr, MetadataArraySafeHandle.Create(Metadata.Empty), StatusCode.Unknown, GetMetadataExceptionMsg);
+                Logger.Error(e, GetMetadataExceptionMsg);
+            }
+        }
+
+        private async void StartGetMetadata(string serviceUrl, IntPtr callbackPtr, IntPtr userDataPtr)
+        {
+            try
+            {
+                var metadata = new Metadata();
+                await interceptor(serviceUrl, metadata);
+
+                using (var metadataArray = MetadataArraySafeHandle.Create(metadata))
+                {
+                    grpcsharp_metadata_credentials_notify_from_plugin(callbackPtr, userDataPtr, metadataArray, StatusCode.OK, null);
+                }
+            }
+            catch (Exception e)
+            {
+                grpcsharp_metadata_credentials_notify_from_plugin(callbackPtr, userDataPtr, MetadataArraySafeHandle.Create(Metadata.Empty), StatusCode.Unknown, GetMetadataExceptionMsg);
+                Logger.Error(e, GetMetadataExceptionMsg);
+            }
+        }
+    }
+}
diff --git a/src/csharp/Grpc.Examples.MathClient/MathClient.cs b/src/csharp/Grpc.Examples.MathClient/MathClient.cs
index 01e4a80babc119d666f69ce636c87f77286cd726..64e429ed5a32001bf89b10172ad73c40adb79ad0 100644
--- a/src/csharp/Grpc.Examples.MathClient/MathClient.cs
+++ b/src/csharp/Grpc.Examples.MathClient/MathClient.cs
@@ -39,7 +39,7 @@ namespace Math
     {
         public static void Main(string[] args)
         {
-            var channel = new Channel("127.0.0.1", 23456, Credentials.Insecure);
+            var channel = new Channel("127.0.0.1", 23456, ChannelCredentials.Insecure);
             Math.IMathClient client = new Math.MathClient(channel);
             MathExamples.DivExample(client);
 
diff --git a/src/csharp/Grpc.Examples.Tests/MathClientServerTests.cs b/src/csharp/Grpc.Examples.Tests/MathClientServerTests.cs
index e2975b5da93fd265899100aee3d5ec6d442119c2..290d42808e734cdae8aa4bcd07b1b1b29f6a69ea 100644
--- a/src/csharp/Grpc.Examples.Tests/MathClientServerTests.cs
+++ b/src/csharp/Grpc.Examples.Tests/MathClientServerTests.cs
@@ -61,7 +61,7 @@ namespace Math.Tests
                 Ports = { { Host, ServerPort.PickUnused, ServerCredentials.Insecure } }
             };
             server.Start();
-            channel = new Channel(Host, server.Ports.Single().BoundPort, Credentials.Insecure);
+            channel = new Channel(Host, server.Ports.Single().BoundPort, ChannelCredentials.Insecure);
             client = Math.NewClient(channel);
         }
 
diff --git a/src/csharp/Grpc.HealthCheck.Tests/HealthClientServerTest.cs b/src/csharp/Grpc.HealthCheck.Tests/HealthClientServerTest.cs
index 6c3a53bec0559168b54aab151394a855b6470fd1..d90f21c2e1cb30b7a3fe2e01297fb423cfa4a998 100644
--- a/src/csharp/Grpc.HealthCheck.Tests/HealthClientServerTest.cs
+++ b/src/csharp/Grpc.HealthCheck.Tests/HealthClientServerTest.cs
@@ -63,7 +63,7 @@ namespace Grpc.HealthCheck.Tests
                 Ports = { { Host, ServerPort.PickUnused, ServerCredentials.Insecure } }
             };
             server.Start();
-            channel = new Channel(Host, server.Ports.Single().BoundPort, Credentials.Insecure);
+            channel = new Channel(Host, server.Ports.Single().BoundPort, ChannelCredentials.Insecure);
 
             client = Grpc.Health.V1Alpha.Health.NewClient(channel);
         }
diff --git a/src/csharp/Grpc.IntegrationTesting.Client/Grpc.IntegrationTesting.Client.csproj b/src/csharp/Grpc.IntegrationTesting.Client/Grpc.IntegrationTesting.Client.csproj
index 2c38c9645c5f7804e73a69fb4576f3eab46a6703..8bc2082a1da0f736e833e9f442800449f2f44b12 100644
--- a/src/csharp/Grpc.IntegrationTesting.Client/Grpc.IntegrationTesting.Client.csproj
+++ b/src/csharp/Grpc.IntegrationTesting.Client/Grpc.IntegrationTesting.Client.csproj
@@ -9,6 +9,7 @@
     <AssemblyName>Grpc.IntegrationTesting.Client</AssemblyName>
     <StartupObject>Grpc.IntegrationTesting.Client.Program</StartupObject>
     <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <NuGetPackageImportStamp>6d22e68f</NuGetPackageImportStamp>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>true</DebugSymbols>
@@ -38,7 +39,47 @@
     <AssemblyOriginatorKeyFile>C:\keys\Grpc.snk</AssemblyOriginatorKeyFile>
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="BouncyCastle.Crypto, Version=1.7.4137.9688, Culture=neutral, PublicKeyToken=a4292a325f69b123, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\packages\BouncyCastle.1.7.0\lib\Net40-Client\BouncyCastle.Crypto.dll</HintPath>
+    </Reference>
+    <Reference Include="Google.Apis.Auth, Version=1.9.3.19379, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\packages\Google.Apis.Auth.1.9.3\lib\net40\Google.Apis.Auth.dll</HintPath>
+    </Reference>
+    <Reference Include="Google.Apis.Auth.PlatformServices, Version=1.9.3.19383, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\packages\Google.Apis.Auth.1.9.3\lib\net40\Google.Apis.Auth.PlatformServices.dll</HintPath>
+    </Reference>
+    <Reference Include="Google.Apis.Core, Version=1.9.3.19379, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\packages\Google.Apis.Core.1.9.3\lib\portable-net40+sl50+win+wpa81+wp80\Google.Apis.Core.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.Threading.Tasks, Version=1.0.12.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.Threading.Tasks.Extensions">
+      <HintPath>..\packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.Extensions.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.Threading.Tasks.Extensions.Desktop, Version=1.0.168.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.Extensions.Desktop.dll</HintPath>
+    </Reference>
+    <Reference Include="Newtonsoft.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
+    </Reference>
     <Reference Include="System" />
+    <Reference Include="System.Net" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Net.Http.Extensions">
+      <HintPath>..\packages\Microsoft.Net.Http.2.2.29\lib\net45\System.Net.Http.Extensions.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Net.Http.Primitives">
+      <HintPath>..\packages\Microsoft.Net.Http.2.2.29\lib\net45\System.Net.Http.Primitives.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Net.Http.WebRequest" />
   </ItemGroup>
   <ItemGroup>
     <Compile Include="..\Grpc.Core\Version.cs">
@@ -60,5 +101,13 @@
   </ItemGroup>
   <ItemGroup>
     <None Include="app.config" />
+    <None Include="packages.config" />
   </ItemGroup>
+  <Import Project="..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets" Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" />
+  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
+    <PropertyGroup>
+      <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
+    </PropertyGroup>
+    <Error Condition="!Exists('..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets'))" />
+  </Target>
 </Project>
\ No newline at end of file
diff --git a/src/csharp/Grpc.IntegrationTesting.Client/packages.config b/src/csharp/Grpc.IntegrationTesting.Client/packages.config
new file mode 100644
index 0000000000000000000000000000000000000000..7a02c95db9138a30a7f1bf2d432e95050e008d91
--- /dev/null
+++ b/src/csharp/Grpc.IntegrationTesting.Client/packages.config
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="BouncyCastle" version="1.7.0" targetFramework="net45" />
+  <package id="Google.Apis.Auth" version="1.9.3" targetFramework="net45" />
+  <package id="Google.Apis.Core" version="1.9.3" targetFramework="net45" />
+  <package id="Microsoft.Bcl" version="1.1.10" targetFramework="net45" />
+  <package id="Microsoft.Bcl.Async" version="1.0.168" targetFramework="net45" />
+  <package id="Microsoft.Bcl.Build" version="1.0.21" targetFramework="net45" />
+  <package id="Microsoft.Net.Http" version="2.2.29" targetFramework="net45" />
+  <package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" />
+</packages>
\ No newline at end of file
diff --git a/src/csharp/Grpc.IntegrationTesting.Server/Grpc.IntegrationTesting.Server.csproj b/src/csharp/Grpc.IntegrationTesting.Server/Grpc.IntegrationTesting.Server.csproj
index 949ad61375c4c0c15562cc8ab5a358e8c8c99e98..1eadbeb9206fb99dbf8f46df8b62f82e5079908e 100644
--- a/src/csharp/Grpc.IntegrationTesting.Server/Grpc.IntegrationTesting.Server.csproj
+++ b/src/csharp/Grpc.IntegrationTesting.Server/Grpc.IntegrationTesting.Server.csproj
@@ -9,6 +9,7 @@
     <AssemblyName>Grpc.IntegrationTesting.Server</AssemblyName>
     <StartupObject>Grpc.IntegrationTesting.Server.Program</StartupObject>
     <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <NuGetPackageImportStamp>d9ee8e52</NuGetPackageImportStamp>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>true</DebugSymbols>
@@ -38,7 +39,47 @@
     <AssemblyOriginatorKeyFile>C:\keys\Grpc.snk</AssemblyOriginatorKeyFile>
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="BouncyCastle.Crypto, Version=1.7.4137.9688, Culture=neutral, PublicKeyToken=a4292a325f69b123, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\packages\BouncyCastle.1.7.0\lib\Net40-Client\BouncyCastle.Crypto.dll</HintPath>
+    </Reference>
+    <Reference Include="Google.Apis.Auth, Version=1.9.3.19379, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\packages\Google.Apis.Auth.1.9.3\lib\net40\Google.Apis.Auth.dll</HintPath>
+    </Reference>
+    <Reference Include="Google.Apis.Auth.PlatformServices, Version=1.9.3.19383, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\packages\Google.Apis.Auth.1.9.3\lib\net40\Google.Apis.Auth.PlatformServices.dll</HintPath>
+    </Reference>
+    <Reference Include="Google.Apis.Core, Version=1.9.3.19379, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\packages\Google.Apis.Core.1.9.3\lib\portable-net40+sl50+win+wpa81+wp80\Google.Apis.Core.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.Threading.Tasks, Version=1.0.12.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.Threading.Tasks.Extensions">
+      <HintPath>..\packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.Extensions.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.Threading.Tasks.Extensions.Desktop, Version=1.0.168.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.Extensions.Desktop.dll</HintPath>
+    </Reference>
+    <Reference Include="Newtonsoft.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
+    </Reference>
     <Reference Include="System" />
+    <Reference Include="System.Net" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Net.Http.Extensions">
+      <HintPath>..\packages\Microsoft.Net.Http.2.2.29\lib\net45\System.Net.Http.Extensions.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Net.Http.Primitives">
+      <HintPath>..\packages\Microsoft.Net.Http.2.2.29\lib\net45\System.Net.Http.Primitives.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Net.Http.WebRequest" />
   </ItemGroup>
   <ItemGroup>
     <Compile Include="..\Grpc.Core\Version.cs">
@@ -60,5 +101,13 @@
   </ItemGroup>
   <ItemGroup>
     <None Include="app.config" />
+    <None Include="packages.config" />
   </ItemGroup>
+  <Import Project="..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets" Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" />
+  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
+    <PropertyGroup>
+      <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
+    </PropertyGroup>
+    <Error Condition="!Exists('..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets'))" />
+  </Target>
 </Project>
\ No newline at end of file
diff --git a/src/csharp/Grpc.IntegrationTesting.Server/packages.config b/src/csharp/Grpc.IntegrationTesting.Server/packages.config
new file mode 100644
index 0000000000000000000000000000000000000000..7a02c95db9138a30a7f1bf2d432e95050e008d91
--- /dev/null
+++ b/src/csharp/Grpc.IntegrationTesting.Server/packages.config
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="BouncyCastle" version="1.7.0" targetFramework="net45" />
+  <package id="Google.Apis.Auth" version="1.9.3" targetFramework="net45" />
+  <package id="Google.Apis.Core" version="1.9.3" targetFramework="net45" />
+  <package id="Microsoft.Bcl" version="1.1.10" targetFramework="net45" />
+  <package id="Microsoft.Bcl.Async" version="1.0.168" targetFramework="net45" />
+  <package id="Microsoft.Bcl.Build" version="1.0.21" targetFramework="net45" />
+  <package id="Microsoft.Net.Http" version="2.2.29" targetFramework="net45" />
+  <package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" />
+</packages>
\ No newline at end of file
diff --git a/src/csharp/Grpc.IntegrationTesting/Empty.cs b/src/csharp/Grpc.IntegrationTesting/Empty.cs
index 28c28c9afd5bd303a550a30cc64bedf158e65101..9bf2b8f7cf7aa5e6dfff229958bcc2044c1f6509 100644
--- a/src/csharp/Grpc.IntegrationTesting/Empty.cs
+++ b/src/csharp/Grpc.IntegrationTesting/Empty.cs
@@ -1,5 +1,5 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
-// source: empty.proto
+// source: test/proto/empty.proto
 #pragma warning disable 1591, 0612, 3021
 #region Designer generated code
 
@@ -23,7 +23,8 @@ namespace Grpc.Testing {
       static Empty() {
         byte[] descriptorData = global::System.Convert.FromBase64String(
             string.Concat(
-              "CgtlbXB0eS5wcm90bxIMZ3JwYy50ZXN0aW5nIgcKBUVtcHR5YgZwcm90bzM="));
+              "ChZ0ZXN0L3Byb3RvL2VtcHR5LnByb3RvEgxncnBjLnRlc3RpbmciBwoFRW1w", 
+              "dHliBnByb3RvMw=="));
         descriptor = pbr::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData,
             new pbr::FileDescriptor[] { },
             new pbr::GeneratedCodeInfo(null, new pbr::GeneratedCodeInfo[] {
diff --git a/src/csharp/Grpc.IntegrationTesting/Grpc.IntegrationTesting.csproj b/src/csharp/Grpc.IntegrationTesting/Grpc.IntegrationTesting.csproj
index a0bcf431f7bee447b8428d51bd03be2c1014ee3f..2b7530573103cc7b64f65653c8010ced96ee284a 100644
--- a/src/csharp/Grpc.IntegrationTesting/Grpc.IntegrationTesting.csproj
+++ b/src/csharp/Grpc.IntegrationTesting/Grpc.IntegrationTesting.csproj
@@ -96,6 +96,7 @@
     <Compile Include="Empty.cs" />
     <Compile Include="Messages.cs" />
     <Compile Include="InteropClientServerTest.cs" />
+    <Compile Include="MetadataCredentialsTest.cs" />
     <Compile Include="TestServiceImpl.cs" />
     <Compile Include="InteropServer.cs" />
     <Compile Include="InteropClient.cs" />
@@ -118,9 +119,6 @@
   <ItemGroup>
     <None Include="app.config" />
     <None Include="packages.config" />
-    <None Include="proto\test.proto" />
-    <None Include="proto\empty.proto" />
-    <None Include="proto\messages.proto" />
     <None Include="data\README">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
diff --git a/src/csharp/Grpc.IntegrationTesting/InteropClient.cs b/src/csharp/Grpc.IntegrationTesting/InteropClient.cs
index 504d798b8936f7e3d54f75dcde1525a99d81077d..030a098cad364e73a47ae88013cd0a595c97f3ae 100644
--- a/src/csharp/Grpc.IntegrationTesting/InteropClient.cs
+++ b/src/csharp/Grpc.IntegrationTesting/InteropClient.cs
@@ -33,20 +33,21 @@
 
 using System;
 using System.Collections.Generic;
+using System.IO;
 using System.Text.RegularExpressions;
 using System.Threading;
 using System.Threading.Tasks;
 
 using CommandLine;
+using CommandLine.Text;
 using Google.Apis.Auth.OAuth2;
 using Google.Protobuf;
 using Grpc.Auth;
 using Grpc.Core;
 using Grpc.Core.Utils;
 using Grpc.Testing;
+using Newtonsoft.Json.Linq;
 using NUnit.Framework;
-using CommandLine.Text;
-using System.IO;
 
 namespace Grpc.IntegrationTesting
 {
@@ -66,11 +67,13 @@ namespace Grpc.IntegrationTesting
             [Option("test_case", DefaultValue = "large_unary")]
             public string TestCase { get; set; }
 
-            [Option("use_tls")]
-            public bool UseTls { get; set; }
+            // Deliberately using nullable bool type to allow --use_tls=true syntax (as opposed to --use_tls)
+            [Option("use_tls", DefaultValue = false)]
+            public bool? UseTls { get; set; }
 
-            [Option("use_test_ca")]
-            public bool UseTestCa { get; set; }
+            // Deliberately using nullable bool type to allow --use_test_ca=true syntax (as opposed to --use_test_ca)
+            [Option("use_test_ca", DefaultValue = false)]
+            public bool? UseTestCa { get; set; }
 
             [Option("default_service_account", Required = false)]
             public string DefaultServiceAccount { get; set; }
@@ -116,7 +119,7 @@ namespace Grpc.IntegrationTesting
 
         private async Task Run()
         {
-            var credentials = options.UseTls ? TestCredentials.CreateTestClientCredentials(options.UseTestCa) : Credentials.Insecure;
+            var credentials = await CreateCredentialsAsync();
             
             List<ChannelOption> channelOptions = null;
             if (!string.IsNullOrEmpty(options.ServerHostOverride))
@@ -132,6 +135,26 @@ namespace Grpc.IntegrationTesting
             await channel.ShutdownAsync();
         }
 
+        private async Task<ChannelCredentials> CreateCredentialsAsync()
+        {
+            var credentials = options.UseTls.Value ? TestCredentials.CreateTestClientCredentials(options.UseTestCa.Value) : ChannelCredentials.Insecure;
+
+            if (options.TestCase == "jwt_token_creds")
+            {
+                var googleCredential = await GoogleCredential.GetApplicationDefaultAsync();
+                Assert.IsTrue(googleCredential.IsCreateScopedRequired);
+                credentials = ChannelCredentials.Create(credentials, googleCredential.ToCallCredentials());
+            }
+
+            if (options.TestCase == "compute_engine_creds")
+            {
+                var googleCredential = await GoogleCredential.GetApplicationDefaultAsync();
+                Assert.IsFalse(googleCredential.IsCreateScopedRequired);
+                credentials = ChannelCredentials.Create(credentials, googleCredential.ToCallCredentials());
+            }
+            return credentials;
+        }
+
         private async Task RunTestCaseAsync(TestService.TestServiceClient client, ClientOptions options)
         {
             switch (options.TestCase)
@@ -155,16 +178,16 @@ namespace Grpc.IntegrationTesting
                     await RunEmptyStreamAsync(client);
                     break;
                 case "compute_engine_creds":
-                    await RunComputeEngineCredsAsync(client, options.DefaultServiceAccount, options.OAuthScope);
+                    RunComputeEngineCreds(client, options.DefaultServiceAccount, options.OAuthScope);
                     break;
                 case "jwt_token_creds":
-                    await RunJwtTokenCredsAsync(client, options.DefaultServiceAccount);
+                    RunJwtTokenCreds(client);
                     break;
                 case "oauth2_auth_token":
-                    await RunOAuth2AuthTokenAsync(client, options.DefaultServiceAccount, options.OAuthScope);
+                    await RunOAuth2AuthTokenAsync(client, options.OAuthScope);
                     break;
                 case "per_rpc_creds":
-                    await RunPerRpcCredsAsync(client, options.DefaultServiceAccount, options.OAuthScope);
+                    await RunPerRpcCredsAsync(client, options.OAuthScope);
                     break;
                 case "cancel_after_begin":
                     await RunCancelAfterBeginAsync(client);
@@ -318,13 +341,10 @@ namespace Grpc.IntegrationTesting
             Console.WriteLine("Passed!");
         }
 
-        public static async Task RunComputeEngineCredsAsync(TestService.TestServiceClient client, string defaultServiceAccount, string oauthScope)
+        public static void RunComputeEngineCreds(TestService.TestServiceClient client, string defaultServiceAccount, string oauthScope)
         {
             Console.WriteLine("running compute_engine_creds");
-            var credential = await GoogleCredential.GetApplicationDefaultAsync();
-            Assert.IsFalse(credential.IsCreateScopedRequired);
-            client.HeaderInterceptor = AuthInterceptors.FromCredential(credential);
-            
+
             var request = new SimpleRequest
             {
                 ResponseType = PayloadType.COMPRESSABLE,
@@ -334,6 +354,7 @@ namespace Grpc.IntegrationTesting
                 FillOauthScope = true
             };
 
+            // not setting credentials here because they were set on channel already
             var response = client.UnaryCall(request);
 
             Assert.AreEqual(PayloadType.COMPRESSABLE, response.Payload.Type);
@@ -344,13 +365,10 @@ namespace Grpc.IntegrationTesting
             Console.WriteLine("Passed!");
         }
 
-        public static async Task RunJwtTokenCredsAsync(TestService.TestServiceClient client, string defaultServiceAccount)
+        public static void RunJwtTokenCreds(TestService.TestServiceClient client)
         {
             Console.WriteLine("running jwt_token_creds");
-            var credential = await GoogleCredential.GetApplicationDefaultAsync();
-            Assert.IsTrue(credential.IsCreateScopedRequired);
-            client.HeaderInterceptor = AuthInterceptors.FromCredential(credential);
-
+           
             var request = new SimpleRequest
             {
                 ResponseType = PayloadType.COMPRESSABLE,
@@ -359,53 +377,50 @@ namespace Grpc.IntegrationTesting
                 FillUsername = true,
             };
 
+            // not setting credentials here because they were set on channel already
             var response = client.UnaryCall(request);
 
             Assert.AreEqual(PayloadType.COMPRESSABLE, response.Payload.Type);
             Assert.AreEqual(314159, response.Payload.Body.Length);
-            Assert.AreEqual(defaultServiceAccount, response.Username);
+            Assert.AreEqual(GetEmailFromServiceAccountFile(), response.Username);
             Console.WriteLine("Passed!");
         }
 
-        public static async Task RunOAuth2AuthTokenAsync(TestService.TestServiceClient client, string defaultServiceAccount, string oauthScope)
+        public static async Task RunOAuth2AuthTokenAsync(TestService.TestServiceClient client, string oauthScope)
         {
             Console.WriteLine("running oauth2_auth_token");
             ITokenAccess credential = (await GoogleCredential.GetApplicationDefaultAsync()).CreateScoped(new[] { oauthScope });
             string oauth2Token = await credential.GetAccessTokenForRequestAsync();
 
-            client.HeaderInterceptor = AuthInterceptors.FromAccessToken(oauth2Token);
-
+            var credentials = GoogleGrpcCredentials.FromAccessToken(oauth2Token);
             var request = new SimpleRequest
             {
                 FillUsername = true,
                 FillOauthScope = true
             };
 
-            var response = client.UnaryCall(request);
+            var response = client.UnaryCall(request, new CallOptions(credentials: credentials));
 
             Assert.False(string.IsNullOrEmpty(response.OauthScope));
             Assert.True(oauthScope.Contains(response.OauthScope));
-            Assert.AreEqual(defaultServiceAccount, response.Username);
+            Assert.AreEqual(GetEmailFromServiceAccountFile(), response.Username);
             Console.WriteLine("Passed!");
         }
 
-        public static async Task RunPerRpcCredsAsync(TestService.TestServiceClient client, string defaultServiceAccount, string oauthScope)
+        public static async Task RunPerRpcCredsAsync(TestService.TestServiceClient client, string oauthScope)
         {
             Console.WriteLine("running per_rpc_creds");
-            ITokenAccess credential = (await GoogleCredential.GetApplicationDefaultAsync()).CreateScoped(new[] { oauthScope });
-            string accessToken = await credential.GetAccessTokenForRequestAsync();
-            var headerInterceptor = AuthInterceptors.FromAccessToken(accessToken);
+            ITokenAccess googleCredential = await GoogleCredential.GetApplicationDefaultAsync();
 
+            var credentials = googleCredential.ToCallCredentials();
             var request = new SimpleRequest
             {
                 FillUsername = true,
             };
 
-            var headers = new Metadata();
-            headerInterceptor(null, "", headers);
-            var response = client.UnaryCall(request, headers: headers);
+            var response = client.UnaryCall(request, new CallOptions(credentials: credentials));
 
-            Assert.AreEqual(defaultServiceAccount, response.Username);
+            Assert.AreEqual(GetEmailFromServiceAccountFile(), response.Username);
             Console.WriteLine("Passed!");
         }
 
@@ -485,5 +500,17 @@ namespace Grpc.IntegrationTesting
         {
             return new Payload { Body = ByteString.CopyFrom(new byte[size]) };
         }
+
+        // extracts the client_email field from service account file used for auth test cases
+        private static string GetEmailFromServiceAccountFile()
+        {
+            string keyFile = Environment.GetEnvironmentVariable("GOOGLE_APPLICATION_CREDENTIALS");
+            Assert.IsNotNull(keyFile);
+
+            var jobject = JObject.Parse(File.ReadAllText(keyFile));
+            string email = jobject.GetValue("client_email").Value<string>();
+            Assert.IsTrue(email.Length > 0);  // spec requires nonempty client email.
+            return email;
+        }
     }
 }
diff --git a/src/csharp/Grpc.IntegrationTesting/InteropServer.cs b/src/csharp/Grpc.IntegrationTesting/InteropServer.cs
index 513f8722d64238299548af6fe4ec41605816f58a..29f842be2eceedfcd9b9045d856d1cd1da9d2d42 100644
--- a/src/csharp/Grpc.IntegrationTesting/InteropServer.cs
+++ b/src/csharp/Grpc.IntegrationTesting/InteropServer.cs
@@ -54,8 +54,9 @@ namespace Grpc.IntegrationTesting
             [Option("port", DefaultValue = 8070)]
             public int Port { get; set; }
 
-            [Option("use_tls")]
-            public bool UseTls { get; set; }
+            // Deliberately using nullable bool type to allow --use_tls=true syntax (as opposed to --use_tls)
+            [Option("use_tls", DefaultValue = false)]
+            public bool? UseTls { get; set; }
 
             [HelpOption]
             public string GetUsage()
@@ -99,7 +100,7 @@ namespace Grpc.IntegrationTesting
 
             string host = "0.0.0.0";
             int port = options.Port;
-            if (options.UseTls)
+            if (options.UseTls.Value)
             {
                 server.Ports.Add(host, port, TestCredentials.CreateTestServerCredentials());
             }
diff --git a/src/csharp/Grpc.IntegrationTesting/Messages.cs b/src/csharp/Grpc.IntegrationTesting/Messages.cs
index a3cbb7d76ebe6dc7755401d4bd41cdf97d2848f7..51a56f067b5dd669cadb0bf8a846995c30f2d7a8 100644
--- a/src/csharp/Grpc.IntegrationTesting/Messages.cs
+++ b/src/csharp/Grpc.IntegrationTesting/Messages.cs
@@ -1,5 +1,5 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
-// source: messages.proto
+// source: test/proto/messages.proto
 #pragma warning disable 1591, 0612, 3021
 #region Designer generated code
 
@@ -21,37 +21,48 @@ namespace Grpc.Testing {
     static Messages() {
       byte[] descriptorData = global::System.Convert.FromBase64String(
           string.Concat(
-            "Cg5tZXNzYWdlcy5wcm90bxIMZ3JwYy50ZXN0aW5nIkAKB1BheWxvYWQSJwoE", 
-            "dHlwZRgBIAEoDjIZLmdycGMudGVzdGluZy5QYXlsb2FkVHlwZRIMCgRib2R5", 
-            "GAIgASgMIrEBCg1TaW1wbGVSZXF1ZXN0EjAKDXJlc3BvbnNlX3R5cGUYASAB", 
-            "KA4yGS5ncnBjLnRlc3RpbmcuUGF5bG9hZFR5cGUSFQoNcmVzcG9uc2Vfc2l6", 
-            "ZRgCIAEoBRImCgdwYXlsb2FkGAMgASgLMhUuZ3JwYy50ZXN0aW5nLlBheWxv", 
-            "YWQSFQoNZmlsbF91c2VybmFtZRgEIAEoCBIYChBmaWxsX29hdXRoX3Njb3Bl", 
-            "GAUgASgIIl8KDlNpbXBsZVJlc3BvbnNlEiYKB3BheWxvYWQYASABKAsyFS5n", 
-            "cnBjLnRlc3RpbmcuUGF5bG9hZBIQCgh1c2VybmFtZRgCIAEoCRITCgtvYXV0", 
-            "aF9zY29wZRgDIAEoCSJDChlTdHJlYW1pbmdJbnB1dENhbGxSZXF1ZXN0EiYK", 
-            "B3BheWxvYWQYASABKAsyFS5ncnBjLnRlc3RpbmcuUGF5bG9hZCI9ChpTdHJl", 
-            "YW1pbmdJbnB1dENhbGxSZXNwb25zZRIfChdhZ2dyZWdhdGVkX3BheWxvYWRf", 
-            "c2l6ZRgBIAEoBSI3ChJSZXNwb25zZVBhcmFtZXRlcnMSDAoEc2l6ZRgBIAEo", 
-            "BRITCgtpbnRlcnZhbF91cxgCIAEoBSK1AQoaU3RyZWFtaW5nT3V0cHV0Q2Fs", 
-            "bFJlcXVlc3QSMAoNcmVzcG9uc2VfdHlwZRgBIAEoDjIZLmdycGMudGVzdGlu", 
-            "Zy5QYXlsb2FkVHlwZRI9ChNyZXNwb25zZV9wYXJhbWV0ZXJzGAIgAygLMiAu", 
-            "Z3JwYy50ZXN0aW5nLlJlc3BvbnNlUGFyYW1ldGVycxImCgdwYXlsb2FkGAMg", 
-            "ASgLMhUuZ3JwYy50ZXN0aW5nLlBheWxvYWQiRQobU3RyZWFtaW5nT3V0cHV0", 
-            "Q2FsbFJlc3BvbnNlEiYKB3BheWxvYWQYASABKAsyFS5ncnBjLnRlc3Rpbmcu", 
-            "UGF5bG9hZCo/CgtQYXlsb2FkVHlwZRIQCgxDT01QUkVTU0FCTEUQABISCg5V", 
-            "TkNPTVBSRVNTQUJMRRABEgoKBlJBTkRPTRACYgZwcm90bzM="));
+            "Chl0ZXN0L3Byb3RvL21lc3NhZ2VzLnByb3RvEgxncnBjLnRlc3RpbmciQAoH", 
+            "UGF5bG9hZBInCgR0eXBlGAEgASgOMhkuZ3JwYy50ZXN0aW5nLlBheWxvYWRU", 
+            "eXBlEgwKBGJvZHkYAiABKAwiKwoKRWNob1N0YXR1cxIMCgRjb2RlGAEgASgF", 
+            "Eg8KB21lc3NhZ2UYAiABKAkioQIKDVNpbXBsZVJlcXVlc3QSMAoNcmVzcG9u", 
+            "c2VfdHlwZRgBIAEoDjIZLmdycGMudGVzdGluZy5QYXlsb2FkVHlwZRIVCg1y", 
+            "ZXNwb25zZV9zaXplGAIgASgFEiYKB3BheWxvYWQYAyABKAsyFS5ncnBjLnRl", 
+            "c3RpbmcuUGF5bG9hZBIVCg1maWxsX3VzZXJuYW1lGAQgASgIEhgKEGZpbGxf", 
+            "b2F1dGhfc2NvcGUYBSABKAgSOwoUcmVzcG9uc2VfY29tcHJlc3Npb24YBiAB", 
+            "KA4yHS5ncnBjLnRlc3RpbmcuQ29tcHJlc3Npb25UeXBlEjEKD3Jlc3BvbnNl", 
+            "X3N0YXR1cxgHIAEoCzIYLmdycGMudGVzdGluZy5FY2hvU3RhdHVzIl8KDlNp", 
+            "bXBsZVJlc3BvbnNlEiYKB3BheWxvYWQYASABKAsyFS5ncnBjLnRlc3Rpbmcu", 
+            "UGF5bG9hZBIQCgh1c2VybmFtZRgCIAEoCRITCgtvYXV0aF9zY29wZRgDIAEo", 
+            "CSJDChlTdHJlYW1pbmdJbnB1dENhbGxSZXF1ZXN0EiYKB3BheWxvYWQYASAB", 
+            "KAsyFS5ncnBjLnRlc3RpbmcuUGF5bG9hZCI9ChpTdHJlYW1pbmdJbnB1dENh", 
+            "bGxSZXNwb25zZRIfChdhZ2dyZWdhdGVkX3BheWxvYWRfc2l6ZRgBIAEoBSI3", 
+            "ChJSZXNwb25zZVBhcmFtZXRlcnMSDAoEc2l6ZRgBIAEoBRITCgtpbnRlcnZh", 
+            "bF91cxgCIAEoBSKlAgoaU3RyZWFtaW5nT3V0cHV0Q2FsbFJlcXVlc3QSMAoN", 
+            "cmVzcG9uc2VfdHlwZRgBIAEoDjIZLmdycGMudGVzdGluZy5QYXlsb2FkVHlw", 
+            "ZRI9ChNyZXNwb25zZV9wYXJhbWV0ZXJzGAIgAygLMiAuZ3JwYy50ZXN0aW5n", 
+            "LlJlc3BvbnNlUGFyYW1ldGVycxImCgdwYXlsb2FkGAMgASgLMhUuZ3JwYy50", 
+            "ZXN0aW5nLlBheWxvYWQSOwoUcmVzcG9uc2VfY29tcHJlc3Npb24YBiABKA4y", 
+            "HS5ncnBjLnRlc3RpbmcuQ29tcHJlc3Npb25UeXBlEjEKD3Jlc3BvbnNlX3N0", 
+            "YXR1cxgHIAEoCzIYLmdycGMudGVzdGluZy5FY2hvU3RhdHVzIkUKG1N0cmVh", 
+            "bWluZ091dHB1dENhbGxSZXNwb25zZRImCgdwYXlsb2FkGAEgASgLMhUuZ3Jw", 
+            "Yy50ZXN0aW5nLlBheWxvYWQiMwoNUmVjb25uZWN0SW5mbxIOCgZwYXNzZWQY", 
+            "ASABKAgSEgoKYmFja29mZl9tcxgCIAMoBSo/CgtQYXlsb2FkVHlwZRIQCgxD", 
+            "T01QUkVTU0FCTEUQABISCg5VTkNPTVBSRVNTQUJMRRABEgoKBlJBTkRPTRAC", 
+            "KjIKD0NvbXByZXNzaW9uVHlwZRIICgROT05FEAASCAoER1pJUBABEgsKB0RF", 
+            "RkxBVEUQAmIGcHJvdG8z"));
       descriptor = pbr::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData,
           new pbr::FileDescriptor[] { },
-          new pbr::GeneratedCodeInfo(new[] {typeof(global::Grpc.Testing.PayloadType), }, new pbr::GeneratedCodeInfo[] {
+          new pbr::GeneratedCodeInfo(new[] {typeof(global::Grpc.Testing.PayloadType), typeof(global::Grpc.Testing.CompressionType), }, new pbr::GeneratedCodeInfo[] {
             new pbr::GeneratedCodeInfo(typeof(global::Grpc.Testing.Payload), new[]{ "Type", "Body" }, null, null, null),
-            new pbr::GeneratedCodeInfo(typeof(global::Grpc.Testing.SimpleRequest), new[]{ "ResponseType", "ResponseSize", "Payload", "FillUsername", "FillOauthScope" }, null, null, null),
+            new pbr::GeneratedCodeInfo(typeof(global::Grpc.Testing.EchoStatus), new[]{ "Code", "Message" }, null, null, null),
+            new pbr::GeneratedCodeInfo(typeof(global::Grpc.Testing.SimpleRequest), new[]{ "ResponseType", "ResponseSize", "Payload", "FillUsername", "FillOauthScope", "ResponseCompression", "ResponseStatus" }, null, null, null),
             new pbr::GeneratedCodeInfo(typeof(global::Grpc.Testing.SimpleResponse), new[]{ "Payload", "Username", "OauthScope" }, null, null, null),
             new pbr::GeneratedCodeInfo(typeof(global::Grpc.Testing.StreamingInputCallRequest), new[]{ "Payload" }, null, null, null),
             new pbr::GeneratedCodeInfo(typeof(global::Grpc.Testing.StreamingInputCallResponse), new[]{ "AggregatedPayloadSize" }, null, null, null),
             new pbr::GeneratedCodeInfo(typeof(global::Grpc.Testing.ResponseParameters), new[]{ "Size", "IntervalUs" }, null, null, null),
-            new pbr::GeneratedCodeInfo(typeof(global::Grpc.Testing.StreamingOutputCallRequest), new[]{ "ResponseType", "ResponseParameters", "Payload" }, null, null, null),
-            new pbr::GeneratedCodeInfo(typeof(global::Grpc.Testing.StreamingOutputCallResponse), new[]{ "Payload" }, null, null, null)
+            new pbr::GeneratedCodeInfo(typeof(global::Grpc.Testing.StreamingOutputCallRequest), new[]{ "ResponseType", "ResponseParameters", "Payload", "ResponseCompression", "ResponseStatus" }, null, null, null),
+            new pbr::GeneratedCodeInfo(typeof(global::Grpc.Testing.StreamingOutputCallResponse), new[]{ "Payload" }, null, null, null),
+            new pbr::GeneratedCodeInfo(typeof(global::Grpc.Testing.ReconnectInfo), new[]{ "Passed", "BackoffMs" }, null, null, null)
           }));
     }
     #endregion
@@ -64,6 +75,12 @@ namespace Grpc.Testing {
     RANDOM = 2,
   }
 
+  public enum CompressionType {
+    NONE = 0,
+    GZIP = 1,
+    DEFLATE = 2,
+  }
+
   #endregion
 
   #region Messages
@@ -195,13 +212,141 @@ namespace Grpc.Testing {
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class EchoStatus : pb::IMessage<EchoStatus> {
+    private static readonly pb::MessageParser<EchoStatus> _parser = new pb::MessageParser<EchoStatus>(() => new EchoStatus());
+    public static pb::MessageParser<EchoStatus> Parser { get { return _parser; } }
+
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::Grpc.Testing.Messages.Descriptor.MessageTypes[1]; }
+    }
+
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    public EchoStatus() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    public EchoStatus(EchoStatus other) : this() {
+      code_ = other.code_;
+      message_ = other.message_;
+    }
+
+    public EchoStatus Clone() {
+      return new EchoStatus(this);
+    }
+
+    public const int CodeFieldNumber = 1;
+    private int code_;
+    public int Code {
+      get { return code_; }
+      set {
+        code_ = value;
+      }
+    }
+
+    public const int MessageFieldNumber = 2;
+    private string message_ = "";
+    public string Message {
+      get { return message_; }
+      set {
+        message_ = pb::Preconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    public override bool Equals(object other) {
+      return Equals(other as EchoStatus);
+    }
+
+    public bool Equals(EchoStatus other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Code != other.Code) return false;
+      if (Message != other.Message) return false;
+      return true;
+    }
+
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Code != 0) hash ^= Code.GetHashCode();
+      if (Message.Length != 0) hash ^= Message.GetHashCode();
+      return hash;
+    }
+
+    public override string ToString() {
+      return pb::JsonFormatter.Default.Format(this);
+    }
+
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Code != 0) {
+        output.WriteRawTag(8);
+        output.WriteInt32(Code);
+      }
+      if (Message.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(Message);
+      }
+    }
+
+    public int CalculateSize() {
+      int size = 0;
+      if (Code != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Code);
+      }
+      if (Message.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Message);
+      }
+      return size;
+    }
+
+    public void MergeFrom(EchoStatus other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Code != 0) {
+        Code = other.Code;
+      }
+      if (other.Message.Length != 0) {
+        Message = other.Message;
+      }
+    }
+
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            Code = input.ReadInt32();
+            break;
+          }
+          case 18: {
+            Message = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
   [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
   public sealed partial class SimpleRequest : pb::IMessage<SimpleRequest> {
     private static readonly pb::MessageParser<SimpleRequest> _parser = new pb::MessageParser<SimpleRequest>(() => new SimpleRequest());
     public static pb::MessageParser<SimpleRequest> Parser { get { return _parser; } }
 
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Grpc.Testing.Messages.Descriptor.MessageTypes[1]; }
+      get { return global::Grpc.Testing.Messages.Descriptor.MessageTypes[2]; }
     }
 
     pbr::MessageDescriptor pb::IMessage.Descriptor {
@@ -220,6 +365,8 @@ namespace Grpc.Testing {
       Payload = other.payload_ != null ? other.Payload.Clone() : null;
       fillUsername_ = other.fillUsername_;
       fillOauthScope_ = other.fillOauthScope_;
+      responseCompression_ = other.responseCompression_;
+      ResponseStatus = other.responseStatus_ != null ? other.ResponseStatus.Clone() : null;
     }
 
     public SimpleRequest Clone() {
@@ -271,6 +418,24 @@ namespace Grpc.Testing {
       }
     }
 
+    public const int ResponseCompressionFieldNumber = 6;
+    private global::Grpc.Testing.CompressionType responseCompression_ = global::Grpc.Testing.CompressionType.NONE;
+    public global::Grpc.Testing.CompressionType ResponseCompression {
+      get { return responseCompression_; }
+      set {
+        responseCompression_ = value;
+      }
+    }
+
+    public const int ResponseStatusFieldNumber = 7;
+    private global::Grpc.Testing.EchoStatus responseStatus_;
+    public global::Grpc.Testing.EchoStatus ResponseStatus {
+      get { return responseStatus_; }
+      set {
+        responseStatus_ = value;
+      }
+    }
+
     public override bool Equals(object other) {
       return Equals(other as SimpleRequest);
     }
@@ -287,6 +452,8 @@ namespace Grpc.Testing {
       if (!object.Equals(Payload, other.Payload)) return false;
       if (FillUsername != other.FillUsername) return false;
       if (FillOauthScope != other.FillOauthScope) return false;
+      if (ResponseCompression != other.ResponseCompression) return false;
+      if (!object.Equals(ResponseStatus, other.ResponseStatus)) return false;
       return true;
     }
 
@@ -297,6 +464,8 @@ namespace Grpc.Testing {
       if (payload_ != null) hash ^= Payload.GetHashCode();
       if (FillUsername != false) hash ^= FillUsername.GetHashCode();
       if (FillOauthScope != false) hash ^= FillOauthScope.GetHashCode();
+      if (ResponseCompression != global::Grpc.Testing.CompressionType.NONE) hash ^= ResponseCompression.GetHashCode();
+      if (responseStatus_ != null) hash ^= ResponseStatus.GetHashCode();
       return hash;
     }
 
@@ -325,6 +494,14 @@ namespace Grpc.Testing {
         output.WriteRawTag(40);
         output.WriteBool(FillOauthScope);
       }
+      if (ResponseCompression != global::Grpc.Testing.CompressionType.NONE) {
+        output.WriteRawTag(48);
+        output.WriteEnum((int) ResponseCompression);
+      }
+      if (responseStatus_ != null) {
+        output.WriteRawTag(58);
+        output.WriteMessage(ResponseStatus);
+      }
     }
 
     public int CalculateSize() {
@@ -344,6 +521,12 @@ namespace Grpc.Testing {
       if (FillOauthScope != false) {
         size += 1 + 1;
       }
+      if (ResponseCompression != global::Grpc.Testing.CompressionType.NONE) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ResponseCompression);
+      }
+      if (responseStatus_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(ResponseStatus);
+      }
       return size;
     }
 
@@ -369,6 +552,15 @@ namespace Grpc.Testing {
       if (other.FillOauthScope != false) {
         FillOauthScope = other.FillOauthScope;
       }
+      if (other.ResponseCompression != global::Grpc.Testing.CompressionType.NONE) {
+        ResponseCompression = other.ResponseCompression;
+      }
+      if (other.responseStatus_ != null) {
+        if (responseStatus_ == null) {
+          responseStatus_ = new global::Grpc.Testing.EchoStatus();
+        }
+        ResponseStatus.MergeFrom(other.ResponseStatus);
+      }
     }
 
     public void MergeFrom(pb::CodedInputStream input) {
@@ -401,6 +593,17 @@ namespace Grpc.Testing {
             FillOauthScope = input.ReadBool();
             break;
           }
+          case 48: {
+            responseCompression_ = (global::Grpc.Testing.CompressionType) input.ReadEnum();
+            break;
+          }
+          case 58: {
+            if (responseStatus_ == null) {
+              responseStatus_ = new global::Grpc.Testing.EchoStatus();
+            }
+            input.ReadMessage(responseStatus_);
+            break;
+          }
         }
       }
     }
@@ -413,7 +616,7 @@ namespace Grpc.Testing {
     public static pb::MessageParser<SimpleResponse> Parser { get { return _parser; } }
 
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Grpc.Testing.Messages.Descriptor.MessageTypes[2]; }
+      get { return global::Grpc.Testing.Messages.Descriptor.MessageTypes[3]; }
     }
 
     pbr::MessageDescriptor pb::IMessage.Descriptor {
@@ -573,7 +776,7 @@ namespace Grpc.Testing {
     public static pb::MessageParser<StreamingInputCallRequest> Parser { get { return _parser; } }
 
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Grpc.Testing.Messages.Descriptor.MessageTypes[3]; }
+      get { return global::Grpc.Testing.Messages.Descriptor.MessageTypes[4]; }
     }
 
     pbr::MessageDescriptor pb::IMessage.Descriptor {
@@ -681,7 +884,7 @@ namespace Grpc.Testing {
     public static pb::MessageParser<StreamingInputCallResponse> Parser { get { return _parser; } }
 
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Grpc.Testing.Messages.Descriptor.MessageTypes[4]; }
+      get { return global::Grpc.Testing.Messages.Descriptor.MessageTypes[5]; }
     }
 
     pbr::MessageDescriptor pb::IMessage.Descriptor {
@@ -783,7 +986,7 @@ namespace Grpc.Testing {
     public static pb::MessageParser<ResponseParameters> Parser { get { return _parser; } }
 
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Grpc.Testing.Messages.Descriptor.MessageTypes[5]; }
+      get { return global::Grpc.Testing.Messages.Descriptor.MessageTypes[6]; }
     }
 
     pbr::MessageDescriptor pb::IMessage.Descriptor {
@@ -911,7 +1114,7 @@ namespace Grpc.Testing {
     public static pb::MessageParser<StreamingOutputCallRequest> Parser { get { return _parser; } }
 
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Grpc.Testing.Messages.Descriptor.MessageTypes[6]; }
+      get { return global::Grpc.Testing.Messages.Descriptor.MessageTypes[7]; }
     }
 
     pbr::MessageDescriptor pb::IMessage.Descriptor {
@@ -928,6 +1131,8 @@ namespace Grpc.Testing {
       responseType_ = other.responseType_;
       responseParameters_ = other.responseParameters_.Clone();
       Payload = other.payload_ != null ? other.Payload.Clone() : null;
+      responseCompression_ = other.responseCompression_;
+      ResponseStatus = other.responseStatus_ != null ? other.ResponseStatus.Clone() : null;
     }
 
     public StreamingOutputCallRequest Clone() {
@@ -960,6 +1165,24 @@ namespace Grpc.Testing {
       }
     }
 
+    public const int ResponseCompressionFieldNumber = 6;
+    private global::Grpc.Testing.CompressionType responseCompression_ = global::Grpc.Testing.CompressionType.NONE;
+    public global::Grpc.Testing.CompressionType ResponseCompression {
+      get { return responseCompression_; }
+      set {
+        responseCompression_ = value;
+      }
+    }
+
+    public const int ResponseStatusFieldNumber = 7;
+    private global::Grpc.Testing.EchoStatus responseStatus_;
+    public global::Grpc.Testing.EchoStatus ResponseStatus {
+      get { return responseStatus_; }
+      set {
+        responseStatus_ = value;
+      }
+    }
+
     public override bool Equals(object other) {
       return Equals(other as StreamingOutputCallRequest);
     }
@@ -974,6 +1197,8 @@ namespace Grpc.Testing {
       if (ResponseType != other.ResponseType) return false;
       if(!responseParameters_.Equals(other.responseParameters_)) return false;
       if (!object.Equals(Payload, other.Payload)) return false;
+      if (ResponseCompression != other.ResponseCompression) return false;
+      if (!object.Equals(ResponseStatus, other.ResponseStatus)) return false;
       return true;
     }
 
@@ -982,6 +1207,8 @@ namespace Grpc.Testing {
       if (ResponseType != global::Grpc.Testing.PayloadType.COMPRESSABLE) hash ^= ResponseType.GetHashCode();
       hash ^= responseParameters_.GetHashCode();
       if (payload_ != null) hash ^= Payload.GetHashCode();
+      if (ResponseCompression != global::Grpc.Testing.CompressionType.NONE) hash ^= ResponseCompression.GetHashCode();
+      if (responseStatus_ != null) hash ^= ResponseStatus.GetHashCode();
       return hash;
     }
 
@@ -999,6 +1226,14 @@ namespace Grpc.Testing {
         output.WriteRawTag(26);
         output.WriteMessage(Payload);
       }
+      if (ResponseCompression != global::Grpc.Testing.CompressionType.NONE) {
+        output.WriteRawTag(48);
+        output.WriteEnum((int) ResponseCompression);
+      }
+      if (responseStatus_ != null) {
+        output.WriteRawTag(58);
+        output.WriteMessage(ResponseStatus);
+      }
     }
 
     public int CalculateSize() {
@@ -1010,6 +1245,12 @@ namespace Grpc.Testing {
       if (payload_ != null) {
         size += 1 + pb::CodedOutputStream.ComputeMessageSize(Payload);
       }
+      if (ResponseCompression != global::Grpc.Testing.CompressionType.NONE) {
+        size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) ResponseCompression);
+      }
+      if (responseStatus_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(ResponseStatus);
+      }
       return size;
     }
 
@@ -1027,6 +1268,15 @@ namespace Grpc.Testing {
         }
         Payload.MergeFrom(other.Payload);
       }
+      if (other.ResponseCompression != global::Grpc.Testing.CompressionType.NONE) {
+        ResponseCompression = other.ResponseCompression;
+      }
+      if (other.responseStatus_ != null) {
+        if (responseStatus_ == null) {
+          responseStatus_ = new global::Grpc.Testing.EchoStatus();
+        }
+        ResponseStatus.MergeFrom(other.ResponseStatus);
+      }
     }
 
     public void MergeFrom(pb::CodedInputStream input) {
@@ -1051,6 +1301,17 @@ namespace Grpc.Testing {
             input.ReadMessage(payload_);
             break;
           }
+          case 48: {
+            responseCompression_ = (global::Grpc.Testing.CompressionType) input.ReadEnum();
+            break;
+          }
+          case 58: {
+            if (responseStatus_ == null) {
+              responseStatus_ = new global::Grpc.Testing.EchoStatus();
+            }
+            input.ReadMessage(responseStatus_);
+            break;
+          }
         }
       }
     }
@@ -1063,7 +1324,7 @@ namespace Grpc.Testing {
     public static pb::MessageParser<StreamingOutputCallResponse> Parser { get { return _parser; } }
 
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Grpc.Testing.Messages.Descriptor.MessageTypes[7]; }
+      get { return global::Grpc.Testing.Messages.Descriptor.MessageTypes[8]; }
     }
 
     pbr::MessageDescriptor pb::IMessage.Descriptor {
@@ -1165,6 +1426,127 @@ namespace Grpc.Testing {
 
   }
 
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class ReconnectInfo : pb::IMessage<ReconnectInfo> {
+    private static readonly pb::MessageParser<ReconnectInfo> _parser = new pb::MessageParser<ReconnectInfo>(() => new ReconnectInfo());
+    public static pb::MessageParser<ReconnectInfo> Parser { get { return _parser; } }
+
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::Grpc.Testing.Messages.Descriptor.MessageTypes[9]; }
+    }
+
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    public ReconnectInfo() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    public ReconnectInfo(ReconnectInfo other) : this() {
+      passed_ = other.passed_;
+      backoffMs_ = other.backoffMs_.Clone();
+    }
+
+    public ReconnectInfo Clone() {
+      return new ReconnectInfo(this);
+    }
+
+    public const int PassedFieldNumber = 1;
+    private bool passed_;
+    public bool Passed {
+      get { return passed_; }
+      set {
+        passed_ = value;
+      }
+    }
+
+    public const int BackoffMsFieldNumber = 2;
+    private static readonly pb::FieldCodec<int> _repeated_backoffMs_codec
+        = pb::FieldCodec.ForInt32(18);
+    private readonly pbc::RepeatedField<int> backoffMs_ = new pbc::RepeatedField<int>();
+    public pbc::RepeatedField<int> BackoffMs {
+      get { return backoffMs_; }
+    }
+
+    public override bool Equals(object other) {
+      return Equals(other as ReconnectInfo);
+    }
+
+    public bool Equals(ReconnectInfo other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Passed != other.Passed) return false;
+      if(!backoffMs_.Equals(other.backoffMs_)) return false;
+      return true;
+    }
+
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Passed != false) hash ^= Passed.GetHashCode();
+      hash ^= backoffMs_.GetHashCode();
+      return hash;
+    }
+
+    public override string ToString() {
+      return pb::JsonFormatter.Default.Format(this);
+    }
+
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Passed != false) {
+        output.WriteRawTag(8);
+        output.WriteBool(Passed);
+      }
+      backoffMs_.WriteTo(output, _repeated_backoffMs_codec);
+    }
+
+    public int CalculateSize() {
+      int size = 0;
+      if (Passed != false) {
+        size += 1 + 1;
+      }
+      size += backoffMs_.CalculateSize(_repeated_backoffMs_codec);
+      return size;
+    }
+
+    public void MergeFrom(ReconnectInfo other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Passed != false) {
+        Passed = other.Passed;
+      }
+      backoffMs_.Add(other.backoffMs_);
+    }
+
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            Passed = input.ReadBool();
+            break;
+          }
+          case 18:
+          case 16: {
+            backoffMs_.AddEntriesFrom(input, _repeated_backoffMs_codec);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
   #endregion
 
 }
diff --git a/src/csharp/Grpc.IntegrationTesting/MetadataCredentialsTest.cs b/src/csharp/Grpc.IntegrationTesting/MetadataCredentialsTest.cs
new file mode 100644
index 0000000000000000000000000000000000000000..3d56678b990cc9ea7885171250b66d4301e5855e
--- /dev/null
+++ b/src/csharp/Grpc.IntegrationTesting/MetadataCredentialsTest.cs
@@ -0,0 +1,97 @@
+#region Copyright notice and license
+
+// Copyright 2015, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using Grpc.Core;
+using Grpc.Core.Utils;
+using Grpc.Testing;
+using NUnit.Framework;
+
+namespace Grpc.IntegrationTesting
+{
+    public class MetadataCredentialsTest
+    {
+        const string Host = "localhost";
+        Server server;
+        Channel channel;
+        TestService.ITestServiceClient client;
+
+        [TestFixtureSetUp]
+        public void Init()
+        {
+            var serverCredentials = new SslServerCredentials(new[] { new KeyCertificatePair(File.ReadAllText(TestCredentials.ServerCertChainPath), File.ReadAllText(TestCredentials.ServerPrivateKeyPath)) });
+            server = new Server
+            {
+                Services = { TestService.BindService(new TestServiceImpl()) },
+                Ports = { { Host, ServerPort.PickUnused, serverCredentials } }
+            };
+            server.Start();
+
+            var options = new List<ChannelOption>
+            {
+                new ChannelOption(ChannelOptions.SslTargetNameOverride, TestCredentials.DefaultHostOverride)
+            };
+
+            var asyncAuthInterceptor = new AsyncAuthInterceptor(async (authUri, metadata) =>
+            {
+                await Task.Delay(100);  // make sure the operation is asynchronous.
+                metadata.Add("authorization", "SECRET_TOKEN");
+            });
+
+            var clientCredentials = ChannelCredentials.Create(
+                new SslCredentials(File.ReadAllText(TestCredentials.ClientCertAuthorityPath)),
+                CallCredentials.FromInterceptor(asyncAuthInterceptor));
+            channel = new Channel(Host, server.Ports.Single().BoundPort, clientCredentials, options);
+            client = TestService.NewClient(channel);
+        }
+
+        [TestFixtureTearDown]
+        public void Cleanup()
+        {
+            channel.ShutdownAsync().Wait();
+            server.ShutdownAsync().Wait();
+        }
+
+        [Test]
+        public void MetadataCredentials()
+        {
+            var response = client.UnaryCall(new SimpleRequest { ResponseSize = 10 });
+            Assert.AreEqual(10, response.Payload.Body.Length);
+        }
+    }
+}
diff --git a/src/csharp/Grpc.IntegrationTesting/Test.cs b/src/csharp/Grpc.IntegrationTesting/Test.cs
index 466ec57d3dc59038722dfad44c13e04af2470050..cf477070587d20abea1104afa53a6db01e8c08b3 100644
--- a/src/csharp/Grpc.IntegrationTesting/Test.cs
+++ b/src/csharp/Grpc.IntegrationTesting/Test.cs
@@ -1,5 +1,5 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
-// source: test.proto
+// source: test/proto/test.proto
 #pragma warning disable 1591, 0612, 3021
 #region Designer generated code
 
@@ -21,21 +21,26 @@ namespace Grpc.Testing {
     static Test() {
       byte[] descriptorData = global::System.Convert.FromBase64String(
           string.Concat(
-            "Cgp0ZXN0LnByb3RvEgxncnBjLnRlc3RpbmcaC2VtcHR5LnByb3RvGg5tZXNz", 
-            "YWdlcy5wcm90bzK7BAoLVGVzdFNlcnZpY2USNQoJRW1wdHlDYWxsEhMuZ3Jw", 
-            "Yy50ZXN0aW5nLkVtcHR5GhMuZ3JwYy50ZXN0aW5nLkVtcHR5EkYKCVVuYXJ5", 
-            "Q2FsbBIbLmdycGMudGVzdGluZy5TaW1wbGVSZXF1ZXN0GhwuZ3JwYy50ZXN0", 
-            "aW5nLlNpbXBsZVJlc3BvbnNlEmwKE1N0cmVhbWluZ091dHB1dENhbGwSKC5n", 
-            "cnBjLnRlc3RpbmcuU3RyZWFtaW5nT3V0cHV0Q2FsbFJlcXVlc3QaKS5ncnBj", 
-            "LnRlc3RpbmcuU3RyZWFtaW5nT3V0cHV0Q2FsbFJlc3BvbnNlMAESaQoSU3Ry", 
-            "ZWFtaW5nSW5wdXRDYWxsEicuZ3JwYy50ZXN0aW5nLlN0cmVhbWluZ0lucHV0", 
-            "Q2FsbFJlcXVlc3QaKC5ncnBjLnRlc3RpbmcuU3RyZWFtaW5nSW5wdXRDYWxs", 
-            "UmVzcG9uc2UoARJpCg5GdWxsRHVwbGV4Q2FsbBIoLmdycGMudGVzdGluZy5T", 
-            "dHJlYW1pbmdPdXRwdXRDYWxsUmVxdWVzdBopLmdycGMudGVzdGluZy5TdHJl", 
-            "YW1pbmdPdXRwdXRDYWxsUmVzcG9uc2UoATABEmkKDkhhbGZEdXBsZXhDYWxs", 
-            "EiguZ3JwYy50ZXN0aW5nLlN0cmVhbWluZ091dHB1dENhbGxSZXF1ZXN0Giku", 
-            "Z3JwYy50ZXN0aW5nLlN0cmVhbWluZ091dHB1dENhbGxSZXNwb25zZSgBMAFi", 
-            "BnByb3RvMw=="));
+            "ChV0ZXN0L3Byb3RvL3Rlc3QucHJvdG8SDGdycGMudGVzdGluZxoWdGVzdC9w", 
+            "cm90by9lbXB0eS5wcm90bxoZdGVzdC9wcm90by9tZXNzYWdlcy5wcm90bzK7", 
+            "BAoLVGVzdFNlcnZpY2USNQoJRW1wdHlDYWxsEhMuZ3JwYy50ZXN0aW5nLkVt", 
+            "cHR5GhMuZ3JwYy50ZXN0aW5nLkVtcHR5EkYKCVVuYXJ5Q2FsbBIbLmdycGMu", 
+            "dGVzdGluZy5TaW1wbGVSZXF1ZXN0GhwuZ3JwYy50ZXN0aW5nLlNpbXBsZVJl", 
+            "c3BvbnNlEmwKE1N0cmVhbWluZ091dHB1dENhbGwSKC5ncnBjLnRlc3Rpbmcu", 
+            "U3RyZWFtaW5nT3V0cHV0Q2FsbFJlcXVlc3QaKS5ncnBjLnRlc3RpbmcuU3Ry", 
+            "ZWFtaW5nT3V0cHV0Q2FsbFJlc3BvbnNlMAESaQoSU3RyZWFtaW5nSW5wdXRD", 
+            "YWxsEicuZ3JwYy50ZXN0aW5nLlN0cmVhbWluZ0lucHV0Q2FsbFJlcXVlc3Qa", 
+            "KC5ncnBjLnRlc3RpbmcuU3RyZWFtaW5nSW5wdXRDYWxsUmVzcG9uc2UoARJp", 
+            "Cg5GdWxsRHVwbGV4Q2FsbBIoLmdycGMudGVzdGluZy5TdHJlYW1pbmdPdXRw", 
+            "dXRDYWxsUmVxdWVzdBopLmdycGMudGVzdGluZy5TdHJlYW1pbmdPdXRwdXRD", 
+            "YWxsUmVzcG9uc2UoATABEmkKDkhhbGZEdXBsZXhDYWxsEiguZ3JwYy50ZXN0", 
+            "aW5nLlN0cmVhbWluZ091dHB1dENhbGxSZXF1ZXN0GikuZ3JwYy50ZXN0aW5n", 
+            "LlN0cmVhbWluZ091dHB1dENhbGxSZXNwb25zZSgBMAEyVQoUVW5pbXBsZW1l", 
+            "bnRlZFNlcnZpY2USPQoRVW5pbXBsZW1lbnRlZENhbGwSEy5ncnBjLnRlc3Rp", 
+            "bmcuRW1wdHkaEy5ncnBjLnRlc3RpbmcuRW1wdHkyfwoQUmVjb25uZWN0U2Vy", 
+            "dmljZRIxCgVTdGFydBITLmdycGMudGVzdGluZy5FbXB0eRoTLmdycGMudGVz", 
+            "dGluZy5FbXB0eRI4CgRTdG9wEhMuZ3JwYy50ZXN0aW5nLkVtcHR5GhsuZ3Jw", 
+            "Yy50ZXN0aW5nLlJlY29ubmVjdEluZm9iBnByb3RvMw=="));
       descriptor = pbr::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData,
           new pbr::FileDescriptor[] { global::Grpc.Testing.Proto.Empty.Descriptor, global::Grpc.Testing.Messages.Descriptor, },
           new pbr::GeneratedCodeInfo(null, null));
diff --git a/src/csharp/Grpc.IntegrationTesting/TestGrpc.cs b/src/csharp/Grpc.IntegrationTesting/TestGrpc.cs
index f63e1484759c5510faef2e194fcd163dc47d37bd..8c884b74086e5a29a95c0c69874a02f6e03aa8b6 100644
--- a/src/csharp/Grpc.IntegrationTesting/TestGrpc.cs
+++ b/src/csharp/Grpc.IntegrationTesting/TestGrpc.cs
@@ -1,5 +1,5 @@
 // Generated by the protocol buffer compiler.  DO NOT EDIT!
-// source: test.proto
+// source: test/proto/test.proto
 #region Designer generated code
 
 using System;
@@ -207,5 +207,191 @@ namespace Grpc.Testing {
     }
 
   }
+  public static class UnimplementedService
+  {
+    static readonly string __ServiceName = "grpc.testing.UnimplementedService";
+
+    static readonly Marshaller<global::Grpc.Testing.Empty> __Marshaller_Empty = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.Empty.Parser.ParseFrom);
+
+    static readonly Method<global::Grpc.Testing.Empty, global::Grpc.Testing.Empty> __Method_UnimplementedCall = new Method<global::Grpc.Testing.Empty, global::Grpc.Testing.Empty>(
+        MethodType.Unary,
+        __ServiceName,
+        "UnimplementedCall",
+        __Marshaller_Empty,
+        __Marshaller_Empty);
+
+    // service descriptor
+    public static global::Google.Protobuf.Reflection.ServiceDescriptor Descriptor
+    {
+      get { return global::Grpc.Testing.Test.Descriptor.Services[1]; }
+    }
+
+    // client interface
+    public interface IUnimplementedServiceClient
+    {
+      global::Grpc.Testing.Empty UnimplementedCall(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken));
+      global::Grpc.Testing.Empty UnimplementedCall(global::Grpc.Testing.Empty request, CallOptions options);
+      AsyncUnaryCall<global::Grpc.Testing.Empty> UnimplementedCallAsync(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken));
+      AsyncUnaryCall<global::Grpc.Testing.Empty> UnimplementedCallAsync(global::Grpc.Testing.Empty request, CallOptions options);
+    }
+
+    // server-side interface
+    public interface IUnimplementedService
+    {
+      Task<global::Grpc.Testing.Empty> UnimplementedCall(global::Grpc.Testing.Empty request, ServerCallContext context);
+    }
+
+    // client stub
+    public class UnimplementedServiceClient : ClientBase, IUnimplementedServiceClient
+    {
+      public UnimplementedServiceClient(Channel channel) : base(channel)
+      {
+      }
+      public global::Grpc.Testing.Empty UnimplementedCall(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
+      {
+        var call = CreateCall(__Method_UnimplementedCall, new CallOptions(headers, deadline, cancellationToken));
+        return Calls.BlockingUnaryCall(call, request);
+      }
+      public global::Grpc.Testing.Empty UnimplementedCall(global::Grpc.Testing.Empty request, CallOptions options)
+      {
+        var call = CreateCall(__Method_UnimplementedCall, options);
+        return Calls.BlockingUnaryCall(call, request);
+      }
+      public AsyncUnaryCall<global::Grpc.Testing.Empty> UnimplementedCallAsync(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
+      {
+        var call = CreateCall(__Method_UnimplementedCall, new CallOptions(headers, deadline, cancellationToken));
+        return Calls.AsyncUnaryCall(call, request);
+      }
+      public AsyncUnaryCall<global::Grpc.Testing.Empty> UnimplementedCallAsync(global::Grpc.Testing.Empty request, CallOptions options)
+      {
+        var call = CreateCall(__Method_UnimplementedCall, options);
+        return Calls.AsyncUnaryCall(call, request);
+      }
+    }
+
+    // creates service definition that can be registered with a server
+    public static ServerServiceDefinition BindService(IUnimplementedService serviceImpl)
+    {
+      return ServerServiceDefinition.CreateBuilder(__ServiceName)
+          .AddMethod(__Method_UnimplementedCall, serviceImpl.UnimplementedCall).Build();
+    }
+
+    // creates a new client
+    public static UnimplementedServiceClient NewClient(Channel channel)
+    {
+      return new UnimplementedServiceClient(channel);
+    }
+
+  }
+  public static class ReconnectService
+  {
+    static readonly string __ServiceName = "grpc.testing.ReconnectService";
+
+    static readonly Marshaller<global::Grpc.Testing.Empty> __Marshaller_Empty = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.Empty.Parser.ParseFrom);
+    static readonly Marshaller<global::Grpc.Testing.ReconnectInfo> __Marshaller_ReconnectInfo = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.ReconnectInfo.Parser.ParseFrom);
+
+    static readonly Method<global::Grpc.Testing.Empty, global::Grpc.Testing.Empty> __Method_Start = new Method<global::Grpc.Testing.Empty, global::Grpc.Testing.Empty>(
+        MethodType.Unary,
+        __ServiceName,
+        "Start",
+        __Marshaller_Empty,
+        __Marshaller_Empty);
+
+    static readonly Method<global::Grpc.Testing.Empty, global::Grpc.Testing.ReconnectInfo> __Method_Stop = new Method<global::Grpc.Testing.Empty, global::Grpc.Testing.ReconnectInfo>(
+        MethodType.Unary,
+        __ServiceName,
+        "Stop",
+        __Marshaller_Empty,
+        __Marshaller_ReconnectInfo);
+
+    // service descriptor
+    public static global::Google.Protobuf.Reflection.ServiceDescriptor Descriptor
+    {
+      get { return global::Grpc.Testing.Test.Descriptor.Services[2]; }
+    }
+
+    // client interface
+    public interface IReconnectServiceClient
+    {
+      global::Grpc.Testing.Empty Start(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken));
+      global::Grpc.Testing.Empty Start(global::Grpc.Testing.Empty request, CallOptions options);
+      AsyncUnaryCall<global::Grpc.Testing.Empty> StartAsync(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken));
+      AsyncUnaryCall<global::Grpc.Testing.Empty> StartAsync(global::Grpc.Testing.Empty request, CallOptions options);
+      global::Grpc.Testing.ReconnectInfo Stop(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken));
+      global::Grpc.Testing.ReconnectInfo Stop(global::Grpc.Testing.Empty request, CallOptions options);
+      AsyncUnaryCall<global::Grpc.Testing.ReconnectInfo> StopAsync(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken));
+      AsyncUnaryCall<global::Grpc.Testing.ReconnectInfo> StopAsync(global::Grpc.Testing.Empty request, CallOptions options);
+    }
+
+    // server-side interface
+    public interface IReconnectService
+    {
+      Task<global::Grpc.Testing.Empty> Start(global::Grpc.Testing.Empty request, ServerCallContext context);
+      Task<global::Grpc.Testing.ReconnectInfo> Stop(global::Grpc.Testing.Empty request, ServerCallContext context);
+    }
+
+    // client stub
+    public class ReconnectServiceClient : ClientBase, IReconnectServiceClient
+    {
+      public ReconnectServiceClient(Channel channel) : base(channel)
+      {
+      }
+      public global::Grpc.Testing.Empty Start(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
+      {
+        var call = CreateCall(__Method_Start, new CallOptions(headers, deadline, cancellationToken));
+        return Calls.BlockingUnaryCall(call, request);
+      }
+      public global::Grpc.Testing.Empty Start(global::Grpc.Testing.Empty request, CallOptions options)
+      {
+        var call = CreateCall(__Method_Start, options);
+        return Calls.BlockingUnaryCall(call, request);
+      }
+      public AsyncUnaryCall<global::Grpc.Testing.Empty> StartAsync(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
+      {
+        var call = CreateCall(__Method_Start, new CallOptions(headers, deadline, cancellationToken));
+        return Calls.AsyncUnaryCall(call, request);
+      }
+      public AsyncUnaryCall<global::Grpc.Testing.Empty> StartAsync(global::Grpc.Testing.Empty request, CallOptions options)
+      {
+        var call = CreateCall(__Method_Start, options);
+        return Calls.AsyncUnaryCall(call, request);
+      }
+      public global::Grpc.Testing.ReconnectInfo Stop(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
+      {
+        var call = CreateCall(__Method_Stop, new CallOptions(headers, deadline, cancellationToken));
+        return Calls.BlockingUnaryCall(call, request);
+      }
+      public global::Grpc.Testing.ReconnectInfo Stop(global::Grpc.Testing.Empty request, CallOptions options)
+      {
+        var call = CreateCall(__Method_Stop, options);
+        return Calls.BlockingUnaryCall(call, request);
+      }
+      public AsyncUnaryCall<global::Grpc.Testing.ReconnectInfo> StopAsync(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
+      {
+        var call = CreateCall(__Method_Stop, new CallOptions(headers, deadline, cancellationToken));
+        return Calls.AsyncUnaryCall(call, request);
+      }
+      public AsyncUnaryCall<global::Grpc.Testing.ReconnectInfo> StopAsync(global::Grpc.Testing.Empty request, CallOptions options)
+      {
+        var call = CreateCall(__Method_Stop, options);
+        return Calls.AsyncUnaryCall(call, request);
+      }
+    }
+
+    // creates service definition that can be registered with a server
+    public static ServerServiceDefinition BindService(IReconnectService serviceImpl)
+    {
+      return ServerServiceDefinition.CreateBuilder(__ServiceName)
+          .AddMethod(__Method_Start, serviceImpl.Start)
+          .AddMethod(__Method_Stop, serviceImpl.Stop).Build();
+    }
+
+    // creates a new client
+    public static ReconnectServiceClient NewClient(Channel channel)
+    {
+      return new ReconnectServiceClient(channel);
+    }
+
+  }
 }
 #endregion
diff --git a/src/csharp/Grpc.IntegrationTesting/proto/empty.proto b/src/csharp/Grpc.IntegrationTesting/proto/empty.proto
deleted file mode 100644
index 6d0eb937d674ca3ee9aaf9c2ed8313250cd76647..0000000000000000000000000000000000000000
--- a/src/csharp/Grpc.IntegrationTesting/proto/empty.proto
+++ /dev/null
@@ -1,43 +0,0 @@
-
-// Copyright 2015, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//     * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-syntax = "proto3";
-
-package grpc.testing;
-
-// An empty message that you can re-use to avoid defining duplicated empty
-// messages in your project. A typical example is to use it as argument or the
-// return value of a service API. For instance:
-//
-//   service Foo {
-//     rpc Bar (grpc.testing.Empty) returns (grpc.testing.Empty) { };
-//   };
-//
-message Empty {}
diff --git a/src/csharp/Grpc.IntegrationTesting/proto/messages.proto b/src/csharp/Grpc.IntegrationTesting/proto/messages.proto
deleted file mode 100644
index 7df85e3c13601ddc64e85a07eeadd502759a5761..0000000000000000000000000000000000000000
--- a/src/csharp/Grpc.IntegrationTesting/proto/messages.proto
+++ /dev/null
@@ -1,132 +0,0 @@
-
-// Copyright 2015, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//     * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// Message definitions to be used by integration test service definitions.
-
-syntax = "proto3";
-
-package grpc.testing;
-
-// The type of payload that should be returned.
-enum PayloadType {
-  // Compressable text format.
-  COMPRESSABLE = 0;
-
-  // Uncompressable binary format.
-  UNCOMPRESSABLE = 1;
-
-  // Randomly chosen from all other formats defined in this enum.
-  RANDOM = 2;
-}
-
-// A block of data, to simply increase gRPC message size.
-message Payload {
-  // The type of data in body.
-  PayloadType type = 1;
-  // Primary contents of payload.
-  bytes body = 2;
-}
-
-// Unary request.
-message SimpleRequest {
-  // Desired payload type in the response from the server.
-  // If response_type is RANDOM, server randomly chooses one from other formats.
-  PayloadType response_type = 1;
-
-  // Desired payload size in the response from the server.
-  // If response_type is COMPRESSABLE, this denotes the size before compression.
-  int32 response_size = 2;
-
-  // Optional input payload sent along with the request.
-  Payload payload = 3;
-
-  // Whether SimpleResponse should include username.
-  bool fill_username = 4;
-
-  // Whether SimpleResponse should include OAuth scope.
-  bool fill_oauth_scope = 5;
-}
-
-// Unary response, as configured by the request.
-message SimpleResponse {
-  // Payload to increase message size.
-  Payload payload = 1;
-  // The user the request came from, for verifying authentication was
-  // successful when the client expected it.
-  string username = 2;
-  // OAuth scope.
-  string oauth_scope = 3;
-}
-
-// Client-streaming request.
-message StreamingInputCallRequest {
-  // Optional input payload sent along with the request.
-  Payload payload = 1;
-
-  // Not expecting any payload from the response.
-}
-
-// Client-streaming response.
-message StreamingInputCallResponse {
-  // Aggregated size of payloads received from the client.
-  int32 aggregated_payload_size = 1;
-}
-
-// Configuration for a particular response.
-message ResponseParameters {
-  // Desired payload sizes in responses from the server.
-  // If response_type is COMPRESSABLE, this denotes the size before compression.
-  int32 size = 1;
-
-  // Desired interval between consecutive responses in the response stream in
-  // microseconds.
-  int32 interval_us = 2;
-}
-
-// Server-streaming request.
-message StreamingOutputCallRequest {
-  // Desired payload type in the response from the server.
-  // If response_type is RANDOM, the payload from each response in the stream
-  // might be of different types. This is to simulate a mixed type of payload
-  // stream.
-  PayloadType response_type = 1;
-
-  // Configuration for each expected response message.
-  repeated ResponseParameters response_parameters = 2;
-
-  // Optional input payload sent along with the request.
-  Payload payload = 3;
-}
-
-// Server-streaming response, as configured by the request and parameters.
-message StreamingOutputCallResponse {
-  // Payload to increase response size.
-  Payload payload = 1;
-}
diff --git a/src/csharp/Grpc.IntegrationTesting/proto/test.proto b/src/csharp/Grpc.IntegrationTesting/proto/test.proto
deleted file mode 100644
index 5496f72af07bcb3cab6505ac21258e6ae08bac46..0000000000000000000000000000000000000000
--- a/src/csharp/Grpc.IntegrationTesting/proto/test.proto
+++ /dev/null
@@ -1,71 +0,0 @@
-
-// Copyright 2015, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//     * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// An integration test service that covers all the method signature permutations
-// of unary/streaming requests/responses.
-syntax = "proto3";
-
-import "empty.proto";
-import "messages.proto";
-
-package grpc.testing;
-
-// A simple service to test the various types of RPCs and experiment with
-// performance with various types of payload.
-service TestService {
-  // One empty request followed by one empty response.
-  rpc EmptyCall(grpc.testing.Empty) returns (grpc.testing.Empty);
-
-  // One request followed by one response.
-  rpc UnaryCall(SimpleRequest) returns (SimpleResponse);
-
-  // One request followed by a sequence of responses (streamed download).
-  // The server returns the payload with client desired type and sizes.
-  rpc StreamingOutputCall(StreamingOutputCallRequest)
-      returns (stream StreamingOutputCallResponse);
-
-  // A sequence of requests followed by one response (streamed upload).
-  // The server returns the aggregated size of client payload as the result.
-  rpc StreamingInputCall(stream StreamingInputCallRequest)
-      returns (StreamingInputCallResponse);
-
-  // A sequence of requests with each request served by the server immediately.
-  // As one request could lead to multiple responses, this interface
-  // demonstrates the idea of full duplexing.
-  rpc FullDuplexCall(stream StreamingOutputCallRequest)
-      returns (stream StreamingOutputCallResponse);
-
-  // A sequence of requests followed by a sequence of responses.
-  // The server buffers all the client requests and then serves them in order. A
-  // stream of responses are returned to the client when the server starts with
-  // first request.
-  rpc HalfDuplexCall(stream StreamingOutputCallRequest)
-      returns (stream StreamingOutputCallResponse);
-}
diff --git a/src/csharp/build_packages.bat b/src/csharp/build_packages.bat
index a3505b1e0126358a64ff4fcb32a9209dac17c47a..b864a955a89d2b3b2badbf2f720f84b27497fa31 100644
--- a/src/csharp/build_packages.bat
+++ b/src/csharp/build_packages.bat
@@ -20,9 +20,9 @@ endlocal
 
 @call ..\..\vsprojects\build_plugins.bat || goto :error
 
-%NUGET% pack ..\..\vsprojects\nuget_package\grpc.native.csharp_ext.nuspec -Version %CORE_VERSION% || goto :error
+%NUGET% pack ..\..\vsprojects\nuget_package\grpc.native.csharp.nuspec -Version %CORE_VERSION% || goto :error
 %NUGET% pack Grpc.Auth\Grpc.Auth.nuspec -Symbols -Version %VERSION% || goto :error
-%NUGET% pack Grpc.Core\Grpc.Core.nuspec -Symbols -Version %VERSION% -Properties GrpcNativeCsharpExtVersion=%CORE_VERSION% || goto :error
+%NUGET% pack Grpc.Core\Grpc.Core.nuspec -Symbols -Version %VERSION% -Properties GrpcNativeCsharpVersion=%CORE_VERSION% || goto :error
 %NUGET% pack Grpc.HealthCheck\Grpc.HealthCheck.nuspec -Symbols -Version %VERSION_WITH_BETA% -Properties ProtobufVersion=%PROTOBUF_VERSION% || goto :error
 %NUGET% pack Grpc.Tools.nuspec -Version %VERSION% || goto :error
 %NUGET% pack Grpc.nuspec -Version %VERSION% || goto :error
diff --git a/src/csharp/ext/grpc_csharp_ext.c b/src/csharp/ext/grpc_csharp_ext.c
index 51e0728fb9dd17b7a7c6b88ecb7ed27a2836a620..679ca43d74913c570a1b1c58988aae75af092b04 100644
--- a/src/csharp/ext/grpc_csharp_ext.c
+++ b/src/csharp/ext/grpc_csharp_ext.c
@@ -68,7 +68,7 @@ grpc_byte_buffer *string_to_byte_buffer(const char *buffer, size_t len) {
 /*
  * Helper to maintain lifetime of batch op inputs and store batch op outputs.
  */
-typedef struct gprcsharp_batch_context {
+typedef struct grpcsharp_batch_context {
   grpc_metadata_array send_initial_metadata;
   grpc_byte_buffer *send_message;
   struct {
@@ -665,16 +665,16 @@ grpcsharp_call_start_duplex_streaming(grpc_call *call,
 }
 
 GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_recv_initial_metadata(
-	grpc_call *call, grpcsharp_batch_context *ctx) {
-	/* TODO: don't use magic number */
-	grpc_op ops[1];
-	ops[0].op = GRPC_OP_RECV_INITIAL_METADATA;
-	ops[0].data.recv_initial_metadata = &(ctx->recv_initial_metadata);
-	ops[0].flags = 0;
-	ops[0].reserved = NULL;
+  grpc_call *call, grpcsharp_batch_context *ctx) {
+  /* TODO: don't use magic number */
+  grpc_op ops[1];
+  ops[0].op = GRPC_OP_RECV_INITIAL_METADATA;
+  ops[0].data.recv_initial_metadata = &(ctx->recv_initial_metadata);
+  ops[0].flags = 0;
+  ops[0].reserved = NULL;
 
-	return grpc_call_start_batch(call, ops, sizeof(ops) / sizeof(ops[0]), ctx,
-		NULL);
+  return grpc_call_start_batch(call, ops, sizeof(ops) / sizeof(ops[0]), ctx,
+    NULL);
 }
 
 GPR_EXPORT grpc_call_error GPR_CALLTYPE
@@ -785,6 +785,11 @@ grpcsharp_call_send_initial_metadata(grpc_call *call,
                                NULL);
 }
 
+GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_set_credentials(grpc_call *call,
+                                                            grpc_credentials *creds) {
+	return grpc_call_set_credentials(call, creds);
+}
+
 /* Server */
 
 GPR_EXPORT grpc_server *GPR_CALLTYPE
@@ -892,6 +897,47 @@ grpcsharp_server_add_secure_http2_port(grpc_server *server, const char *addr,
   return grpc_server_add_secure_http2_port(server, addr, creds);
 }
 
+GPR_EXPORT grpc_credentials *GPR_CALLTYPE grpcsharp_composite_credentials_create(
+  grpc_credentials *creds1,
+  grpc_credentials *creds2) {
+  return grpc_composite_credentials_create(creds1, creds2, NULL);
+}
+
+/* Metadata credentials plugin */
+
+GPR_EXPORT void GPR_CALLTYPE grpcsharp_metadata_credentials_notify_from_plugin(
+    grpc_credentials_plugin_metadata_cb cb,
+    void *user_data, grpc_metadata_array *metadata,
+  grpc_status_code status, const char *error_details) {
+  cb(user_data, metadata->metadata, metadata->count, status, error_details);
+}
+
+typedef void(GPR_CALLTYPE *grpcsharp_metadata_interceptor_func)(
+  void *state, const char *service_url, grpc_credentials_plugin_metadata_cb cb,
+  void *user_data, gpr_int32 is_destroy);
+
+static void grpcsharp_get_metadata_handler(void *state, const char *service_url,
+  grpc_credentials_plugin_metadata_cb cb, void *user_data) {
+  grpcsharp_metadata_interceptor_func interceptor =
+      (grpcsharp_metadata_interceptor_func)(gpr_intptr)state;
+  interceptor(state, service_url, cb, user_data, 0);
+}
+
+static void grpcsharp_metadata_credentials_destroy_handler(void *state) {
+  grpcsharp_metadata_interceptor_func interceptor =
+      (grpcsharp_metadata_interceptor_func)(gpr_intptr)state;
+  interceptor(state, NULL, NULL, NULL, 1);
+}
+
+GPR_EXPORT grpc_credentials *GPR_CALLTYPE grpcsharp_metadata_credentials_create_from_plugin(
+  grpcsharp_metadata_interceptor_func metadata_interceptor) {
+  grpc_metadata_credentials_plugin plugin;
+  plugin.get_metadata = grpcsharp_get_metadata_handler;
+  plugin.destroy = grpcsharp_metadata_credentials_destroy_handler;
+  plugin.state = (void*)(gpr_intptr)metadata_interceptor;
+  return grpc_metadata_credentials_create_from_plugin(plugin, NULL);
+}
+
 /* Logging */
 
 typedef void(GPR_CALLTYPE *grpcsharp_log_func)(const char *file, gpr_int32 line,
diff --git a/src/csharp/generate_proto_csharp.sh b/src/csharp/generate_proto_csharp.sh
index a17f45b58741850355e244d8ea5fce29b54e1edb..f879e074aa55a21b69dfe6c5f31e29fb34fdff6d 100755
--- a/src/csharp/generate_proto_csharp.sh
+++ b/src/csharp/generate_proto_csharp.sh
@@ -42,7 +42,7 @@ $PROTOC --plugin=$PLUGIN --csharp_out=$EXAMPLES_DIR --grpc_out=$EXAMPLES_DIR \
     -I $EXAMPLES_DIR/proto $EXAMPLES_DIR/proto/math.proto
 
 $PROTOC --plugin=$PLUGIN --csharp_out=$INTEROP_DIR --grpc_out=$INTEROP_DIR \
-    -I $INTEROP_DIR/proto $INTEROP_DIR/proto/*.proto
+    -I ../.. ../../test/proto/*.proto
 
 $PROTOC --plugin=$PLUGIN --csharp_out=$HEALTHCHECK_DIR --grpc_out=$HEALTHCHECK_DIR \
     -I $HEALTHCHECK_DIR/proto $HEALTHCHECK_DIR/proto/health.proto
diff --git a/src/node/LICENSE b/src/node/LICENSE
deleted file mode 100644
index 0209b570e10da54c158654433c5d3212b548c352..0000000000000000000000000000000000000000
--- a/src/node/LICENSE
+++ /dev/null
@@ -1,28 +0,0 @@
-Copyright 2015, Google Inc.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-    * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
-    * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/src/node/README.md b/src/node/README.md
index 7719d082900c2122b8d9e684b05ba42f19e0b0fc..5d89e2228db79f1da5c8e38c665916a344030c53 100644
--- a/src/node/README.md
+++ b/src/node/README.md
@@ -5,51 +5,19 @@ Beta
 
 ## PREREQUISITES
 - `node`: This requires `node` to be installed. If you instead have the `nodejs` executable on Debian, you should install the [`nodejs-legacy`](https://packages.debian.org/sid/nodejs-legacy) package.
-- [homebrew][] on Mac OS X.  These simplify the installation of the gRPC C core.
 
 ## INSTALLATION
 
-**Linux (Debian):**
-
-Add [Debian jessie-backports][] to your `sources.list` file. Example:
-
-```sh
-echo "deb http://http.debian.net/debian jessie-backports main" | \
-sudo tee -a /etc/apt/sources.list
-```
-
-Install the gRPC Debian package
-
-```sh
-sudo apt-get update
-sudo apt-get install libgrpc-dev
-```
-
 Install the gRPC NPM package
 
 ```sh
 npm install grpc
 ```
 
-**Mac OS X**
-
-Install [homebrew][]. Run the following command to install gRPC Node.js.
-```sh
-$ curl -fsSL https://goo.gl/getgrpc | bash -s nodejs
-```
-This will download and run the [gRPC install script][], then install the latest version of gRPC Nodejs npm package.
-
 ## BUILD FROM SOURCE
  1. Clone [the grpc Git Repository](https://github.com/grpc/grpc).
- 2. Follow the instructions in the `INSTALL` file in the root of that repository to install the C core library that this package depends on.
  3. Run `npm install`.
 
-If you install the gRPC C core library in a custom location, then you need to set some environment variables to install this library. The command will look like this:
-
-```sh
-CXXFLAGS=-I<custom location>/include LDFLAGS=-L<custom location>/lib npm install [grpc]
-```
-
 ## TESTING
 To run the test suite, simply run `npm test` in the install location.
 
@@ -110,7 +78,3 @@ ServerCredentials
 ```
 
 An object with factory methods for creating credential objects for servers.
-
-[homebrew]:http://brew.sh
-[gRPC install script]:https://raw.githubusercontent.com/grpc/homebrew-grpc/master/scripts/install
-[Debian jessie-backports]:http://backports.debian.org/Instructions/
diff --git a/src/node/bin/README.md b/src/node/bin/README.md
deleted file mode 100644
index 2f856e428ef7b8ad9723e503f09685a8a4ec77e8..0000000000000000000000000000000000000000
--- a/src/node/bin/README.md
+++ /dev/null
@@ -1,16 +0,0 @@
-# Command Line Tools
-
-# Service Packager
-
-The command line tool `bin/service_packager`, when called with the following command line:
-
-```bash
-service_packager proto_file -o output_path -n name -v version [-i input_path...]
-```
-
-Populates `output_path` with a node package consisting of a `package.json` populated with `name` and `version`, an `index.js`, a `LICENSE` file copied from gRPC, and a `service.json`, which is compiled from `proto_file` and the given `input_path`s. `require('output_path')` returns an object that is equivalent to
-
-```js
-{ client: require('grpc').load('service.json'),
-  auth: require('google-auth-library') }
-```
diff --git a/src/node/bin/service_packager b/src/node/bin/service_packager
deleted file mode 100755
index c7f24609977eee53c6ccda137b057ddb1aadbc60..0000000000000000000000000000000000000000
--- a/src/node/bin/service_packager
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/usr/bin/env node
-require(__dirname+'/../cli/service_packager.js').main(process.argv.slice(2));
\ No newline at end of file
diff --git a/src/node/binding.gyp b/src/node/binding.gyp
deleted file mode 100644
index 247719e981367e5feb416abf69b106cf5b5dde5e..0000000000000000000000000000000000000000
--- a/src/node/binding.gyp
+++ /dev/null
@@ -1,100 +0,0 @@
-{
-  "variables" : {
-    'config': '<!(echo $CONFIG)'
-  },
-  "targets" : [
-    {
-      'include_dirs': [
-        "<!(node -e \"require('nan')\")"
-      ],
-      'cflags': [
-        '-std=c++0x',
-        '-Wall',
-        '-pthread',
-        '-g',
-        '-zdefs',
-        '-Werror',
-        '-Wno-error=deprecated-declarations'
-      ],
-      'ldflags': [
-        '-g'
-      ],
-      "conditions": [
-        ['OS != "win"', {
-          'variables': {
-            'pkg_config_grpc': '<!(pkg-config --exists grpc >/dev/null 2>&1 && echo true || echo false)'
-          },
-          'conditions': [
-            ['config=="gcov"', {
-              'cflags': [
-                '-ftest-coverage',
-                '-fprofile-arcs',
-                '-O0'
-              ],
-              'ldflags': [
-                '-ftest-coverage',
-                '-fprofile-arcs'
-              ]
-            }
-           ],
-            ['pkg_config_grpc == "true"', {
-              'link_settings': {
-                'libraries': [
-                  '<!@(pkg-config --libs-only-l --static grpc)'
-                ]
-              },
-              'cflags': [
-                '<!@(pkg-config --cflags grpc)'
-              ],
-              'libraries': [
-                '<!@(pkg-config --libs-only-L --static grpc)'
-              ],
-              'ldflags': [
-                '<!@(pkg-config --libs-only-other --static grpc)'
-              ]
-              }, {
-                'link_settings': {
-                  'libraries': [
-                    '-lpthread',
-                    '-lgrpc',
-                    '-lgpr'
-                  ],
-                },
-                'conditions':[
-                  ['OS != "mac"', {
-                    'link_settings': {
-                      'libraries': [
-                        '-lrt'
-                      ]
-                    }
-                  }]
-                ]
-              }
-           ]
-          ]
-        }],
-        ['OS == "mac"', {
-          'xcode_settings': {
-            'MACOSX_DEPLOYMENT_TARGET': '10.9',
-            'OTHER_CFLAGS': [
-              '-std=c++11',
-              '-stdlib=libc++'
-            ]
-          }
-        }]
-      ],
-      "target_name": "grpc",
-      "sources": [
-        "ext/byte_buffer.cc",
-        "ext/call.cc",
-        "ext/channel.cc",
-        "ext/completion_queue_async_worker.cc",
-        "ext/credentials.cc",
-        "ext/node_grpc.cc",
-        "ext/server.cc",
-        "ext/server_credentials.cc",
-        "ext/timeval.cc"
-      ]
-    }
-  ]
-}
diff --git a/src/node/cli/service_packager.js b/src/node/cli/service_packager.js
deleted file mode 100644
index c92c450a01e51921c550554bf5b972e73eb29b8c..0000000000000000000000000000000000000000
--- a/src/node/cli/service_packager.js
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- *
- * Copyright 2015, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-'use strict';
-
-var fs = require('fs');
-var path = require('path');
-
-var _ = require('lodash');
-var async = require('async');
-var pbjs = require('protobufjs/cli/pbjs');
-var parseArgs = require('minimist');
-var Mustache = require('mustache');
-
-var package_json = require('../package.json');
-
-var template_path = path.resolve(__dirname, 'service_packager');
-
-var package_tpl_path = path.join(template_path, 'package.json.template');
-
-var arg_format = {
-  string: ['include', 'out', 'name', 'version'],
-  alias: {
-    include: 'i',
-    out: 'o',
-    name: 'n',
-    version: 'v'
-  }
-};
-
-// TODO(mlumish): autogenerate README.md from proto file
-
-/**
- * Render package.json file from template using provided parameters.
- * @param {Object} params Map of parameter names to values
- * @param {function(Error, string)} callback Callback to pass rendered template
- *     text to
- */
-function generatePackage(params, callback) {
-  fs.readFile(package_tpl_path, {encoding: 'utf-8'}, function(err, template) {
-    if (err) {
-      callback(err);
-    } else {
-      var rendered = Mustache.render(template, params);
-      callback(null, rendered);
-    }
-  });
-}
-
-/**
- * Copy a file
- * @param {string} src_path The filepath to copy from
- * @param {string} dest_path The filepath to copy to
- */
-function copyFile(src_path, dest_path) {
-  fs.createReadStream(src_path).pipe(fs.createWriteStream(dest_path));
-}
-
-/**
- * Run the script. Copies the index.js and LICENSE files to the output path,
- * renders the package.json template to the output path, and generates a
- * service.json file from the input proto files using pbjs. The arguments are
- * taken directly from the command line, and handled as follows:
- * -i (--include) : An include path for pbjs (can be dpulicated)
- * -o (--output): The output path
- * -n (--name): The name of the package
- * -v (--version): The package version
- * @param {Array} argv The argument vector
- */
-function main(argv) {
-  var args = parseArgs(argv, arg_format);
-  var out_path = path.resolve(args.out);
-  var include_dirs = [];
-  if (args.include) {
-    include_dirs = _.map(_.flatten([args.include]), function(p) {
-      return path.resolve(p);
-    });
-  }
-  args.grpc_version = package_json.version;
-  generatePackage(args, function(err, rendered) {
-    if (err) throw err;
-    fs.writeFile(path.join(out_path, 'package.json'), rendered, function(err) {
-      if (err) throw err;
-    });
-  });
-  copyFile(path.join(template_path, 'index.js'),
-           path.join(out_path, 'index.js'));
-  copyFile(path.join(__dirname, '..', 'LICENSE'),
-           path.join(out_path, 'LICENSE'));
-
-  var service_stream = fs.createWriteStream(path.join(out_path,
-                                                      'service.json'));
-  var pbjs_args = _.flatten(['node', 'pbjs',
-                             args._[0],
-                             '-legacy',
-                             _.map(include_dirs, function(dir) {
-                               return "-path=" + dir;
-                             })]);
-  var old_stdout = process.stdout;
-  process.__defineGetter__('stdout', function() {
-    return service_stream;
-  });
-  var pbjs_status = pbjs.main(pbjs_args);
-  process.__defineGetter__('stdout', function() {
-    return old_stdout;
-  });
-  if (pbjs_status !== pbjs.STATUS_OK) {
-    throw new Error('pbjs failed with status code ' + pbjs_status);
-  }
-}
-
-exports.main = main;
diff --git a/src/node/cli/service_packager/index.js b/src/node/cli/service_packager/index.js
deleted file mode 100644
index 811e08b89ac5eea2f754a77fb3ced883ddef45ee..0000000000000000000000000000000000000000
--- a/src/node/cli/service_packager/index.js
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *
- * Copyright 2015, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-var grpc = require('grpc');
-exports.client = grpc.load(__dirname + '/service.json', 'json');
-exports.auth = require('google-auth-library');
diff --git a/src/node/cli/service_packager/package.json.template b/src/node/cli/service_packager/package.json.template
deleted file mode 100644
index 9f9019172e0d1c3a471c6d4fe0743eed399c471d..0000000000000000000000000000000000000000
--- a/src/node/cli/service_packager/package.json.template
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "name": "{{{name}}}",
-  "version": "{{{version}}}",
-  "author": "Google Inc.",
-  "description": "Client library for {{{name}}} built on gRPC",
-  "license": "Apache-2.0",
-  "dependencies": {
-    "grpc": "{{{grpc_version}}}",
-    "google-auth-library": "^0.9.2"
-  },
-  "main": "index.js",
-  "files": [
-    "LICENSE",
-    "index.js",
-    "service.json"
-  ]
-}
diff --git a/src/node/examples/stock_server.js b/src/node/examples/stock_server.js
deleted file mode 100644
index 12e547958450cb0ef8341a4cf4fe88c217912705..0000000000000000000000000000000000000000
--- a/src/node/examples/stock_server.js
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- *
- * Copyright 2015, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-'use strict';
-
-var _ = require('lodash');
-var grpc = require('..');
-var examples = grpc.load(__dirname + '/stock.proto').examples;
-
-function getLastTradePrice(call, callback) {
-  callback(null, {symbol: call.request.symbol, price: 88});
-}
-
-function watchFutureTrades(call) {
-  for (var i = 0; i < call.request.num_trades_to_watch; i++) {
-    call.write({price: 88.00 + i * 10.00});
-  }
-  call.end();
-}
-
-function getHighestTradePrice(call, callback) {
-  var trades = [];
-  call.on('data', function(data) {
-    trades.push({symbol: data.symbol, price: _.random(0, 100)});
-  });
-  call.on('end', function() {
-    if(_.isEmpty(trades)) {
-      callback(null, {});
-    } else {
-      callback(null, _.max(trades, function(trade){return trade.price;}));
-    }
-  });
-}
-
-function getLastTradePriceMultiple(call) {
-  call.on('data', function(data) {
-    call.write({price: 88});
-  });
-  call.on('end', function() {
-    call.end();
-  });
-}
-
-var stockServer = new grpc.Server();
-stockServer.addProtoService(examples.Stock.service, {
-  getLastTradePrice: getLastTradePrice,
-  getLastTradePriceMultiple: getLastTradePriceMultiple,
-  watchFutureTrades: watchFutureTrades,
-  getHighestTradePrice: getHighestTradePrice
-});
-
-if (require.main === module) {
-  stockServer.bind('0.0.0.0:50051', grpc.ServerCredentials.createInsecure());
-  stockServer.start();
-}
-
-module.exports = stockServer;
diff --git a/src/node/ext/call.cc b/src/node/ext/call.cc
index b08a9f96d8120624b6f9df4197f99a58420af045..b63e294f9a332ee46a0ca0fad2d15a8fa6950de9 100644
--- a/src/node/ext/call.cc
+++ b/src/node/ext/call.cc
@@ -39,12 +39,14 @@
 
 #include "grpc/support/log.h"
 #include "grpc/grpc.h"
+#include "grpc/grpc_security.h"
 #include "grpc/support/alloc.h"
 #include "grpc/support/time.h"
 #include "byte_buffer.h"
 #include "call.h"
 #include "channel.h"
 #include "completion_queue_async_worker.h"
+#include "call_credentials.h"
 #include "timeval.h"
 
 using std::unique_ptr;
@@ -168,8 +170,9 @@ Local<Value> ParseMetadata(const grpc_metadata_array *metadata_array) {
     }
     if (EndsWith(elem->key, "-bin")) {
       Nan::Set(array, index_map[elem->key],
-               Nan::CopyBuffer(elem->value,
-                               elem->value_length).ToLocalChecked());
+               MakeFastBuffer(
+                   Nan::CopyBuffer(elem->value,
+                                   elem->value_length).ToLocalChecked()));
     } else {
       Nan::Set(array, index_map[elem->key],
                Nan::New(elem->value).ToLocalChecked());
@@ -501,6 +504,7 @@ void Call::Init(Local<Object> exports) {
   Nan::SetPrototypeMethod(tpl, "cancel", Cancel);
   Nan::SetPrototypeMethod(tpl, "cancelWithStatus", CancelWithStatus);
   Nan::SetPrototypeMethod(tpl, "getPeer", GetPeer);
+  Nan::SetPrototypeMethod(tpl, "setCredentials", SetCredentials);
   fun_tpl.Reset(tpl);
   Local<Function> ctr = Nan::GetFunction(tpl).ToLocalChecked();
   Nan::Set(exports, Nan::New("Call").ToLocalChecked(), ctr);
@@ -724,5 +728,26 @@ NAN_METHOD(Call::GetPeer) {
   info.GetReturnValue().Set(peer_value);
 }
 
+NAN_METHOD(Call::SetCredentials) {
+  Nan::HandleScope scope;
+  if (!HasInstance(info.This())) {
+    return Nan::ThrowTypeError(
+        "setCredentials can only be called on Call objects");
+  }
+  if (!CallCredentials::HasInstance(info[0])) {
+    return Nan::ThrowTypeError(
+        "setCredentials' first argument must be a CallCredentials");
+  }
+  Call *call = ObjectWrap::Unwrap<Call>(info.This());
+  CallCredentials *creds_object = ObjectWrap::Unwrap<CallCredentials>(
+      Nan::To<Object>(info[0]).ToLocalChecked());
+  grpc_credentials *creds = creds_object->GetWrappedCredentials();
+  grpc_call_error error = GRPC_CALL_ERROR;
+  if (creds) {
+    error = grpc_call_set_credentials(call->wrapped_call, creds);
+  }
+  info.GetReturnValue().Set(Nan::New<Uint32>(error));
+}
+
 }  // namespace node
 }  // namespace grpc
diff --git a/src/node/ext/call.h b/src/node/ext/call.h
index 2f8e1f17aae95e0cf124c482aace6ff275445a9c..dd6c38e4f8e96e750697f1b312b1d95f60a60ad5 100644
--- a/src/node/ext/call.h
+++ b/src/node/ext/call.h
@@ -73,6 +73,10 @@ struct Resources {
   std::vector<unique_ptr<PersistentValue> > handles;
 };
 
+bool CreateMetadataArray(v8::Local<v8::Object> metadata,
+                         grpc_metadata_array *array,
+                         shared_ptr<Resources> resources);
+
 class Op {
  public:
   virtual v8::Local<v8::Value> GetNodeValue() const = 0;
@@ -122,6 +126,7 @@ class Call : public Nan::ObjectWrap {
   static NAN_METHOD(Cancel);
   static NAN_METHOD(CancelWithStatus);
   static NAN_METHOD(GetPeer);
+  static NAN_METHOD(SetCredentials);
   static Nan::Callback *constructor;
   // Used for typechecking instances of this javascript class
   static Nan::Persistent<v8::FunctionTemplate> fun_tpl;
diff --git a/src/node/ext/call_credentials.cc b/src/node/ext/call_credentials.cc
new file mode 100644
index 0000000000000000000000000000000000000000..839bb567e48e3a8be3b5557a30f45c4624e6ab8c
--- /dev/null
+++ b/src/node/ext/call_credentials.cc
@@ -0,0 +1,259 @@
+/*
+ *
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <node.h>
+
+#include "grpc/grpc.h"
+#include "grpc/grpc_security.h"
+#include "grpc/support/log.h"
+#include "call_credentials.h"
+#include "call.h"
+
+namespace grpc {
+namespace node {
+
+using Nan::Callback;
+using Nan::EscapableHandleScope;
+using Nan::HandleScope;
+using Nan::Maybe;
+using Nan::MaybeLocal;
+using Nan::ObjectWrap;
+using Nan::Persistent;
+using Nan::Utf8String;
+
+using v8::Exception;
+using v8::External;
+using v8::Function;
+using v8::FunctionTemplate;
+using v8::Integer;
+using v8::Local;
+using v8::Object;
+using v8::ObjectTemplate;
+using v8::Value;
+
+Nan::Callback *CallCredentials::constructor;
+Persistent<FunctionTemplate> CallCredentials::fun_tpl;
+
+CallCredentials::CallCredentials(grpc_credentials *credentials)
+    : wrapped_credentials(credentials) {}
+
+CallCredentials::~CallCredentials() {
+  grpc_credentials_release(wrapped_credentials);
+}
+
+void CallCredentials::Init(Local<Object> exports) {
+  HandleScope scope;
+  Local<FunctionTemplate> tpl = Nan::New<FunctionTemplate>(New);
+  tpl->SetClassName(Nan::New("CallCredentials").ToLocalChecked());
+  tpl->InstanceTemplate()->SetInternalFieldCount(1);
+  Nan::SetPrototypeMethod(tpl, "compose", Compose);
+  fun_tpl.Reset(tpl);
+  Local<Function> ctr = Nan::GetFunction(tpl).ToLocalChecked();
+  Nan::Set(ctr, Nan::New("createFromPlugin").ToLocalChecked(),
+           Nan::GetFunction(
+               Nan::New<FunctionTemplate>(CreateFromPlugin)).ToLocalChecked());
+  Nan::Set(exports, Nan::New("CallCredentials").ToLocalChecked(), ctr);
+  constructor = new Nan::Callback(ctr);
+}
+
+bool CallCredentials::HasInstance(Local<Value> val) {
+  HandleScope scope;
+  return Nan::New(fun_tpl)->HasInstance(val);
+}
+
+Local<Value> CallCredentials::WrapStruct(grpc_credentials *credentials) {
+  EscapableHandleScope scope;
+  const int argc = 1;
+  if (credentials == NULL) {
+    return scope.Escape(Nan::Null());
+  }
+  Local<Value> argv[argc] = {
+    Nan::New<External>(reinterpret_cast<void *>(credentials))};
+  MaybeLocal<Object> maybe_instance = Nan::NewInstance(
+      constructor->GetFunction(), argc, argv);
+  if (maybe_instance.IsEmpty()) {
+    return scope.Escape(Nan::Null());
+  } else {
+    return scope.Escape(maybe_instance.ToLocalChecked());
+  }
+}
+
+grpc_credentials *CallCredentials::GetWrappedCredentials() {
+  return wrapped_credentials;
+}
+
+NAN_METHOD(CallCredentials::New) {
+  if (info.IsConstructCall()) {
+    if (!info[0]->IsExternal()) {
+      return Nan::ThrowTypeError(
+          "CallCredentials can only be created with the provided functions");
+    }
+    Local<External> ext = info[0].As<External>();
+    grpc_credentials *creds_value =
+        reinterpret_cast<grpc_credentials *>(ext->Value());
+    CallCredentials *credentials = new CallCredentials(creds_value);
+    credentials->Wrap(info.This());
+    info.GetReturnValue().Set(info.This());
+    return;
+  } else {
+    const int argc = 1;
+    Local<Value> argv[argc] = {info[0]};
+    MaybeLocal<Object> maybe_instance = constructor->GetFunction()->NewInstance(
+        argc, argv);
+    if (maybe_instance.IsEmpty()) {
+      // There's probably a pending exception
+      return;
+    } else {
+      info.GetReturnValue().Set(maybe_instance.ToLocalChecked());
+    }
+  }
+}
+
+NAN_METHOD(CallCredentials::Compose) {
+  if (!CallCredentials::HasInstance(info.This())) {
+    return Nan::ThrowTypeError(
+        "compose can only be called on CallCredentials objects");
+  }
+  if (!CallCredentials::HasInstance(info[0])) {
+    return Nan::ThrowTypeError(
+        "compose's first argument must be a CallCredentials object");
+  }
+  CallCredentials *self = ObjectWrap::Unwrap<CallCredentials>(info.This());
+  CallCredentials *other = ObjectWrap::Unwrap<CallCredentials>(
+      Nan::To<Object>(info[0]).ToLocalChecked());
+  grpc_credentials *creds = grpc_composite_credentials_create(
+      self->wrapped_credentials, other->wrapped_credentials, NULL);
+  info.GetReturnValue().Set(WrapStruct(creds));
+}
+
+
+
+NAN_METHOD(CallCredentials::CreateFromPlugin) {
+  if (!info[0]->IsFunction()) {
+    return Nan::ThrowTypeError(
+        "createFromPlugin's argument must be a function");
+  }
+  grpc_metadata_credentials_plugin plugin;
+  plugin_state *state = new plugin_state;
+  state->callback = new Nan::Callback(info[0].As<Function>());
+  plugin.get_metadata = plugin_get_metadata;
+  plugin.destroy = plugin_destroy_state;
+  plugin.state = reinterpret_cast<void*>(state);
+  grpc_credentials *creds = grpc_metadata_credentials_create_from_plugin(plugin,
+                                                                         NULL);
+  info.GetReturnValue().Set(WrapStruct(creds));
+}
+
+NAN_METHOD(PluginCallback) {
+  // Arguments: status code, error details, metadata
+  if (!info[0]->IsUint32()) {
+    return Nan::ThrowTypeError(
+        "The callback's first argument must be a status code");
+  }
+  if (!info[1]->IsString()) {
+    return Nan::ThrowTypeError(
+        "The callback's second argument must be a string");
+  }
+  if (!info[2]->IsObject()) {
+    return Nan::ThrowTypeError(
+        "The callback's third argument must be an object");
+  }
+  shared_ptr<Resources> resources(new Resources);
+  grpc_status_code code = static_cast<grpc_status_code>(
+      Nan::To<uint32_t>(info[0]).FromJust());
+  char *details = *Utf8String(info[1]);
+  grpc_metadata_array array;
+  if (!CreateMetadataArray(Nan::To<Object>(info[2]).ToLocalChecked(),
+                           &array, resources)){
+    return Nan::ThrowError("Failed to parse metadata");
+  }
+  grpc_credentials_plugin_metadata_cb cb =
+      reinterpret_cast<grpc_credentials_plugin_metadata_cb>(
+          Nan::Get(info.Callee(),
+                   Nan::New("cb").ToLocalChecked()
+                   ).ToLocalChecked().As<External>()->Value());
+  void *user_data =
+      Nan::Get(info.Callee(),
+               Nan::New("user_data").ToLocalChecked()
+               ).ToLocalChecked().As<External>()->Value();
+  cb(user_data, array.metadata, array.count, code, details);
+}
+
+NAUV_WORK_CB(SendPluginCallback) {
+  Nan::HandleScope scope;
+  plugin_callback_data *data = reinterpret_cast<plugin_callback_data*>(
+      async->data);
+  // Attach cb and user_data to plugin_callback so that it can access them later
+  v8::Local<v8::Function> plugin_callback = Nan::GetFunction(
+      Nan::New<v8::FunctionTemplate>(PluginCallback)).ToLocalChecked();
+  Nan::Set(plugin_callback, Nan::New("cb").ToLocalChecked(),
+           Nan::New<v8::External>(reinterpret_cast<void*>(data->cb)));
+  Nan::Set(plugin_callback, Nan::New("user_data").ToLocalChecked(),
+           Nan::New<v8::External>(data->user_data));
+  const int argc = 2;
+  v8::Local<v8::Value> argv[argc] = {
+    Nan::New(data->service_url).ToLocalChecked(),
+    plugin_callback
+  };
+  Nan::Callback *callback = data->state->callback;
+  callback->Call(argc, argv);
+  delete data;
+  uv_unref((uv_handle_t *)async);
+  uv_close((uv_handle_t *)async, (uv_close_cb)free);
+}
+
+void plugin_get_metadata(void *state, const char *service_url,
+                         grpc_credentials_plugin_metadata_cb cb,
+                         void *user_data) {
+  uv_async_t *async = static_cast<uv_async_t*>(malloc(sizeof(uv_async_t)));
+  uv_async_init(uv_default_loop(),
+                async,
+                SendPluginCallback);
+  plugin_callback_data *data = new plugin_callback_data;
+  data->state = reinterpret_cast<plugin_state*>(state);
+  data->service_url = service_url;
+  data->cb = cb;
+  data->user_data = user_data;
+  async->data = data;
+  /* libuv says that it will coalesce calls to uv_async_send. If there is ever a
+   * problem with a callback not getting called, that is probably the reason */
+  uv_async_send(async);
+}
+
+void plugin_destroy_state(void *ptr) {
+  plugin_state *state = reinterpret_cast<plugin_state *>(ptr);
+  delete state->callback;
+}
+
+}  // namespace node
+}  // namespace grpc
diff --git a/src/node/ext/call_credentials.h b/src/node/ext/call_credentials.h
new file mode 100644
index 0000000000000000000000000000000000000000..618292d19e8b9b040f529e22b186b49da3fa3b7f
--- /dev/null
+++ b/src/node/ext/call_credentials.h
@@ -0,0 +1,100 @@
+/*
+ *
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef GRPC_NODE_CALL_CREDENTIALS_H_
+#define GRPC_NODE_CALL_CREDENTIALS_H_
+
+#include <node.h>
+#include <nan.h>
+#include "grpc/grpc_security.h"
+
+namespace grpc {
+namespace node {
+
+class CallCredentials : public Nan::ObjectWrap {
+ public:
+  static void Init(v8::Local<v8::Object> exports);
+  static bool HasInstance(v8::Local<v8::Value> val);
+  /* Wrap a grpc_credentials struct in a javascript object */
+  static v8::Local<v8::Value> WrapStruct(grpc_credentials *credentials);
+
+  /* Returns the grpc_credentials struct that this object wraps */
+  grpc_credentials *GetWrappedCredentials();
+
+ private:
+  explicit CallCredentials(grpc_credentials *credentials);
+  ~CallCredentials();
+
+  // Prevent copying
+  CallCredentials(const CallCredentials &);
+  CallCredentials &operator=(const CallCredentials &);
+
+  static NAN_METHOD(New);
+  static NAN_METHOD(CreateSsl);
+  static NAN_METHOD(CreateFromPlugin);
+
+  static NAN_METHOD(Compose);
+  static Nan::Callback *constructor;
+  // Used for typechecking instances of this javascript class
+  static Nan::Persistent<v8::FunctionTemplate> fun_tpl;
+
+  grpc_credentials *wrapped_credentials;
+};
+
+/* Auth metadata plugin functionality */
+
+typedef struct plugin_state {
+  Nan::Callback *callback;
+} plugin_state;
+
+typedef struct plugin_callback_data {
+  plugin_state *state;
+  const char *service_url;
+  grpc_credentials_plugin_metadata_cb cb;
+  void *user_data;
+} plugin_callback_data;
+
+void plugin_get_metadata(void *state, const char *service_url,
+                         grpc_credentials_plugin_metadata_cb cb,
+                         void *user_data);
+
+void plugin_destroy_state(void *state);
+
+NAN_METHOD(PluginCallback);
+
+NAUV_WORK_CB(SendPluginCallback);
+
+}  // namespace node
+}  // namepsace grpc
+
+#endif  // GRPC_NODE_CALL_CREDENTIALS_H_
diff --git a/src/node/ext/channel.cc b/src/node/ext/channel.cc
index 6eb1e77688413d2cca4932e2cae9d8890f7196b0..a328c017130d1f25d6c5391a80a4d9b7dac66b1e 100644
--- a/src/node/ext/channel.cc
+++ b/src/node/ext/channel.cc
@@ -42,7 +42,7 @@
 #include "call.h"
 #include "channel.h"
 #include "completion_queue_async_worker.h"
-#include "credentials.h"
+#include "channel_credentials.h"
 #include "timeval.h"
 
 namespace grpc {
@@ -112,11 +112,11 @@ NAN_METHOD(Channel::New) {
     // Owned by the Channel object
     Utf8String host(info[0]);
     grpc_credentials *creds;
-    if (!Credentials::HasInstance(info[1])) {
+    if (!ChannelCredentials::HasInstance(info[1])) {
       return Nan::ThrowTypeError(
-          "Channel's second argument must be a credential");
+          "Channel's second argument must be a ChannelCredentials");
     }
-    Credentials *creds_object = ObjectWrap::Unwrap<Credentials>(
+    ChannelCredentials *creds_object = ObjectWrap::Unwrap<ChannelCredentials>(
         Nan::To<Object>(info[1]).ToLocalChecked());
     creds = creds_object->GetWrappedCredentials();
     grpc_channel_args *channel_args_ptr;
diff --git a/src/node/ext/credentials.cc b/src/node/ext/channel_credentials.cc
similarity index 64%
rename from src/node/ext/credentials.cc
rename to src/node/ext/channel_credentials.cc
index 4f41c92f6a7926ddaf7a39f0c1ae8ef0adb68e7b..3d47ff293df59ab7a0b1b000762b8dab46e23a13 100644
--- a/src/node/ext/credentials.cc
+++ b/src/node/ext/channel_credentials.cc
@@ -36,7 +36,9 @@
 #include "grpc/grpc.h"
 #include "grpc/grpc_security.h"
 #include "grpc/support/log.h"
-#include "credentials.h"
+#include "channel_credentials.h"
+#include "call_credentials.h"
+#include "call.h"
 
 namespace grpc {
 namespace node {
@@ -60,51 +62,40 @@ using v8::Object;
 using v8::ObjectTemplate;
 using v8::Value;
 
-Nan::Callback *Credentials::constructor;
-Persistent<FunctionTemplate> Credentials::fun_tpl;
+Nan::Callback *ChannelCredentials::constructor;
+Persistent<FunctionTemplate> ChannelCredentials::fun_tpl;
 
-Credentials::Credentials(grpc_credentials *credentials)
+ChannelCredentials::ChannelCredentials(grpc_credentials *credentials)
     : wrapped_credentials(credentials) {}
 
-Credentials::~Credentials() {
+ChannelCredentials::~ChannelCredentials() {
   grpc_credentials_release(wrapped_credentials);
 }
 
-void Credentials::Init(Local<Object> exports) {
+void ChannelCredentials::Init(Local<Object> exports) {
   HandleScope scope;
   Local<FunctionTemplate> tpl = Nan::New<FunctionTemplate>(New);
-  tpl->SetClassName(Nan::New("Credentials").ToLocalChecked());
+  tpl->SetClassName(Nan::New("ChannelCredentials").ToLocalChecked());
   tpl->InstanceTemplate()->SetInternalFieldCount(1);
+  Nan::SetPrototypeMethod(tpl, "compose", Compose);
   fun_tpl.Reset(tpl);
   Local<Function> ctr = Nan::GetFunction(tpl).ToLocalChecked();
-  Nan::Set(ctr, Nan::New("createDefault").ToLocalChecked(),
-           Nan::GetFunction(
-               Nan::New<FunctionTemplate>(CreateDefault)).ToLocalChecked());
   Nan::Set(ctr, Nan::New("createSsl").ToLocalChecked(),
            Nan::GetFunction(
                Nan::New<FunctionTemplate>(CreateSsl)).ToLocalChecked());
-  Nan::Set(ctr, Nan::New("createComposite").ToLocalChecked(),
-           Nan::GetFunction(
-               Nan::New<FunctionTemplate>(CreateComposite)).ToLocalChecked());
-  Nan::Set(ctr, Nan::New("createGce").ToLocalChecked(),
-           Nan::GetFunction(
-               Nan::New<FunctionTemplate>(CreateGce)).ToLocalChecked());
-  Nan::Set(ctr, Nan::New("createIam").ToLocalChecked(),
-           Nan::GetFunction(
-               Nan::New<FunctionTemplate>(CreateIam)).ToLocalChecked());
   Nan::Set(ctr, Nan::New("createInsecure").ToLocalChecked(),
            Nan::GetFunction(
                Nan::New<FunctionTemplate>(CreateInsecure)).ToLocalChecked());
-  Nan::Set(exports, Nan::New("Credentials").ToLocalChecked(), ctr);
+  Nan::Set(exports, Nan::New("ChannelCredentials").ToLocalChecked(), ctr);
   constructor = new Nan::Callback(ctr);
 }
 
-bool Credentials::HasInstance(Local<Value> val) {
+bool ChannelCredentials::HasInstance(Local<Value> val) {
   HandleScope scope;
   return Nan::New(fun_tpl)->HasInstance(val);
 }
 
-Local<Value> Credentials::WrapStruct(grpc_credentials *credentials) {
+Local<Value> ChannelCredentials::WrapStruct(grpc_credentials *credentials) {
   EscapableHandleScope scope;
   const int argc = 1;
   Local<Value> argv[argc] = {
@@ -118,20 +109,20 @@ Local<Value> Credentials::WrapStruct(grpc_credentials *credentials) {
   }
 }
 
-grpc_credentials *Credentials::GetWrappedCredentials() {
+grpc_credentials *ChannelCredentials::GetWrappedCredentials() {
   return wrapped_credentials;
 }
 
-NAN_METHOD(Credentials::New) {
+NAN_METHOD(ChannelCredentials::New) {
   if (info.IsConstructCall()) {
     if (!info[0]->IsExternal()) {
       return Nan::ThrowTypeError(
-          "Credentials can only be created with the provided functions");
+          "ChannelCredentials can only be created with the provided functions");
     }
     Local<External> ext = info[0].As<External>();
     grpc_credentials *creds_value =
         reinterpret_cast<grpc_credentials *>(ext->Value());
-    Credentials *credentials = new Credentials(creds_value);
+    ChannelCredentials *credentials = new ChannelCredentials(creds_value);
     credentials->Wrap(info.This());
     info.GetReturnValue().Set(info.This());
     return;
@@ -149,16 +140,7 @@ NAN_METHOD(Credentials::New) {
   }
 }
 
-NAN_METHOD(Credentials::CreateDefault) {
-  grpc_credentials *creds = grpc_google_default_credentials_create();
-  if (creds == NULL) {
-    info.GetReturnValue().SetNull();
-  } else {
-    info.GetReturnValue().Set(WrapStruct(creds));
-  }
-}
-
-NAN_METHOD(Credentials::CreateSsl) {
+NAN_METHOD(ChannelCredentials::CreateSsl) {
   char *root_certs = NULL;
   grpc_ssl_pem_key_cert_pair key_cert_pair = {NULL, NULL};
   if (::node::Buffer::HasInstance(info[0])) {
@@ -188,49 +170,25 @@ NAN_METHOD(Credentials::CreateSsl) {
   }
 }
 
-NAN_METHOD(Credentials::CreateComposite) {
-  if (!HasInstance(info[0])) {
+NAN_METHOD(ChannelCredentials::Compose) {
+  if (!ChannelCredentials::HasInstance(info.This())) {
     return Nan::ThrowTypeError(
-        "createComposite's first argument must be a Credentials object");
+        "compose can only be called on ChannelCredentials objects");
   }
-  if (!HasInstance(info[1])) {
+  if (!CallCredentials::HasInstance(info[0])) {
     return Nan::ThrowTypeError(
-        "createComposite's second argument must be a Credentials object");
+        "compose's first argument must be a CallCredentials object");
   }
-  Credentials *creds1 = ObjectWrap::Unwrap<Credentials>(
+  ChannelCredentials *self = ObjectWrap::Unwrap<ChannelCredentials>(
+      info.This());
+  if (self->wrapped_credentials == NULL) {
+    return Nan::ThrowTypeError(
+        "Cannot compose insecure credential");
+  }
+  CallCredentials *other = ObjectWrap::Unwrap<CallCredentials>(
       Nan::To<Object>(info[0]).ToLocalChecked());
-  Credentials *creds2 = ObjectWrap::Unwrap<Credentials>(
-      Nan::To<Object>(info[1]).ToLocalChecked());
   grpc_credentials *creds = grpc_composite_credentials_create(
-      creds1->wrapped_credentials, creds2->wrapped_credentials, NULL);
-  if (creds == NULL) {
-    info.GetReturnValue().SetNull();
-  } else {
-    info.GetReturnValue().Set(WrapStruct(creds));
-  }
-}
-
-NAN_METHOD(Credentials::CreateGce) {
-  Nan::HandleScope scope;
-  grpc_credentials *creds = grpc_google_compute_engine_credentials_create(NULL);
-  if (creds == NULL) {
-    info.GetReturnValue().SetNull();
-  } else {
-    info.GetReturnValue().Set(WrapStruct(creds));
-  }
-}
-
-NAN_METHOD(Credentials::CreateIam) {
-  if (!info[0]->IsString()) {
-    return Nan::ThrowTypeError("createIam's first argument must be a string");
-  }
-  if (!info[1]->IsString()) {
-    return Nan::ThrowTypeError("createIam's second argument must be a string");
-  }
-  Utf8String auth_token(info[0]);
-  Utf8String auth_selector(info[1]);
-  grpc_credentials *creds =
-      grpc_google_iam_credentials_create(*auth_token, *auth_selector, NULL);
+      self->wrapped_credentials, other->GetWrappedCredentials(), NULL);
   if (creds == NULL) {
     info.GetReturnValue().SetNull();
   } else {
@@ -238,7 +196,7 @@ NAN_METHOD(Credentials::CreateIam) {
   }
 }
 
-NAN_METHOD(Credentials::CreateInsecure) {
+NAN_METHOD(ChannelCredentials::CreateInsecure) {
   info.GetReturnValue().Set(WrapStruct(NULL));
 }
 
diff --git a/src/node/ext/credentials.h b/src/node/ext/channel_credentials.h
similarity index 83%
rename from src/node/ext/credentials.h
rename to src/node/ext/channel_credentials.h
index 1b211175d4575feb7d69560c99cdf90b387d6aa0..31ea0987bc659b7330b7bc851e9f3a0df1fbac68 100644
--- a/src/node/ext/credentials.h
+++ b/src/node/ext/channel_credentials.h
@@ -31,8 +31,8 @@
  *
  */
 
-#ifndef NET_GRPC_NODE_CREDENTIALS_H_
-#define NET_GRPC_NODE_CREDENTIALS_H_
+#ifndef NET_GRPC_NODE_CHANNEL_CREDENTIALS_H_
+#define NET_GRPC_NODE_CHANNEL_CREDENTIALS_H_
 
 #include <node.h>
 #include <nan.h>
@@ -43,7 +43,7 @@ namespace grpc {
 namespace node {
 
 /* Wrapper class for grpc_credentials structs */
-class Credentials : public Nan::ObjectWrap {
+class ChannelCredentials : public Nan::ObjectWrap {
  public:
   static void Init(v8::Local<v8::Object> exports);
   static bool HasInstance(v8::Local<v8::Value> val);
@@ -54,21 +54,18 @@ class Credentials : public Nan::ObjectWrap {
   grpc_credentials *GetWrappedCredentials();
 
  private:
-  explicit Credentials(grpc_credentials *credentials);
-  ~Credentials();
+  explicit ChannelCredentials(grpc_credentials *credentials);
+  ~ChannelCredentials();
 
   // Prevent copying
-  Credentials(const Credentials &);
-  Credentials &operator=(const Credentials &);
+  ChannelCredentials(const ChannelCredentials &);
+  ChannelCredentials &operator=(const ChannelCredentials &);
 
   static NAN_METHOD(New);
-  static NAN_METHOD(CreateDefault);
   static NAN_METHOD(CreateSsl);
-  static NAN_METHOD(CreateComposite);
-  static NAN_METHOD(CreateGce);
-  static NAN_METHOD(CreateFake);
-  static NAN_METHOD(CreateIam);
   static NAN_METHOD(CreateInsecure);
+
+  static NAN_METHOD(Compose);
   static Nan::Callback *constructor;
   // Used for typechecking instances of this javascript class
   static Nan::Persistent<v8::FunctionTemplate> fun_tpl;
@@ -79,4 +76,4 @@ class Credentials : public Nan::ObjectWrap {
 }  // namespace node
 }  // namespace grpc
 
-#endif  // NET_GRPC_NODE_CREDENTIALS_H_
+#endif  // NET_GRPC_NODE_CHANNEL_CREDENTIALS_H_
diff --git a/src/node/ext/node_grpc.cc b/src/node/ext/node_grpc.cc
index caca0fc4522db45923410bd498af0cab61f65559..5b5f3c1c5b88321a79267ecf82450fa0ea34e852 100644
--- a/src/node/ext/node_grpc.cc
+++ b/src/node/ext/node_grpc.cc
@@ -37,10 +37,11 @@
 #include "grpc/grpc.h"
 
 #include "call.h"
+#include "call_credentials.h"
 #include "channel.h"
+#include "channel_credentials.h"
 #include "server.h"
 #include "completion_queue_async_worker.h"
-#include "credentials.h"
 #include "server_credentials.h"
 
 using v8::Local;
@@ -240,11 +241,12 @@ void init(Local<Object> exports) {
   InitWriteFlags(exports);
 
   grpc::node::Call::Init(exports);
+  grpc::node::CallCredentials::Init(exports);
   grpc::node::Channel::Init(exports);
+  grpc::node::ChannelCredentials::Init(exports);
   grpc::node::Server::Init(exports);
   grpc::node::CompletionQueueAsyncWorker::Init(exports);
-  grpc::node::Credentials::Init(exports);
   grpc::node::ServerCredentials::Init(exports);
 }
 
-NODE_MODULE(grpc, init)
+NODE_MODULE(grpc_node, init)
diff --git a/src/node/index.js b/src/node/index.js
index 02b73f66ee70fcc0283e0928b3ebf4094db53544..591d9dd9155232a1f18f1cbf3031f3c4cbc38af9 100644
--- a/src/node/index.js
+++ b/src/node/index.js
@@ -43,7 +43,7 @@ var server = require('./src/server.js');
 
 var Metadata = require('./src/metadata.js');
 
-var grpc = require('bindings')('grpc');
+var grpc = require('bindings')('grpc_node');
 
 /**
  * Load a gRPC object from an existing ProtoBuf.Reflect object.
@@ -90,36 +90,9 @@ exports.load = function load(filename, format) {
     default:
     throw new Error('Unrecognized format "' + format + '"');
   }
-
   return loadObject(builder.ns);
 };
 
-/**
- * Get a function that a client can use to update metadata with authentication
- * information from a Google Auth credential object, which comes from the
- * google-auth-library.
- * @param {Object} credential The credential object to use
- * @return {function(Object, callback)} Metadata updater function
- */
-exports.getGoogleAuthDelegate = function getGoogleAuthDelegate(credential) {
-  /**
-   * Update a metadata object with authentication information.
-   * @param {string} authURI The uri to authenticate to
-   * @param {Object} metadata Metadata object
-   * @param {function(Error, Object)} callback
-   */
-  return function updateMetadata(authURI, metadata, callback) {
-    credential.getRequestMetadata(authURI, function(err, header) {
-      if (err) {
-        callback(err);
-        return;
-      }
-      metadata.add('authorization', header.Authorization);
-      callback(null, metadata);
-    });
-  };
-};
-
 /**
  * @see module:src/server.Server
  */
@@ -153,7 +126,7 @@ exports.writeFlags = grpc.writeFlags;
 /**
  * Credentials factories
  */
-exports.Credentials = grpc.Credentials;
+exports.credentials = require('./src/credentials.js');
 
 /**
  * ServerCredentials factories
diff --git a/src/node/interop/interop_client.js b/src/node/interop/interop_client.js
index 215d42121c674c2df24fe6ee1216a52bdb0788a8..cb55083d1ae188ded69cce3976d8bd79e5497234 100644
--- a/src/node/interop/interop_client.js
+++ b/src/node/interop/interop_client.js
@@ -37,17 +37,24 @@ var fs = require('fs');
 var path = require('path');
 var _ = require('lodash');
 var grpc = require('..');
-var testProto = grpc.load(__dirname + '/test.proto').grpc.testing;
+var testProto = grpc.load({
+  root: __dirname + '/../../..',
+  file: 'test/proto/test.proto'}).grpc.testing;
 var GoogleAuth = require('google-auth-library');
 
 var assert = require('assert');
 
-var AUTH_SCOPE = 'https://www.googleapis.com/auth/xapi.zoo';
-var AUTH_SCOPE_RESPONSE = 'xapi.zoo';
-var AUTH_USER = ('155450119199-vefjjaekcc6cmsd5914v6lqufunmh9ue' +
-    '@developer.gserviceaccount.com');
-var COMPUTE_ENGINE_USER = ('155450119199-r5aaqa2vqoa9g5mv2m6s3m1l293rlmel' +
-    '@developer.gserviceaccount.com');
+var SERVICE_ACCOUNT_EMAIL;
+try {
+  SERVICE_ACCOUNT_EMAIL = require(
+      process.env.GOOGLE_APPLICATION_CREDENTIALS).client_email;
+} catch (e) {
+  // This will cause the tests to fail if they need that string
+  SERVICE_ACCOUNT_EMAIL = null;
+}
+
+var ECHO_INITIAL_KEY = 'x-grpc-test-echo-initial';
+var ECHO_TRAILING_KEY = 'x-grpc-test-echo-trailing-bin';
 
 /**
  * Create a buffer filled with size zeroes
@@ -60,6 +67,27 @@ function zeroBuffer(size) {
   return zeros;
 }
 
+/**
+ * This is used for testing functions with multiple asynchronous calls that
+ * can happen in different orders. This should be passed the number of async
+ * function invocations that can occur last, and each of those should call this
+ * function's return value
+ * @param {function()} done The function that should be called when a test is
+ *     complete.
+ * @param {number} count The number of calls to the resulting function if the
+ *     test passes.
+ * @return {function()} The function that should be called at the end of each
+ *     sequence of asynchronous functions.
+ */
+function multiDone(done, count) {
+  return function() {
+    count -= 1;
+    if (count <= 0) {
+      done();
+    }
+  };
+}
+
 /**
  * Run the empty_unary test
  * @param {Client} client The client to test against
@@ -271,6 +299,89 @@ function timeoutOnSleepingServer(client, done) {
   });
 }
 
+function customMetadata(client, done) {
+  done = multiDone(done, 5);
+  var metadata = new grpc.Metadata();
+  metadata.set(ECHO_INITIAL_KEY, 'test_initial_metadata_value');
+  metadata.set(ECHO_TRAILING_KEY, new Buffer('ababab', 'hex'));
+  var arg = {
+    response_type: 'COMPRESSABLE',
+    response_size: 314159,
+    payload: {
+      body: zeroBuffer(271828)
+    }
+  };
+  var streaming_arg = {
+    payload: {
+      body: zeroBuffer(271828)
+    }
+  };
+  var unary = client.unaryCall(arg, function(err, resp) {
+    assert.ifError(err);
+    done();
+  }, metadata);
+  unary.on('metadata', function(metadata) {
+    assert.deepEqual(metadata.get(ECHO_INITIAL_KEY),
+                     ['test_initial_metadata_value']);
+    done();
+  });
+  unary.on('status', function(status) {
+    var echo_trailer = status.metadata.get(ECHO_TRAILING_KEY);
+    assert(echo_trailer.length > 0);
+    assert.strictEqual(echo_trailer[0].toString('hex'), 'ababab');
+    done();
+  });
+  var stream = client.fullDuplexCall(metadata);
+  stream.on('metadata', function(metadata) {
+    assert.deepEqual(metadata.get(ECHO_INITIAL_KEY),
+                     ['test_initial_metadata_value']);
+    done();
+  });
+  stream.on('status', function(status) {
+    var echo_trailer = status.metadata.get(ECHO_TRAILING_KEY);
+    assert(echo_trailer.length > 0);
+    assert.strictEqual(echo_trailer[0].toString('hex'), 'ababab');
+    done();
+  });
+  stream.write(streaming_arg);
+  stream.end();
+}
+
+function statusCodeAndMessage(client, done) {
+  done = multiDone(done, 2);
+  var arg = {
+    response_status: {
+      code: 2,
+      message: 'test status message'
+    }
+  };
+  client.unaryCall(arg, function(err, resp) {
+    assert(err);
+    assert.strictEqual(err.code, 2);
+    assert.strictEqual(err.message, 'test status message');
+    done();
+  });
+  var duplex = client.fullDuplexCall();
+  duplex.on('status', function(status) {
+    assert(status);
+    assert.strictEqual(status.code, 2);
+    assert.strictEqual(status.details, 'test status message');
+    done();
+  });
+  duplex.on('error', function(){});
+  duplex.write(arg);
+  duplex.end();
+}
+
+function unimplementedMethod(client, done) {
+  client.unimplementedCall({}, function(err, resp) {
+    assert(err);
+    assert.strictEqual(err.code, grpc.status.UNIMPLEMENTED);
+    assert(!err.message);
+    done();
+  });
+}
+
 /**
  * Run one of the authentication tests.
  * @param {string} expected_user The expected username in the response
@@ -280,67 +391,110 @@ function timeoutOnSleepingServer(client, done) {
  *     primarily for use with mocha
  */
 function authTest(expected_user, scope, client, done) {
-  (new GoogleAuth()).getApplicationDefault(function(err, credential) {
+  var arg = {
+    response_type: 'COMPRESSABLE',
+    response_size: 314159,
+    payload: {
+      body: zeroBuffer(271828)
+    },
+    fill_username: true,
+    fill_oauth_scope: true
+  };
+  client.unaryCall(arg, function(err, resp) {
     assert.ifError(err);
-    if (credential.createScopedRequired() && scope) {
-      credential = credential.createScoped(scope);
+    assert.strictEqual(resp.payload.type, 'COMPRESSABLE');
+    assert.strictEqual(resp.payload.body.length, 314159);
+    assert.strictEqual(resp.username, expected_user);
+    if (scope) {
+      assert(scope.indexOf(resp.oauth_scope) > -1);
+    }
+    if (done) {
+      done();
     }
-    client.$updateMetadata = grpc.getGoogleAuthDelegate(credential);
+  });
+}
+
+function computeEngineCreds(client, done, extra) {
+  authTest(extra.service_account, null, client, done);
+}
+
+function serviceAccountCreds(client, done, extra) {
+  authTest(SERVICE_ACCOUNT_EMAIL, extra.oauth_scope, client, done);
+}
+
+function jwtTokenCreds(client, done, extra) {
+  authTest(SERVICE_ACCOUNT_EMAIL, null, client, done);
+}
+
+function oauth2Test(client, done, extra) {
+  var arg = {
+    fill_username: true,
+    fill_oauth_scope: true
+  };
+  client.unaryCall(arg, function(err, resp) {
+    assert.ifError(err);
+    assert.strictEqual(resp.username, SERVICE_ACCOUNT_EMAIL);
+    assert(extra.oauth_scope.indexOf(resp.oauth_scope) > -1);
+    if (done) {
+      done();
+    }
+  });
+}
+
+function perRpcAuthTest(client, done, extra) {
+  (new GoogleAuth()).getApplicationDefault(function(err, credential) {
+    assert.ifError(err);
     var arg = {
-      response_type: 'COMPRESSABLE',
-      response_size: 314159,
-      payload: {
-        body: zeroBuffer(271828)
-      },
       fill_username: true,
       fill_oauth_scope: true
     };
+    var scope = extra.oauth_scope;
+    if (credential.createScopedRequired() && scope) {
+      credential = credential.createScoped(scope);
+    }
+    var creds = grpc.credentials.createFromGoogleCredential(credential);
     client.unaryCall(arg, function(err, resp) {
       assert.ifError(err);
-      assert.strictEqual(resp.payload.type, 'COMPRESSABLE');
-      assert.strictEqual(resp.payload.body.length, 314159);
-      assert.strictEqual(resp.username, expected_user);
-      if (scope) {
-        assert.strictEqual(resp.oauth_scope, AUTH_SCOPE_RESPONSE);
-      }
+      assert.strictEqual(resp.username, SERVICE_ACCOUNT_EMAIL);
+      assert(extra.oauth_scope.indexOf(resp.oauth_scope) > -1);
       if (done) {
         done();
       }
-    });
+    }, null, {credentials: creds});
   });
 }
 
-function oauth2Test(expected_user, scope, per_rpc, client, done) {
+function getApplicationCreds(scope, callback) {
   (new GoogleAuth()).getApplicationDefault(function(err, credential) {
-    assert.ifError(err);
-    var arg = {
-      fill_username: true,
-      fill_oauth_scope: true
-    };
+    if (err) {
+      callback(err);
+      return;
+    }
+    if (credential.createScopedRequired() && scope) {
+      credential = credential.createScoped(scope);
+    }
+    callback(null, grpc.credentials.createFromGoogleCredential(credential));
+  });
+}
+
+function getOauth2Creds(scope, callback) {
+  (new GoogleAuth()).getApplicationDefault(function(err, credential) {
+    if (err) {
+      callback(err);
+      return;
+    }
     credential = credential.createScoped(scope);
     credential.getAccessToken(function(err, token) {
-      assert.ifError(err);
-      var updateMetadata = function(authURI, metadata, callback) {
+      if (err) {
+        callback(err);
+        return;
+      }
+      var updateMd = function(service_url, callback) {
+        var metadata = new grpc.Metadata();
         metadata.add('authorization', 'Bearer ' + token);
         callback(null, metadata);
       };
-      var makeTestCall = function(error, client_metadata) {
-        assert.ifError(error);
-        client.unaryCall(arg, function(err, resp) {
-          assert.ifError(err);
-          assert.strictEqual(resp.username, expected_user);
-          assert.strictEqual(resp.oauth_scope, AUTH_SCOPE_RESPONSE);
-          if (done) {
-            done();
-          }
-        }, client_metadata);
-      };
-      if (per_rpc) {
-        updateMetadata('', new grpc.Metadata(), makeTestCall);
-      } else {
-        client.$updateMetadata = updateMetadata;
-        makeTestCall(null, new grpc.Metadata());
-      }
+      callback(null, grpc.credentials.createFromMetadataGenerator(updateMd));
     });
   });
 }
@@ -349,20 +503,44 @@ function oauth2Test(expected_user, scope, per_rpc, client, done) {
  * Map from test case names to test functions
  */
 var test_cases = {
-  empty_unary: emptyUnary,
-  large_unary: largeUnary,
-  client_streaming: clientStreaming,
-  server_streaming: serverStreaming,
-  ping_pong: pingPong,
-  empty_stream: emptyStream,
-  cancel_after_begin: cancelAfterBegin,
-  cancel_after_first_response: cancelAfterFirstResponse,
-  timeout_on_sleeping_server: timeoutOnSleepingServer,
-  compute_engine_creds: _.partial(authTest, COMPUTE_ENGINE_USER, null),
-  service_account_creds: _.partial(authTest, AUTH_USER, AUTH_SCOPE),
-  jwt_token_creds: _.partial(authTest, AUTH_USER, null),
-  oauth2_auth_token: _.partial(oauth2Test, AUTH_USER, AUTH_SCOPE, false),
-  per_rpc_creds: _.partial(oauth2Test, AUTH_USER, AUTH_SCOPE, true)
+  empty_unary: {run: emptyUnary,
+                Client: testProto.TestService},
+  large_unary: {run: largeUnary,
+                Client: testProto.TestService},
+  client_streaming: {run: clientStreaming,
+                     Client: testProto.TestService},
+  server_streaming: {run: serverStreaming,
+                     Client: testProto.TestService},
+  ping_pong: {run: pingPong,
+              Client: testProto.TestService},
+  empty_stream: {run: emptyStream,
+                 Client: testProto.TestService},
+  cancel_after_begin: {run: cancelAfterBegin,
+                       Client: testProto.TestService},
+  cancel_after_first_response: {run: cancelAfterFirstResponse,
+                                Client: testProto.TestService},
+  timeout_on_sleeping_server: {run: timeoutOnSleepingServer,
+                               Client: testProto.TestService},
+  custom_metadata: {run: customMetadata,
+                    Client: testProto.TestService},
+  status_code_and_message: {run: statusCodeAndMessage,
+                            Client: testProto.TestService},
+  unimplemented_method: {run: unimplementedMethod,
+                         Client: testProto.UnimplementedService},
+  compute_engine_creds: {run: computeEngineCreds,
+                         Client: testProto.TestService,
+                         getCreds: getApplicationCreds},
+  service_account_creds: {run: serviceAccountCreds,
+                          Client: testProto.TestService,
+                          getCreds: getApplicationCreds},
+  jwt_token_creds: {run: jwtTokenCreds,
+                    Client: testProto.TestService,
+                    getCreds: getApplicationCreds},
+  oauth2_auth_token: {run: oauth2Test,
+                      Client: testProto.TestService,
+                      getCreds: getOauth2Creds},
+  per_rpc_creds: {run: perRpcAuthTest,
+                  Client: testProto.TestService}
 };
 
 /**
@@ -375,8 +553,9 @@ var test_cases = {
  * @param {bool} tls Indicates that a secure channel should be used
  * @param {function} done Callback to call when the test is completed. Included
  *     primarily for use with mocha
+ * @param {object=} extra Extra options for some tests
  */
-function runTest(address, host_override, test_case, tls, test_ca, done) {
+function runTest(address, host_override, test_case, tls, test_ca, done, extra) {
   // TODO(mlumish): enable TLS functionality
   var options = {};
   var creds;
@@ -388,30 +567,49 @@ function runTest(address, host_override, test_case, tls, test_ca, done) {
       ca_path = process.env.SSL_CERT_FILE;
     }
     var ca_data = fs.readFileSync(ca_path);
-    creds = grpc.Credentials.createSsl(ca_data);
+    creds = grpc.credentials.createSsl(ca_data);
     if (host_override) {
       options['grpc.ssl_target_name_override'] = host_override;
       options['grpc.default_authority'] = host_override;
     }
   } else {
-    creds = grpc.Credentials.createInsecure();
+    creds = grpc.credentials.createInsecure();
   }
-  var client = new testProto.TestService(address, creds, options);
+  var test = test_cases[test_case];
+
+  var execute = function(err, creds) {
+    assert.ifError(err);
+    var client = new test.Client(address, creds, options);
+    test.run(client, done, extra);
+  };
 
-  test_cases[test_case](client, done);
+  if (test.getCreds) {
+    test.getCreds(extra.oauth_scope, function(err, new_creds) {
+      assert.ifError(err);
+      execute(err, grpc.credentials.combineChannelCredentials(
+          creds, new_creds));
+    });
+  } else {
+    execute(null, creds);
+  }
 }
 
 if (require.main === module) {
   var parseArgs = require('minimist');
   var argv = parseArgs(process.argv, {
     string: ['server_host', 'server_host_override', 'server_port', 'test_case',
-             'use_tls', 'use_test_ca']
+             'use_tls', 'use_test_ca', 'default_service_account', 'oauth_scope',
+             'service_account_key_file']
   });
+  var extra_args = {
+    service_account: argv.default_service_account,
+    oauth_scope: argv.oauth_scope
+  };
   runTest(argv.server_host + ':' + argv.server_port, argv.server_host_override,
           argv.test_case, argv.use_tls === 'true', argv.use_test_ca === 'true',
           function () {
             console.log('OK:', argv.test_case);
-          });
+          }, extra_args);
 }
 
 /**
diff --git a/src/node/interop/interop_server.js b/src/node/interop/interop_server.js
index 99155e99584cb0689e29f1c2fad1d1861ca2499b..5321005c863eda160f2d09e510f87bc6dde2ec62 100644
--- a/src/node/interop/interop_server.js
+++ b/src/node/interop/interop_server.js
@@ -37,7 +37,15 @@ var fs = require('fs');
 var path = require('path');
 var _ = require('lodash');
 var grpc = require('..');
-var testProto = grpc.load(__dirname + '/test.proto').grpc.testing;
+var testProto = grpc.load({
+  root: __dirname + '/../../..',
+  file: 'test/proto/test.proto'}).grpc.testing;
+
+var ECHO_INITIAL_KEY = 'x-grpc-test-echo-initial';
+var ECHO_TRAILING_KEY = 'x-grpc-test-echo-trailing-bin';
+
+var incompressible_data = fs.readFileSync(
+    __dirname + '/../../../test/cpp/interop/rnd.dat');
 
 /**
  * Create a buffer filled with size zeroes
@@ -50,6 +58,47 @@ function zeroBuffer(size) {
   return zeros;
 }
 
+/**
+ * Echos a header metadata item as specified in the interop spec.
+ * @param {Call} call The call to echo metadata on
+ */
+function echoHeader(call) {
+  var echo_initial = call.metadata.get(ECHO_INITIAL_KEY);
+  if (echo_initial.length > 0) {
+    var response_metadata = new grpc.Metadata();
+    response_metadata.set(ECHO_INITIAL_KEY, echo_initial[0]);
+    call.sendMetadata(response_metadata);
+  }
+}
+
+/**
+ * Gets the trailer metadata that should be echoed when the call is done,
+ * as specified in the interop spec.
+ * @param {Call} call The call to get metadata from
+ * @return {grpc.Metadata} The metadata to send as a trailer
+ */
+function getEchoTrailer(call) {
+  var echo_trailer = call.metadata.get(ECHO_TRAILING_KEY);
+  var response_trailer = new grpc.Metadata();
+  if (echo_trailer.length > 0) {
+    response_trailer.set(ECHO_TRAILING_KEY, echo_trailer[0]);
+  }
+  return response_trailer;
+}
+
+function getPayload(payload_type, size) {
+  if (payload_type === 'RANDOM') {
+    payload_type = ['COMPRESSABLE',
+                    'UNCOMPRESSABLE'][Math.random() < 0.5 ? 0 : 1];
+  }
+  var body;
+  switch (payload_type) {
+    case 'COMPRESSABLE': body = zeroBuffer(size); break;
+    case 'UNCOMPRESSABLE': incompressible_data.slice(size); break;
+  }
+  return {type: payload_type, body: body};
+}
+
 /**
  * Respond to an empty parameter with an empty response.
  * NOTE: this currently does not work due to issue #137
@@ -58,7 +107,8 @@ function zeroBuffer(size) {
  *     or error
  */
 function handleEmpty(call, callback) {
-  callback(null, {});
+  echoHeader(call);
+  callback(null, {}, getEchoTrailer(call));
 }
 
 /**
@@ -68,14 +118,17 @@ function handleEmpty(call, callback) {
  *     error
  */
 function handleUnary(call, callback) {
+  echoHeader(call);
   var req = call.request;
-  var zeros = zeroBuffer(req.response_size);
-  var payload_type = req.response_type;
-  if (payload_type === 'RANDOM') {
-    payload_type = ['COMPRESSABLE',
-                    'UNCOMPRESSABLE'][Math.random() < 0.5 ? 0 : 1];
+  if (req.response_status) {
+    var status = req.response_status;
+    status.metadata = getEchoTrailer(call);
+    callback(status);
+    return;
   }
-  callback(null, {payload: {type: payload_type, body: zeros}});
+  var payload = getPayload(req.response_type, req.response_size);
+  callback(null, {payload: payload},
+           getEchoTrailer(call));
 }
 
 /**
@@ -85,12 +138,14 @@ function handleUnary(call, callback) {
  *     error
  */
 function handleStreamingInput(call, callback) {
+  echoHeader(call);
   var aggregate_size = 0;
   call.on('data', function(value) {
     aggregate_size += value.payload.body.length;
   });
   call.on('end', function() {
-    callback(null, {aggregated_payload_size: aggregate_size});
+    callback(null, {aggregated_payload_size: aggregate_size},
+             getEchoTrailer(call));
   });
 }
 
@@ -99,21 +154,18 @@ function handleStreamingInput(call, callback) {
  * @param {Call} call Call to handle
  */
 function handleStreamingOutput(call) {
+  echoHeader(call);
   var req = call.request;
-  var payload_type = req.response_type;
-  if (payload_type === 'RANDOM') {
-    payload_type = ['COMPRESSABLE',
-                    'UNCOMPRESSABLE'][Math.random() < 0.5 ? 0 : 1];
+  if (req.response_status) {
+    var status = req.response_status;
+    status.metadata = getEchoTrailer(call);
+    call.emit('error', status);
+    return;
   }
   _.each(req.response_parameters, function(resp_param) {
-    call.write({
-      payload: {
-        body: zeroBuffer(resp_param.size),
-        type: payload_type
-      }
-    });
+    call.write({payload: getPayload(req.response_type, resp_param.size)});
   });
-  call.end();
+  call.end(getEchoTrailer(call));
 }
 
 /**
@@ -122,23 +174,20 @@ function handleStreamingOutput(call) {
  * @param {Call} call Call to handle
  */
 function handleFullDuplex(call) {
+  echoHeader(call);
   call.on('data', function(value) {
-    var payload_type = value.response_type;
-    if (payload_type === 'RANDOM') {
-      payload_type = ['COMPRESSABLE',
-                      'UNCOMPRESSABLE'][Math.random() < 0.5 ? 0 : 1];
+    if (value.response_status) {
+      var status = value.response_status;
+      status.metadata = getEchoTrailer(call);
+      call.emit('error', status);
+      return;
     }
     _.each(value.response_parameters, function(resp_param) {
-      call.write({
-        payload: {
-          body: zeroBuffer(resp_param.size),
-          type: payload_type
-        }
-      });
+      call.write({payload: getPayload(value.response_type, resp_param.size)});
     });
   });
   call.on('end', function() {
-    call.end();
+    call.end(getEchoTrailer(call));
   });
 }
 
@@ -148,7 +197,7 @@ function handleFullDuplex(call) {
  * @param {Call} call Call to handle
  */
 function handleHalfDuplex(call) {
-  throw new Error('HalfDuplexCall not yet implemented');
+  call.emit('error', Error('HalfDuplexCall not yet implemented'));
 }
 
 /**
diff --git a/src/node/interop/messages.proto b/src/node/interop/messages.proto
deleted file mode 100644
index 7df85e3c13601ddc64e85a07eeadd502759a5761..0000000000000000000000000000000000000000
--- a/src/node/interop/messages.proto
+++ /dev/null
@@ -1,132 +0,0 @@
-
-// Copyright 2015, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//     * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// Message definitions to be used by integration test service definitions.
-
-syntax = "proto3";
-
-package grpc.testing;
-
-// The type of payload that should be returned.
-enum PayloadType {
-  // Compressable text format.
-  COMPRESSABLE = 0;
-
-  // Uncompressable binary format.
-  UNCOMPRESSABLE = 1;
-
-  // Randomly chosen from all other formats defined in this enum.
-  RANDOM = 2;
-}
-
-// A block of data, to simply increase gRPC message size.
-message Payload {
-  // The type of data in body.
-  PayloadType type = 1;
-  // Primary contents of payload.
-  bytes body = 2;
-}
-
-// Unary request.
-message SimpleRequest {
-  // Desired payload type in the response from the server.
-  // If response_type is RANDOM, server randomly chooses one from other formats.
-  PayloadType response_type = 1;
-
-  // Desired payload size in the response from the server.
-  // If response_type is COMPRESSABLE, this denotes the size before compression.
-  int32 response_size = 2;
-
-  // Optional input payload sent along with the request.
-  Payload payload = 3;
-
-  // Whether SimpleResponse should include username.
-  bool fill_username = 4;
-
-  // Whether SimpleResponse should include OAuth scope.
-  bool fill_oauth_scope = 5;
-}
-
-// Unary response, as configured by the request.
-message SimpleResponse {
-  // Payload to increase message size.
-  Payload payload = 1;
-  // The user the request came from, for verifying authentication was
-  // successful when the client expected it.
-  string username = 2;
-  // OAuth scope.
-  string oauth_scope = 3;
-}
-
-// Client-streaming request.
-message StreamingInputCallRequest {
-  // Optional input payload sent along with the request.
-  Payload payload = 1;
-
-  // Not expecting any payload from the response.
-}
-
-// Client-streaming response.
-message StreamingInputCallResponse {
-  // Aggregated size of payloads received from the client.
-  int32 aggregated_payload_size = 1;
-}
-
-// Configuration for a particular response.
-message ResponseParameters {
-  // Desired payload sizes in responses from the server.
-  // If response_type is COMPRESSABLE, this denotes the size before compression.
-  int32 size = 1;
-
-  // Desired interval between consecutive responses in the response stream in
-  // microseconds.
-  int32 interval_us = 2;
-}
-
-// Server-streaming request.
-message StreamingOutputCallRequest {
-  // Desired payload type in the response from the server.
-  // If response_type is RANDOM, the payload from each response in the stream
-  // might be of different types. This is to simulate a mixed type of payload
-  // stream.
-  PayloadType response_type = 1;
-
-  // Configuration for each expected response message.
-  repeated ResponseParameters response_parameters = 2;
-
-  // Optional input payload sent along with the request.
-  Payload payload = 3;
-}
-
-// Server-streaming response, as configured by the request and parameters.
-message StreamingOutputCallResponse {
-  // Payload to increase response size.
-  Payload payload = 1;
-}
diff --git a/src/node/interop/test.proto b/src/node/interop/test.proto
deleted file mode 100644
index 24e67497fa66ba175f99eab6d0c28573eac0235d..0000000000000000000000000000000000000000
--- a/src/node/interop/test.proto
+++ /dev/null
@@ -1,72 +0,0 @@
-
-// Copyright 2015, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//     * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// An integration test service that covers all the method signature permutations
-// of unary/streaming requests/responses.
-
-syntax = "proto3";
-
-import "empty.proto";
-import "messages.proto";
-
-package grpc.testing;
-
-// A simple service to test the various types of RPCs and experiment with
-// performance with various types of payload.
-service TestService {
-  // One empty request followed by one empty response.
-  rpc EmptyCall(grpc.testing.Empty) returns (grpc.testing.Empty);
-
-  // One request followed by one response.
-  rpc UnaryCall(SimpleRequest) returns (SimpleResponse);
-
-  // One request followed by a sequence of responses (streamed download).
-  // The server returns the payload with client desired type and sizes.
-  rpc StreamingOutputCall(StreamingOutputCallRequest)
-      returns (stream StreamingOutputCallResponse);
-
-  // A sequence of requests followed by one response (streamed upload).
-  // The server returns the aggregated size of client payload as the result.
-  rpc StreamingInputCall(stream StreamingInputCallRequest)
-      returns (StreamingInputCallResponse);
-
-  // A sequence of requests with each request served by the server immediately.
-  // As one request could lead to multiple responses, this interface
-  // demonstrates the idea of full duplexing.
-  rpc FullDuplexCall(stream StreamingOutputCallRequest)
-      returns (stream StreamingOutputCallResponse);
-
-  // A sequence of requests followed by a sequence of responses.
-  // The server buffers all the client requests and then serves them in order. A
-  // stream of responses are returned to the client when the server starts with
-  // first request.
-  rpc HalfDuplexCall(stream StreamingOutputCallRequest)
-      returns (stream StreamingOutputCallResponse);
-}
diff --git a/src/node/examples/perf_test.js b/src/node/performance/perf_test.js
similarity index 98%
rename from src/node/examples/perf_test.js
rename to src/node/performance/perf_test.js
index ba8fbf88d245a6df9aac7a4a948d52f5b6d85e35..fe51e4a603e09004092eb6ba5d46d42a5dc93e8f 100644
--- a/src/node/examples/perf_test.js
+++ b/src/node/performance/perf_test.js
@@ -42,7 +42,7 @@ function runTest(iterations, callback) {
   var testServer = interop_server.getServer(0, false);
   testServer.server.start();
   var client = new testProto.TestService('localhost:' + testServer.port,
-                                         grpc.Credentials.createInsecure());
+                                         grpc.credentials.createInsecure());
 
   function runIterations(finish) {
     var start = process.hrtime();
diff --git a/src/node/examples/qps_test.js b/src/node/performance/qps_test.js
similarity index 98%
rename from src/node/examples/qps_test.js
rename to src/node/performance/qps_test.js
index ec968b8540bcf46addfb8ba8eb9fbc094c8b8419..491f47364c08922e29337502b450d66bf440b363 100644
--- a/src/node/examples/qps_test.js
+++ b/src/node/performance/qps_test.js
@@ -62,7 +62,7 @@ function runTest(concurrent_calls, seconds, callback) {
   var testServer = interop_server.getServer(0, false);
   testServer.server.start();
   var client = new testProto.TestService('localhost:' + testServer.port,
-                                         grpc.Credentials.createInsecure());
+                                         grpc.credentials.createInsecure());
 
   var warmup_num = 100;
 
diff --git a/src/node/src/client.js b/src/node/src/client.js
index 7f510231b34a4a1058b92bf604ab6b1976d90bad..909376e76640d15a7e4697a4b6532722a390f194 100644
--- a/src/node/src/client.js
+++ b/src/node/src/client.js
@@ -40,7 +40,7 @@
 
 var _ = require('lodash');
 
-var grpc = require('bindings')('grpc.node');
+var grpc = require('bindings')('grpc_node');
 
 var common = require('./common');
 
@@ -54,7 +54,7 @@ var Readable = stream.Readable;
 var Writable = stream.Writable;
 var Duplex = stream.Duplex;
 var util = require('util');
-var version = require('../package.json').version;
+var version = require('../../../package.json').version;
 
 util.inherits(ClientWritableStream, Writable);
 
@@ -233,17 +233,23 @@ function getCall(channel, method, options) {
   var host;
   var parent;
   var propagate_flags;
+  var credentials;
   if (options) {
     deadline = options.deadline;
     host = options.host;
     parent = _.get(options, 'parent.call');
     propagate_flags = options.propagate_flags;
+    credentials = options.credentials;
   }
   if (deadline === undefined) {
     deadline = Infinity;
   }
-  return new grpc.Call(channel, method, deadline, host,
-                       parent, propagate_flags);
+  var call = new grpc.Call(channel, method, deadline, host,
+                           parent, propagate_flags);
+  if (credentials) {
+    call.setCredentials(credentials);
+  }
+  return call;
 }
 
 /**
@@ -282,60 +288,53 @@ function makeUnaryRequestFunction(method, serialize, deserialize) {
     emitter.getPeer = function getPeer() {
       return call.getPeer();
     };
-    this.$updateMetadata(this.$auth_uri, metadata, function(error, metadata) {
-      if (error) {
-        call.cancel();
-        callback(error);
-        return;
-      }
-      var client_batch = {};
-      var message = serialize(argument);
-      if (options) {
-        message.grpcWriteFlags = options.flags;
-      }
-      client_batch[grpc.opType.SEND_INITIAL_METADATA] =
-          metadata._getCoreRepresentation();
-      client_batch[grpc.opType.SEND_MESSAGE] = message;
-      client_batch[grpc.opType.SEND_CLOSE_FROM_CLIENT] = true;
-      client_batch[grpc.opType.RECV_INITIAL_METADATA] = true;
-      client_batch[grpc.opType.RECV_MESSAGE] = true;
-      client_batch[grpc.opType.RECV_STATUS_ON_CLIENT] = true;
-      call.startBatch(client_batch, function(err, response) {
-        response.status.metadata = Metadata._fromCoreRepresentation(
-              response.status.metadata);
-        var status = response.status;
-        var error;
-        var deserialized;
-        if (status.code === grpc.status.OK) {
-          if (err) {
-            // Got a batch error, but OK status. Something went wrong
-            callback(err);
-            return;
-          } else {
-            try {
-              deserialized = deserialize(response.read);
-            } catch (e) {
-              /* Change status to indicate bad server response. This will result
-               * in passing an error to the callback */
-              status = {
-                code: grpc.status.INTERNAL,
-                details: 'Failed to parse server response'
-              };
-            }
-          }
-        }
-        if (status.code !== grpc.status.OK) {
-          error = new Error(response.status.details);
-          error.code = status.code;
-          error.metadata = status.metadata;
-          callback(error);
+    var client_batch = {};
+    var message = serialize(argument);
+    if (options) {
+      message.grpcWriteFlags = options.flags;
+    }
+    client_batch[grpc.opType.SEND_INITIAL_METADATA] =
+        metadata._getCoreRepresentation();
+    client_batch[grpc.opType.SEND_MESSAGE] = message;
+    client_batch[grpc.opType.SEND_CLOSE_FROM_CLIENT] = true;
+    client_batch[grpc.opType.RECV_INITIAL_METADATA] = true;
+    client_batch[grpc.opType.RECV_MESSAGE] = true;
+    client_batch[grpc.opType.RECV_STATUS_ON_CLIENT] = true;
+    call.startBatch(client_batch, function(err, response) {
+      response.status.metadata = Metadata._fromCoreRepresentation(
+          response.status.metadata);
+      var status = response.status;
+      var error;
+      var deserialized;
+      if (status.code === grpc.status.OK) {
+        if (err) {
+          // Got a batch error, but OK status. Something went wrong
+          callback(err);
+          return;
         } else {
-          callback(null, deserialized);
+          try {
+            deserialized = deserialize(response.read);
+          } catch (e) {
+            /* Change status to indicate bad server response. This will result
+             * in passing an error to the callback */
+            status = {
+              code: grpc.status.INTERNAL,
+              details: 'Failed to parse server response'
+            };
+          }
         }
-        emitter.emit('status', status);
-        emitter.emit('metadata', Metadata._fromCoreRepresentation(
-            response.metadata));
-      });
+      }
+      if (status.code !== grpc.status.OK) {
+        error = new Error(response.status.details);
+        error.code = status.code;
+        error.metadata = status.metadata;
+        callback(error);
+      } else {
+        callback(null, deserialized);
+      }
+      emitter.emit('status', status);
+      emitter.emit('metadata', Metadata._fromCoreRepresentation(
+          response.metadata));
     });
     return emitter;
   }
@@ -371,62 +370,55 @@ function makeClientStreamRequestFunction(method, serialize, deserialize) {
       metadata = metadata.clone();
     }
     var stream = new ClientWritableStream(call, serialize);
-    this.$updateMetadata(this.$auth_uri, metadata, function(error, metadata) {
-      if (error) {
-        call.cancel();
-        callback(error);
+    var metadata_batch = {};
+    metadata_batch[grpc.opType.SEND_INITIAL_METADATA] =
+        metadata._getCoreRepresentation();
+    metadata_batch[grpc.opType.RECV_INITIAL_METADATA] = true;
+    call.startBatch(metadata_batch, function(err, response) {
+      if (err) {
+        // The call has stopped for some reason. A non-OK status will arrive
+        // in the other batch.
         return;
       }
-      var metadata_batch = {};
-      metadata_batch[grpc.opType.SEND_INITIAL_METADATA] =
-          metadata._getCoreRepresentation();
-      metadata_batch[grpc.opType.RECV_INITIAL_METADATA] = true;
-      call.startBatch(metadata_batch, function(err, response) {
+      stream.emit('metadata', Metadata._fromCoreRepresentation(
+          response.metadata));
+    });
+    var client_batch = {};
+    client_batch[grpc.opType.RECV_MESSAGE] = true;
+    client_batch[grpc.opType.RECV_STATUS_ON_CLIENT] = true;
+    call.startBatch(client_batch, function(err, response) {
+      response.status.metadata = Metadata._fromCoreRepresentation(
+          response.status.metadata);
+      var status = response.status;
+      var error;
+      var deserialized;
+      if (status.code === grpc.status.OK) {
         if (err) {
-          // The call has stopped for some reason. A non-OK status will arrive
-          // in the other batch.
+          // Got a batch error, but OK status. Something went wrong
+          callback(err);
           return;
-        }
-        stream.emit('metadata', Metadata._fromCoreRepresentation(
-            response.metadata));
-      });
-      var client_batch = {};
-      client_batch[grpc.opType.RECV_MESSAGE] = true;
-      client_batch[grpc.opType.RECV_STATUS_ON_CLIENT] = true;
-      call.startBatch(client_batch, function(err, response) {
-        response.status.metadata = Metadata._fromCoreRepresentation(
-              response.status.metadata);
-        var status = response.status;
-        var error;
-        var deserialized;
-        if (status.code === grpc.status.OK) {
-          if (err) {
-            // Got a batch error, but OK status. Something went wrong
-            callback(err);
-            return;
-          } else {
-            try {
-              deserialized = deserialize(response.read);
-            } catch (e) {
-              /* Change status to indicate bad server response. This will result
-               * in passing an error to the callback */
-              status = {
-                code: grpc.status.INTERNAL,
-                details: 'Failed to parse server response'
-              };
-            }
-          }
-        }
-        if (status.code !== grpc.status.OK) {
-          error = new Error(response.status.details);
-          error.code = status.code;
-          error.metadata = status.metadata;
-          callback(error);
         } else {
-          callback(null, deserialized);
+          try {
+            deserialized = deserialize(response.read);
+          } catch (e) {
+            /* Change status to indicate bad server response. This will result
+             * in passing an error to the callback */
+            status = {
+              code: grpc.status.INTERNAL,
+              details: 'Failed to parse server response'
+            };
+          }
         }
-        stream.emit('status', status);
-      });
+      }
+      if (status.code !== grpc.status.OK) {
+        error = new Error(response.status.details);
+        error.code = status.code;
+        error.metadata = status.metadata;
+        callback(error);
+      } else {
+        callback(null, deserialized);
+      }
+      stream.emit('status', status);
     });
     return stream;
   }
@@ -462,51 +454,44 @@ function makeServerStreamRequestFunction(method, serialize, deserialize) {
       metadata = metadata.clone();
     }
     var stream = new ClientReadableStream(call, deserialize);
-    this.$updateMetadata(this.$auth_uri, metadata, function(error, metadata) {
-      if (error) {
-        call.cancel();
-        stream.emit('error', error);
+    var start_batch = {};
+    var message = serialize(argument);
+    if (options) {
+      message.grpcWriteFlags = options.flags;
+    }
+    start_batch[grpc.opType.SEND_INITIAL_METADATA] =
+        metadata._getCoreRepresentation();
+    start_batch[grpc.opType.RECV_INITIAL_METADATA] = true;
+    start_batch[grpc.opType.SEND_MESSAGE] = message;
+    start_batch[grpc.opType.SEND_CLOSE_FROM_CLIENT] = true;
+    call.startBatch(start_batch, function(err, response) {
+      if (err) {
+        // The call has stopped for some reason. A non-OK status will arrive
+        // in the other batch.
         return;
       }
-      var start_batch = {};
-      var message = serialize(argument);
-      if (options) {
-        message.grpcWriteFlags = options.flags;
-      }
-      start_batch[grpc.opType.SEND_INITIAL_METADATA] =
-          metadata._getCoreRepresentation();
-      start_batch[grpc.opType.RECV_INITIAL_METADATA] = true;
-      start_batch[grpc.opType.SEND_MESSAGE] = message;
-      start_batch[grpc.opType.SEND_CLOSE_FROM_CLIENT] = true;
-      call.startBatch(start_batch, function(err, response) {
+      stream.emit('metadata', Metadata._fromCoreRepresentation(
+          response.metadata));
+    });
+    var status_batch = {};
+    status_batch[grpc.opType.RECV_STATUS_ON_CLIENT] = true;
+    call.startBatch(status_batch, function(err, response) {
+      response.status.metadata = Metadata._fromCoreRepresentation(
+          response.status.metadata);
+      stream.emit('status', response.status);
+      if (response.status.code !== grpc.status.OK) {
+        var error = new Error(response.status.details);
+        error.code = response.status.code;
+        error.metadata = response.status.metadata;
+        stream.emit('error', error);
+        return;
+      } else {
         if (err) {
-          // The call has stopped for some reason. A non-OK status will arrive
-          // in the other batch.
-          return;
-        }
-        stream.emit('metadata', Metadata._fromCoreRepresentation(
-            response.metadata));
-      });
-      var status_batch = {};
-      status_batch[grpc.opType.RECV_STATUS_ON_CLIENT] = true;
-      call.startBatch(status_batch, function(err, response) {
-        response.status.metadata = Metadata._fromCoreRepresentation(
-              response.status.metadata);
-        stream.emit('status', response.status);
-        if (response.status.code !== grpc.status.OK) {
-          var error = new Error(response.status.details);
-          error.code = response.status.code;
-          error.metadata = response.status.metadata;
-          stream.emit('error', error);
+          // Got a batch error, but OK status. Something went wrong
+          stream.emit('error', err);
           return;
-        } else {
-          if (err) {
-            // Got a batch error, but OK status. Something went wrong
-            stream.emit('error', err);
-            return;
-          }
         }
-      });
+      }
     });
     return stream;
   }
@@ -540,45 +525,38 @@ function makeBidiStreamRequestFunction(method, serialize, deserialize) {
       metadata = metadata.clone();
     }
     var stream = new ClientDuplexStream(call, serialize, deserialize);
-    this.$updateMetadata(this.$auth_uri, metadata, function(error, metadata) {
-      if (error) {
-        call.cancel();
-        stream.emit('error', error);
+    var start_batch = {};
+    start_batch[grpc.opType.SEND_INITIAL_METADATA] =
+        metadata._getCoreRepresentation();
+    start_batch[grpc.opType.RECV_INITIAL_METADATA] = true;
+    call.startBatch(start_batch, function(err, response) {
+      if (err) {
+        // The call has stopped for some reason. A non-OK status will arrive
+        // in the other batch.
         return;
       }
-      var start_batch = {};
-      start_batch[grpc.opType.SEND_INITIAL_METADATA] =
-          metadata._getCoreRepresentation();
-      start_batch[grpc.opType.RECV_INITIAL_METADATA] = true;
-      call.startBatch(start_batch, function(err, response) {
+      stream.emit('metadata', Metadata._fromCoreRepresentation(
+          response.metadata));
+    });
+    var status_batch = {};
+    status_batch[grpc.opType.RECV_STATUS_ON_CLIENT] = true;
+    call.startBatch(status_batch, function(err, response) {
+      response.status.metadata = Metadata._fromCoreRepresentation(
+          response.status.metadata);
+      stream.emit('status', response.status);
+      if (response.status.code !== grpc.status.OK) {
+        var error = new Error(response.status.details);
+        error.code = response.status.code;
+        error.metadata = response.status.metadata;
+        stream.emit('error', error);
+        return;
+      } else {
         if (err) {
-          // The call has stopped for some reason. A non-OK status will arrive
-          // in the other batch.
+          // Got a batch error, but OK status. Something went wrong
+          stream.emit('error', err);
           return;
         }
-        stream.emit('metadata', Metadata._fromCoreRepresentation(
-            response.metadata));
-      });
-      var status_batch = {};
-      status_batch[grpc.opType.RECV_STATUS_ON_CLIENT] = true;
-      call.startBatch(status_batch, function(err, response) {
-        response.status.metadata = Metadata._fromCoreRepresentation(
-              response.status.metadata);
-        stream.emit('status', response.status);
-        if (response.status.code !== grpc.status.OK) {
-          var error = new Error(response.status.details);
-          error.code = response.status.code;
-          error.metadata = response.status.metadata;
-          stream.emit('error', error);
-          return;
-        } else {
-          if (err) {
-            // Got a batch error, but OK status. Something went wrong
-            stream.emit('error', err);
-            return;
-          }
-        }
-      });
+      }
     });
     return stream;
   }
@@ -618,15 +596,8 @@ exports.makeClientConstructor = function(methods, serviceName) {
    * @param {grpc.Credentials} credentials Credentials to use to connect
    *     to the server
    * @param {Object} options Options to pass to the underlying channel
-   * @param {function(string, Object, function)=} updateMetadata function to
-   *     update the metadata for each request
    */
-  function Client(address, credentials, options, updateMetadata) {
-    if (!updateMetadata) {
-      updateMetadata = function(uri, metadata, callback) {
-        callback(null, metadata);
-      };
-    }
+  function Client(address, credentials, options) {
     if (!options) {
       options = {};
     }
@@ -634,11 +605,6 @@ exports.makeClientConstructor = function(methods, serviceName) {
     /* Private fields use $ as a prefix instead of _ because it is an invalid
      * prefix of a method name */
     this.$channel = new grpc.Channel(address, credentials, options);
-    // Remove the optional DNS scheme, trailing port, and trailing backslash
-    address = address.replace(/^(dns:\/{3})?([^:\/]+)(:\d+)?\/?$/, '$2');
-    this.$server_address = address;
-    this.$auth_uri = 'https://' + this.$server_address + '/' + serviceName;
-    this.$updateMetadata = updateMetadata;
   }
 
   _.each(methods, function(attrs, name) {
diff --git a/src/node/src/credentials.js b/src/node/src/credentials.js
new file mode 100644
index 0000000000000000000000000000000000000000..ddc094f89684de28988a9633efaca44f5d02f848
--- /dev/null
+++ b/src/node/src/credentials.js
@@ -0,0 +1,163 @@
+/*
+ *
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+/**
+ * Credentials module
+ *
+ * This module contains factory methods for two different credential types:
+ * CallCredentials and ChannelCredentials. ChannelCredentials are things like
+ * SSL credentials that can be used to secure a connection, and are used to
+ * construct a Client object. CallCredentials genrally modify metadata, so they
+ * can be attached to an individual method call.
+ *
+ * CallCredentials can be composed with other CallCredentials to create
+ * CallCredentials. ChannelCredentials can be composed with CallCredentials
+ * to create ChannelCredentials. No combined credential can have more than
+ * one ChannelCredentials.
+ *
+ * For example, to create a client secured with SSL that uses Google
+ * default application credentials to authenticate:
+ *
+ * var channel_creds = credentials.createSsl(root_certs);
+ * (new GoogleAuth()).getApplicationDefault(function(err, credential) {
+ *   var call_creds = credentials.createFromGoogleCredential(credential);
+ *   var combined_creds = credentials.combineChannelCredentials(
+ *       channel_creds, call_creds);
+ *   var client = new Client(address, combined_creds);
+ * });
+ *
+ * @module
+ */
+
+'use strict';
+
+var grpc = require('bindings')('grpc_node.node');
+
+var CallCredentials = grpc.CallCredentials;
+
+var ChannelCredentials = grpc.ChannelCredentials;
+
+var Metadata = require('./metadata.js');
+
+/**
+ * Create an SSL Credentials object. If using a client-side certificate, both
+ * the second and third arguments must be passed.
+ * @param {Buffer} root_certs The root certificate data
+ * @param {Buffer=} private_key The client certificate private key, if
+ *     applicable
+ * @param {Buffer=} cert_chain The client certificate cert chain, if applicable
+ * @return {ChannelCredentials} The SSL Credentials object
+ */
+exports.createSsl = ChannelCredentials.createSsl;
+
+/**
+ * Create a gRPC credentials object from a metadata generation function. This
+ * function gets the service URL and a callback as parameters. The error
+ * passed to the callback can optionally have a 'code' value attached to it,
+ * which corresponds to a status code that this library uses.
+ * @param {function(String, function(Error, Metadata))} metadata_generator The
+ *     function that generates metadata
+ * @return {CallCredentials} The credentials object
+ */
+exports.createFromMetadataGenerator = function(metadata_generator) {
+  return CallCredentials.createFromPlugin(function(service_url, callback) {
+    metadata_generator(service_url, function(error, metadata) {
+      var code = grpc.status.OK;
+      var message = '';
+      if (error) {
+        message = error.message;
+        if (error.hasOwnProperty('code')) {
+          code = error.code;
+        }
+      }
+      callback(code, message, metadata._getCoreRepresentation());
+    });
+  });
+};
+
+/**
+ * Create a gRPC credential from a Google credential object.
+ * @param {Object} google_credential The Google credential object to use
+ * @return {CallCredentials} The resulting credentials object
+ */
+exports.createFromGoogleCredential = function(google_credential) {
+  return exports.createFromMetadataGenerator(function(service_url, callback) {
+    google_credential.getRequestMetadata(service_url, function(err, header) {
+      if (err) {
+        callback(err);
+        return;
+      }
+      var metadata = new Metadata();
+      metadata.add('authorization', header.Authorization);
+      callback(null, metadata);
+    });
+  });
+};
+
+/**
+ * Combine a ChannelCredentials with any number of CallCredentials into a single
+ * ChannelCredentials object.
+ * @param {ChannelCredentials} channel_credential The ChannelCredentials to
+ *     start with
+ * @param {...CallCredentials} credentials The CallCredentials to compose
+ * @return ChannelCredentials A credentials object that combines all of the
+ *     input credentials
+ */
+exports.combineChannelCredentials = function(channel_credential) {
+  var current = channel_credential;
+  for (var i = 1; i < arguments.length; i++) {
+    current = current.compose(arguments[i]);
+  }
+  return current;
+};
+
+/**
+ * Combine any number of CallCredentials into a single CallCredentials object
+ * @param {...CallCredentials} credentials the CallCredentials to compose
+ * @return CallCredentials A credentials object that combines all of the input
+ *     credentials
+ */
+exports.combineCallCredentials = function() {
+  var current = arguments[0];
+  for (var i = 1; i < arguments.length; i++) {
+    current = current.compose(arguments[i]);
+  }
+  return current;
+};
+
+/**
+ * Create an insecure credentials object. This is used to create a channel that
+ * does not use SSL. This cannot be composed with anything.
+ * @return {ChannelCredentials} The insecure credentials object
+ */
+exports.createInsecure = ChannelCredentials.createInsecure;
diff --git a/src/node/src/metadata.js b/src/node/src/metadata.js
index c1da70b1974f61aaef7e529a9f31de78ce46751e..5c24e46c9b2c8dc70003d442116725aaded38a70 100644
--- a/src/node/src/metadata.js
+++ b/src/node/src/metadata.js
@@ -59,6 +59,7 @@ function normalizeKey(key) {
 function validate(key, value) {
   if (_.endsWith(key, '-bin')) {
     if (!(value instanceof Buffer)) {
+      console.log(value.constructor.toString());
       throw new Error('keys that end with \'-bin\' must have Buffer values');
     }
   } else {
@@ -173,7 +174,9 @@ Metadata.prototype._getCoreRepresentation = function() {
 Metadata._fromCoreRepresentation = function(metadata) {
   var newMetadata = new Metadata();
   if (metadata) {
-    newMetadata._internal_repr = _.cloneDeep(metadata);
+    _.forOwn(metadata, function(value, key) {
+      newMetadata._internal_repr[key] = _.clone(value);
+    });
   }
   return newMetadata;
 };
diff --git a/src/node/src/server.js b/src/node/src/server.js
index 70b4a9d80e3589e8543816df842f702db0f4bfb4..a974d593c95956e0e3a08f4d6fca5711d192d29b 100644
--- a/src/node/src/server.js
+++ b/src/node/src/server.js
@@ -40,7 +40,7 @@
 
 var _ = require('lodash');
 
-var grpc = require('bindings')('grpc.node');
+var grpc = require('bindings')('grpc_node');
 
 var common = require('./common');
 
@@ -629,7 +629,7 @@ function Server(options) {
             (new Metadata())._getCoreRepresentation();
         batch[grpc.opType.SEND_STATUS_FROM_SERVER] = {
           code: grpc.status.UNIMPLEMENTED,
-          details: 'This method is not available on this server.',
+          details: '',
           metadata: {}
         };
         batch[grpc.opType.RECV_CLOSE_ON_SERVER] = true;
diff --git a/src/node/test/async_test.js b/src/node/test/async_test.js
index e81de62bc939de4660ee7a3f3e08c46707a866e6..6d71ea24f54430160265b38d9ac0576d85b907a1 100644
--- a/src/node/test/async_test.js
+++ b/src/node/test/async_test.js
@@ -36,7 +36,7 @@
 var assert = require('assert');
 
 var grpc = require('..');
-var math = grpc.load(__dirname + '/../examples/math.proto').math;
+var math = grpc.load(__dirname + '/math/math.proto').math;
 
 
 /**
@@ -47,7 +47,7 @@ var math_client;
 /**
  * Server to test against
  */
-var getServer = require('../examples/math_server.js');
+var getServer = require('./math/math_server.js');
 
 var server = getServer();
 
@@ -57,7 +57,7 @@ describe('Async functionality', function() {
                                grpc.ServerCredentials.createInsecure());
     server.start();
     math_client = new math.Math('localhost:' + port_num,
-                                grpc.Credentials.createInsecure());
+                                grpc.credentials.createInsecure());
     done();
   });
   after(function() {
diff --git a/src/node/test/call_test.js b/src/node/test/call_test.js
index e7f071bcd537699a892d9fdac608e473de3a2264..c316fe7f10d85ae0aec2c89070c49aeae86a005a 100644
--- a/src/node/test/call_test.js
+++ b/src/node/test/call_test.js
@@ -34,7 +34,7 @@
 'use strict';
 
 var assert = require('assert');
-var grpc = require('bindings')('grpc.node');
+var grpc = require('bindings')('grpc_node');
 
 /**
  * Helper function to return an absolute deadline given a relative timeout in
@@ -48,7 +48,7 @@ function getDeadline(timeout_secs) {
   return deadline;
 }
 
-var insecureCreds = grpc.Credentials.createInsecure();
+var insecureCreds = grpc.ChannelCredentials.createInsecure();
 
 describe('call', function() {
   var channel;
diff --git a/src/node/test/channel_test.js b/src/node/test/channel_test.js
index d81df2a36d88d4c81ddd9c8d133c42702e79bd26..05269f7b6e4ef808d7d023e5baa9046af813fcb3 100644
--- a/src/node/test/channel_test.js
+++ b/src/node/test/channel_test.js
@@ -34,7 +34,7 @@
 'use strict';
 
 var assert = require('assert');
-var grpc = require('bindings')('grpc.node');
+var grpc = require('bindings')('grpc_node');
 
 /**
  * This is used for testing functions with multiple asynchronous calls that
@@ -56,7 +56,7 @@ function multiDone(done, count) {
     }
   };
 }
-var insecureCreds = grpc.Credentials.createInsecure();
+var insecureCreds = grpc.ChannelCredentials.createInsecure();
 
 describe('channel', function() {
   describe('constructor', function() {
@@ -155,6 +155,7 @@ describe('channel', function() {
       deadline.setSeconds(deadline.getSeconds() + 1);
       channel.watchConnectivityState(old_state, deadline, function(err, value) {
         assert(err);
+        console.log('Callback from watchConnectivityState');
         done();
       });
     });
diff --git a/src/node/test/constant_test.js b/src/node/test/constant_test.js
index fa06ad4e4d45d18564e4504cdcc07a3b06abd07a..b17cd339cb0effafdacfd574606376e8f73646f5 100644
--- a/src/node/test/constant_test.js
+++ b/src/node/test/constant_test.js
@@ -34,7 +34,7 @@
 'use strict';
 
 var assert = require('assert');
-var grpc = require('bindings')('grpc.node');
+var grpc = require('bindings')('grpc_node');
 
 /**
  * List of all status names
diff --git a/src/node/test/credentials_test.js b/src/node/test/credentials_test.js
new file mode 100644
index 0000000000000000000000000000000000000000..7fc311a888dc0f139ecca1d7efb4e352c5f17536
--- /dev/null
+++ b/src/node/test/credentials_test.js
@@ -0,0 +1,243 @@
+/*
+ *
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+'use strict';
+
+var assert = require('assert');
+var fs = require('fs');
+var path = require('path');
+
+var grpc = require('..');
+
+/**
+ * This is used for testing functions with multiple asynchronous calls that
+ * can happen in different orders. This should be passed the number of async
+ * function invocations that can occur last, and each of those should call this
+ * function's return value
+ * @param {function()} done The function that should be called when a test is
+ *     complete.
+ * @param {number} count The number of calls to the resulting function if the
+ *     test passes.
+ * @return {function()} The function that should be called at the end of each
+ *     sequence of asynchronous functions.
+ */
+function multiDone(done, count) {
+  return function() {
+    count -= 1;
+    if (count <= 0) {
+      done();
+    }
+  };
+}
+
+describe('client credentials', function() {
+  var Client;
+  var server;
+  var port;
+  var client_ssl_creds;
+  var client_options = {};
+  before(function() {
+    var proto = grpc.load(__dirname + '/test_service.proto');
+    server = new grpc.Server();
+    server.addProtoService(proto.TestService.service, {
+      unary: function(call, cb) {
+        call.sendMetadata(call.metadata);
+        cb(null, {});
+      },
+      clientStream: function(stream, cb){
+        stream.on('data', function(data) {});
+        stream.on('end', function() {
+          stream.sendMetadata(stream.metadata);
+          cb(null, {});
+        });
+      },
+      serverStream: function(stream) {
+        stream.sendMetadata(stream.metadata);
+        stream.end();
+      },
+      bidiStream: function(stream) {
+        stream.on('data', function(data) {});
+        stream.on('end', function() {
+          stream.sendMetadata(stream.metadata);
+          stream.end();
+        });
+      }
+    });
+    var key_path = path.join(__dirname, './data/server1.key');
+    var pem_path = path.join(__dirname, './data/server1.pem');
+    var key_data = fs.readFileSync(key_path);
+    var pem_data = fs.readFileSync(pem_path);
+    var creds = grpc.ServerCredentials.createSsl(null,
+                                                 [{private_key: key_data,
+                                                   cert_chain: pem_data}]);
+    //creds = grpc.ServerCredentials.createInsecure();
+    port = server.bind('localhost:0', creds);
+    server.start();
+
+    Client = proto.TestService;
+    var ca_path = path.join(__dirname, '../test/data/ca.pem');
+    var ca_data = fs.readFileSync(ca_path);
+    client_ssl_creds = grpc.credentials.createSsl(ca_data);
+    var host_override = 'foo.test.google.fr';
+    client_options['grpc.ssl_target_name_override'] = host_override;
+    client_options['grpc.default_authority'] = host_override;
+  });
+  after(function() {
+    server.forceShutdown();
+  });
+  it('Should accept SSL creds for a client', function(done) {
+    var client = new Client('localhost:' + port, client_ssl_creds,
+                            client_options);
+    client.unary({}, function(err, data) {
+      assert.ifError(err);
+      done();
+    });
+  });
+  it('Should update metadata with SSL creds', function(done) {
+    var metadataUpdater = function(service_url, callback) {
+      var metadata = new grpc.Metadata();
+      metadata.set('plugin_key', 'plugin_value');
+      callback(null, metadata);
+    };
+    var creds = grpc.credentials.createFromMetadataGenerator(metadataUpdater);
+    var combined_creds = grpc.credentials.combineChannelCredentials(
+        client_ssl_creds, creds);
+    var client = new Client('localhost:' + port, combined_creds,
+                            client_options);
+    var call = client.unary({}, function(err, data) {
+      assert.ifError(err);
+    });
+    call.on('metadata', function(metadata) {
+      assert.deepEqual(metadata.get('plugin_key'), ['plugin_value']);
+      done();
+    });
+  });
+  it('Should update metadata for two simultaneous calls', function(done) {
+    done = multiDone(done, 2);
+    var metadataUpdater = function(service_url, callback) {
+      var metadata = new grpc.Metadata();
+      metadata.set('plugin_key', 'plugin_value');
+      callback(null, metadata);
+    };
+    var creds = grpc.credentials.createFromMetadataGenerator(metadataUpdater);
+    var combined_creds = grpc.credentials.combineChannelCredentials(
+        client_ssl_creds, creds);
+    var client = new Client('localhost:' + port, combined_creds,
+                            client_options);
+    var call = client.unary({}, function(err, data) {
+      assert.ifError(err);
+    });
+    call.on('metadata', function(metadata) {
+      assert.deepEqual(metadata.get('plugin_key'), ['plugin_value']);
+      done();
+    });
+    var call2 = client.unary({}, function(err, data) {
+      assert.ifError(err);
+    });
+    call2.on('metadata', function(metadata) {
+      assert.deepEqual(metadata.get('plugin_key'), ['plugin_value']);
+      done();
+    });
+  });
+  describe('Per-rpc creds', function() {
+    var client;
+    var updater_creds;
+    before(function() {
+      client = new Client('localhost:' + port, client_ssl_creds,
+                          client_options);
+      var metadataUpdater = function(service_url, callback) {
+        var metadata = new grpc.Metadata();
+        metadata.set('plugin_key', 'plugin_value');
+        callback(null, metadata);
+      };
+      updater_creds = grpc.credentials.createFromMetadataGenerator(
+          metadataUpdater);
+    });
+    it('Should update metadata on a unary call', function(done) {
+      var call = client.unary({}, function(err, data) {
+        assert.ifError(err);
+      }, null, {credentials: updater_creds});
+      call.on('metadata', function(metadata) {
+        assert.deepEqual(metadata.get('plugin_key'), ['plugin_value']);
+        done();
+      });
+    });
+    it('should update metadata on a client streaming call', function(done) {
+      var call = client.clientStream(function(err, data) {
+        assert.ifError(err);
+      }, null, {credentials: updater_creds});
+      call.on('metadata', function(metadata) {
+        assert.deepEqual(metadata.get('plugin_key'), ['plugin_value']);
+        done();
+      });
+      call.end();
+    });
+    it('should update metadata on a server streaming call', function(done) {
+      var call = client.serverStream({}, null, {credentials: updater_creds});
+      call.on('data', function() {});
+      call.on('metadata', function(metadata) {
+        assert.deepEqual(metadata.get('plugin_key'), ['plugin_value']);
+        done();
+      });
+    });
+    it('should update metadata on a bidi streaming call', function(done) {
+      var call = client.bidiStream(null, {credentials: updater_creds});
+      call.on('data', function() {});
+      call.on('metadata', function(metadata) {
+        assert.deepEqual(metadata.get('plugin_key'), ['plugin_value']);
+        done();
+      });
+      call.end();
+    });
+    it('should be able to use multiple plugin credentials', function(done) {
+      var altMetadataUpdater = function(service_url, callback) {
+        var metadata = new grpc.Metadata();
+        metadata.set('other_plugin_key', 'other_plugin_value');
+        callback(null, metadata);
+      };
+      var alt_updater_creds = grpc.credentials.createFromMetadataGenerator(
+          altMetadataUpdater);
+      var combined_updater = grpc.credentials.combineCallCredentials(
+          updater_creds, alt_updater_creds);
+      var call = client.unary({}, function(err, data) {
+        assert.ifError(err);
+      }, null, {credentials: combined_updater});
+      call.on('metadata', function(metadata) {
+        assert.deepEqual(metadata.get('plugin_key'), ['plugin_value']);
+        assert.deepEqual(metadata.get('other_plugin_key'),
+                         ['other_plugin_value']);
+        done();
+      });
+    });
+  });
+});
diff --git a/src/node/test/end_to_end_test.js b/src/node/test/end_to_end_test.js
index 4b8da3bfb171172bfee92fb023632aa17814046d..0f6c5941c4de48246510019d009851d9838ff305 100644
--- a/src/node/test/end_to_end_test.js
+++ b/src/node/test/end_to_end_test.js
@@ -34,7 +34,7 @@
 'use strict';
 
 var assert = require('assert');
-var grpc = require('bindings')('grpc.node');
+var grpc = require('bindings')('grpc_node');
 
 /**
  * This is used for testing functions with multiple asynchronous calls that
@@ -57,7 +57,7 @@ function multiDone(done, count) {
   };
 }
 
-var insecureCreds = grpc.Credentials.createInsecure();
+var insecureCreds = grpc.ChannelCredentials.createInsecure();
 
 describe('end-to-end', function() {
   var server;
diff --git a/src/node/test/health_test.js b/src/node/test/health_test.js
index 9267bff7ebe6f1a9e0ebd320dbbcafa15be6c3a3..a4dc24cf4671e0e085f99e25dd4e7802f82fb657 100644
--- a/src/node/test/health_test.js
+++ b/src/node/test/health_test.js
@@ -54,7 +54,7 @@ describe('Health Checking', function() {
                                      grpc.ServerCredentials.createInsecure());
     healthServer.start();
     healthClient = new health.Client('localhost:' + port_num,
-                                     grpc.Credentials.createInsecure());
+                                     grpc.credentials.createInsecure());
   });
   after(function() {
     healthServer.forceShutdown();
diff --git a/src/node/test/interop_sanity_test.js b/src/node/test/interop_sanity_test.js
index 2ca07c1d50d28a8e0f865327b87a89eeef4be0ef..f8c0b14137796063457096d34047452cd820018f 100644
--- a/src/node/test/interop_sanity_test.js
+++ b/src/node/test/interop_sanity_test.js
@@ -71,7 +71,7 @@ describe('Interop tests', function() {
     interop_client.runTest(port, name_override, 'server_streaming', true, true,
                            done);
   });
-  it('should pass ping_pong', function(done) {
+  it.only('should pass ping_pong', function(done) {
     interop_client.runTest(port, name_override, 'ping_pong', true, true, done);
   });
   it('should pass empty_stream', function(done) {
@@ -90,4 +90,16 @@ describe('Interop tests', function() {
     interop_client.runTest(port, name_override, 'timeout_on_sleeping_server',
                            true, true, done);
   });
+  it('should pass custom_metadata', function(done) {
+    interop_client.runTest(port, name_override, 'custom_metadata',
+                           true, true, done);
+  });
+  it('should pass status_code_and_message', function(done) {
+    interop_client.runTest(port, name_override, 'status_code_and_message',
+                           true, true, done);
+  });
+  it('should pass unimplemented_method', function(done) {
+    interop_client.runTest(port, name_override, 'unimplemented_method',
+                           true, true, done);
+  });
 });
diff --git a/src/node/examples/math.proto b/src/node/test/math/math.proto
similarity index 100%
rename from src/node/examples/math.proto
rename to src/node/test/math/math.proto
diff --git a/src/node/examples/math_server.js b/src/node/test/math/math_server.js
similarity index 99%
rename from src/node/examples/math_server.js
rename to src/node/test/math/math_server.js
index a4b237aeebfeae39f090977482bba1ce0375f847..9d06596f3d3c3bdcf238a77f906681891dd2e18f 100644
--- a/src/node/examples/math_server.js
+++ b/src/node/test/math/math_server.js
@@ -33,7 +33,7 @@
 
 'use strict';
 
-var grpc = require('..');
+var grpc = require('../..');
 var math = grpc.load(__dirname + '/math.proto').math;
 
 /**
diff --git a/src/node/test/math_client_test.js b/src/node/test/math_client_test.js
index 6a6607ec7487dbc80e945f153d5e128e3f4630aa..6361d97857aa88bed6da0ebbfd0cedbe97fb8f57 100644
--- a/src/node/test/math_client_test.js
+++ b/src/node/test/math_client_test.js
@@ -36,7 +36,7 @@
 var assert = require('assert');
 
 var grpc = require('..');
-var math = grpc.load(__dirname + '/../examples/math.proto').math;
+var math = grpc.load(__dirname + '/math/math.proto').math;
 
 /**
  * Client to use to make requests to a running server.
@@ -46,7 +46,7 @@ var math_client;
 /**
  * Server to test against
  */
-var getServer = require('../examples/math_server.js');
+var getServer = require('./math/math_server.js');
 
 var server = getServer();
 
@@ -56,7 +56,7 @@ describe('Math client', function() {
                                grpc.ServerCredentials.createInsecure());
     server.start();
     math_client = new math.Math('localhost:' + port_num,
-                                grpc.Credentials.createInsecure());
+                                grpc.credentials.createInsecure());
     done();
   });
   after(function() {
diff --git a/src/node/test/server_test.js b/src/node/test/server_test.js
index 1e69d52e5831fb805deaaaa1d1f1a99dcba050a8..999a183b3cb5043b81c861a36eb8a6adbaea4e54 100644
--- a/src/node/test/server_test.js
+++ b/src/node/test/server_test.js
@@ -36,7 +36,7 @@
 var assert = require('assert');
 var fs = require('fs');
 var path = require('path');
-var grpc = require('bindings')('grpc.node');
+var grpc = require('bindings')('grpc_node');
 
 describe('server', function() {
   describe('constructor', function() {
diff --git a/src/node/test/surface_test.js b/src/node/test/surface_test.js
index d917c7a17121532d4a5e23833f9abb50263e3ca9..395ea887ecb833f733e98b53b3ee649c0649978d 100644
--- a/src/node/test/surface_test.js
+++ b/src/node/test/surface_test.js
@@ -41,7 +41,7 @@ var ProtoBuf = require('protobufjs');
 
 var grpc = require('..');
 
-var math_proto = ProtoBuf.loadProtoFile(__dirname + '/../examples/math.proto');
+var math_proto = ProtoBuf.loadProtoFile(__dirname + '/math/math.proto');
 
 var mathService = math_proto.lookup('math.Math');
 
@@ -163,7 +163,7 @@ describe('waitForClientReady', function() {
     Client = surface_client.makeProtobufClientConstructor(mathService);
   });
   beforeEach(function() {
-    client = new Client('localhost:' + port, grpc.Credentials.createInsecure());
+    client = new Client('localhost:' + port, grpc.credentials.createInsecure());
   });
   after(function() {
     server.forceShutdown();
@@ -217,7 +217,7 @@ describe('Echo service', function() {
     });
     var port = server.bind('localhost:0', server_insecure_creds);
     var Client = surface_client.makeProtobufClientConstructor(echo_service);
-    client = new Client('localhost:' + port, grpc.Credentials.createInsecure());
+    client = new Client('localhost:' + port, grpc.credentials.createInsecure());
     server.start();
   });
   after(function() {
@@ -263,7 +263,7 @@ describe('Generic client and server', function() {
       server.start();
       var Client = grpc.makeGenericClientConstructor(string_service_attrs);
       client = new Client('localhost:' + port,
-                          grpc.Credentials.createInsecure());
+                          grpc.credentials.createInsecure());
     });
     after(function() {
       server.forceShutdown();
@@ -311,7 +311,7 @@ describe('Echo metadata', function() {
     });
     var port = server.bind('localhost:0', server_insecure_creds);
     var Client = surface_client.makeProtobufClientConstructor(test_service);
-    client = new Client('localhost:' + port, grpc.Credentials.createInsecure());
+    client = new Client('localhost:' + port, grpc.credentials.createInsecure());
     server.start();
     metadata = new grpc.Metadata();
     metadata.set('key', 'value');
@@ -356,7 +356,7 @@ describe('Echo metadata', function() {
     call.end();
   });
   it('shows the correct user-agent string', function(done) {
-    var version = require('../package.json').version;
+    var version = require('../../../package.json').version;
     var call = client.unary({}, function(err, data) { assert.ifError(err); },
                             metadata);
     call.on('metadata', function(metadata) {
@@ -437,7 +437,7 @@ describe('Other conditions', function() {
     });
     port = server.bind('localhost:0', server_insecure_creds);
     Client = surface_client.makeProtobufClientConstructor(test_service);
-    client = new Client('localhost:' + port, grpc.Credentials.createInsecure());
+    client = new Client('localhost:' + port, grpc.credentials.createInsecure());
     server.start();
   });
   after(function() {
@@ -484,7 +484,7 @@ describe('Other conditions', function() {
       var Client = surface_client.makeClientConstructor(test_service_attrs,
                                                         'TestService');
       misbehavingClient = new Client('localhost:' + port,
-                                     grpc.Credentials.createInsecure());
+                                     grpc.credentials.createInsecure());
     });
     it('should respond correctly to a unary call', function(done) {
       misbehavingClient.unary(badArg, function(err, data) {
@@ -690,165 +690,187 @@ describe('Other conditions', function() {
       });
     });
   });
-  describe('Call propagation', function() {
-    var proxy;
-    var proxy_impl;
-    beforeEach(function() {
-      proxy = new grpc.Server();
-      proxy_impl = {
-        unary: function(call) {},
-        clientStream: function(stream) {},
-        serverStream: function(stream) {},
-        bidiStream: function(stream) {}
-      };
+});
+describe('Call propagation', function() {
+  var proxy;
+  var proxy_impl;
+
+  var test_service;
+  var Client;
+  var client;
+  var server;
+  before(function() {
+    var test_proto = ProtoBuf.loadProtoFile(__dirname + '/test_service.proto');
+    test_service = test_proto.lookup('TestService');
+    server = new grpc.Server();
+    server.addProtoService(test_service, {
+      unary: function(call) {},
+      clientStream: function(stream) {},
+      serverStream: function(stream) {},
+      bidiStream: function(stream) {}
     });
-    afterEach(function() {
-      console.log('Shutting down server');
-      proxy.forceShutdown();
-    });
-    describe('Cancellation', function() {
-      it('With a unary call', function(done) {
-        done = multiDone(done, 2);
-        proxy_impl.unary = function(parent, callback) {
-          client.unary(parent.request, function(err, value) {
-            try {
-              assert(err);
-              assert.strictEqual(err.code, grpc.status.CANCELLED);
-            } finally {
-              callback(err, value);
-              done();
-            }
-          }, null, {parent: parent});
-          call.cancel();
-        };
-        proxy.addProtoService(test_service, proxy_impl);
-        var proxy_port = proxy.bind('localhost:0', server_insecure_creds);
-        proxy.start();
-        var proxy_client = new Client('localhost:' + proxy_port,
-                                      grpc.Credentials.createInsecure());
-        var call = proxy_client.unary({}, function(err, value) {
-          done();
-        });
-      });
-      it('With a client stream call', function(done) {
-        done = multiDone(done, 2);
-        proxy_impl.clientStream = function(parent, callback) {
-          client.clientStream(function(err, value) {
-            try {
-              assert(err);
-              assert.strictEqual(err.code, grpc.status.CANCELLED);
-            } finally {
-              callback(err, value);
-              done();
-            }
-          }, null, {parent: parent});
-          call.cancel();
-        };
-        proxy.addProtoService(test_service, proxy_impl);
-        var proxy_port = proxy.bind('localhost:0', server_insecure_creds);
-        proxy.start();
-        var proxy_client = new Client('localhost:' + proxy_port,
-                                      grpc.Credentials.createInsecure());
-        var call = proxy_client.clientStream(function(err, value) {
-          done();
-        });
-      });
-      it('With a server stream call', function(done) {
-        done = multiDone(done, 2);
-        proxy_impl.serverStream = function(parent) {
-          var child = client.serverStream(parent.request, null,
-                                          {parent: parent});
-          child.on('error', function(err) {
+    var port = server.bind('localhost:0', server_insecure_creds);
+    Client = surface_client.makeProtobufClientConstructor(test_service);
+    client = new Client('localhost:' + port, grpc.credentials.createInsecure());
+    server.start();
+  });
+  after(function() {
+    server.forceShutdown();
+  });
+  beforeEach(function() {
+    proxy = new grpc.Server();
+    proxy_impl = {
+      unary: function(call) {},
+      clientStream: function(stream) {},
+      serverStream: function(stream) {},
+      bidiStream: function(stream) {}
+    };
+  });
+  afterEach(function() {
+    proxy.forceShutdown();
+  });
+  describe('Cancellation', function() {
+    it('With a unary call', function(done) {
+      done = multiDone(done, 2);
+      proxy_impl.unary = function(parent, callback) {
+        client.unary(parent.request, function(err, value) {
+          try {
             assert(err);
             assert.strictEqual(err.code, grpc.status.CANCELLED);
+          } finally {
+            callback(err, value);
             done();
-          });
-          call.cancel();
-        };
-        proxy.addProtoService(test_service, proxy_impl);
-        var proxy_port = proxy.bind('localhost:0', server_insecure_creds);
-        proxy.start();
-        var proxy_client = new Client('localhost:' + proxy_port,
-                                      grpc.Credentials.createInsecure());
-        var call = proxy_client.serverStream({});
-        call.on('error', function(err) {
-          done();
-        });
+          }
+        }, null, {parent: parent});
+        call.cancel();
+      };
+      proxy.addProtoService(test_service, proxy_impl);
+      var proxy_port = proxy.bind('localhost:0', server_insecure_creds);
+      proxy.start();
+      var proxy_client = new Client('localhost:' + proxy_port,
+                                    grpc.credentials.createInsecure());
+      var call = proxy_client.unary({}, function(err, value) {
+        done();
       });
-      it('With a bidi stream call', function(done) {
-        done = multiDone(done, 2);
-        proxy_impl.bidiStream = function(parent) {
-          var child = client.bidiStream(null, {parent: parent});
-          child.on('error', function(err) {
+    });
+    it('With a client stream call', function(done) {
+      done = multiDone(done, 2);
+      proxy_impl.clientStream = function(parent, callback) {
+        client.clientStream(function(err, value) {
+          try {
             assert(err);
             assert.strictEqual(err.code, grpc.status.CANCELLED);
+          } finally {
+            callback(err, value);
             done();
-          });
-          call.cancel();
-        };
-        proxy.addProtoService(test_service, proxy_impl);
-        var proxy_port = proxy.bind('localhost:0', server_insecure_creds);
-        proxy.start();
-        var proxy_client = new Client('localhost:' + proxy_port,
-                                      grpc.Credentials.createInsecure());
-        var call = proxy_client.bidiStream();
-        call.on('error', function(err) {
+          }
+        }, null, {parent: parent});
+        call.cancel();
+      };
+      proxy.addProtoService(test_service, proxy_impl);
+      var proxy_port = proxy.bind('localhost:0', server_insecure_creds);
+      proxy.start();
+      var proxy_client = new Client('localhost:' + proxy_port,
+                                    grpc.credentials.createInsecure());
+      var call = proxy_client.clientStream(function(err, value) {
+        done();
+      });
+    });
+    it('With a server stream call', function(done) {
+      done = multiDone(done, 2);
+      proxy_impl.serverStream = function(parent) {
+        var child = client.serverStream(parent.request, null,
+                                        {parent: parent});
+        child.on('error', function(err) {
+          assert(err);
+          assert.strictEqual(err.code, grpc.status.CANCELLED);
           done();
         });
+        call.cancel();
+      };
+      proxy.addProtoService(test_service, proxy_impl);
+      var proxy_port = proxy.bind('localhost:0', server_insecure_creds);
+      proxy.start();
+      var proxy_client = new Client('localhost:' + proxy_port,
+                                    grpc.credentials.createInsecure());
+      var call = proxy_client.serverStream({});
+      call.on('error', function(err) {
+        done();
       });
     });
-    describe('Deadline', function() {
-      /* jshint bitwise:false */
-      var deadline_flags = (grpc.propagate.DEFAULTS &
-          ~grpc.propagate.CANCELLATION);
-      it('With a client stream call', function(done) {
-        done = multiDone(done, 2);
-        proxy_impl.clientStream = function(parent, callback) {
-          client.clientStream(function(err, value) {
-            try {
-              assert(err);
-              assert(err.code === grpc.status.DEADLINE_EXCEEDED ||
-                  err.code === grpc.status.INTERNAL);
-            } finally {
-              callback(err, value);
-              done();
-            }
-          }, null, {parent: parent, propagate_flags: deadline_flags});
-        };
-        proxy.addProtoService(test_service, proxy_impl);
-        var proxy_port = proxy.bind('localhost:0', server_insecure_creds);
-        proxy.start();
-        var proxy_client = new Client('localhost:' + proxy_port,
-                                      grpc.Credentials.createInsecure());
-        var deadline = new Date();
-        deadline.setSeconds(deadline.getSeconds() + 1);
-        proxy_client.clientStream(function(err, value) {
+    it('With a bidi stream call', function(done) {
+      done = multiDone(done, 2);
+      proxy_impl.bidiStream = function(parent) {
+        var child = client.bidiStream(null, {parent: parent});
+        child.on('error', function(err) {
+          assert(err);
+          assert.strictEqual(err.code, grpc.status.CANCELLED);
           done();
-        }, null, {deadline: deadline});
-      });
-      it('With a bidi stream call', function(done) {
-        done = multiDone(done, 2);
-        proxy_impl.bidiStream = function(parent) {
-          var child = client.bidiStream(
-              null, {parent: parent, propagate_flags: deadline_flags});
-          child.on('error', function(err) {
+        });
+        call.cancel();
+      };
+      proxy.addProtoService(test_service, proxy_impl);
+      var proxy_port = proxy.bind('localhost:0', server_insecure_creds);
+      proxy.start();
+      var proxy_client = new Client('localhost:' + proxy_port,
+                                    grpc.credentials.createInsecure());
+      var call = proxy_client.bidiStream();
+      call.on('error', function(err) {
+        done();
+      });
+    });
+  });
+  describe('Deadline', function() {
+    /* jshint bitwise:false */
+    var deadline_flags = (grpc.propagate.DEFAULTS &
+        ~grpc.propagate.CANCELLATION);
+    it('With a client stream call', function(done) {
+      done = multiDone(done, 2);
+      proxy_impl.clientStream = function(parent, callback) {
+        client.clientStream(function(err, value) {
+          try {
             assert(err);
             assert(err.code === grpc.status.DEADLINE_EXCEEDED ||
                 err.code === grpc.status.INTERNAL);
+          } finally {
+            callback(err, value);
             done();
-          });
-        };
-        proxy.addProtoService(test_service, proxy_impl);
-        var proxy_port = proxy.bind('localhost:0', server_insecure_creds);
-        proxy.start();
-        var proxy_client = new Client('localhost:' + proxy_port,
-                                      grpc.Credentials.createInsecure());
-        var deadline = new Date();
-        deadline.setSeconds(deadline.getSeconds() + 1);
-        var call = proxy_client.bidiStream(null, {deadline: deadline});
-        call.on('error', function(err) {
+          }
+        }, null, {parent: parent, propagate_flags: deadline_flags});
+      };
+      proxy.addProtoService(test_service, proxy_impl);
+      var proxy_port = proxy.bind('localhost:0', server_insecure_creds);
+      proxy.start();
+      var proxy_client = new Client('localhost:' + proxy_port,
+                                    grpc.credentials.createInsecure());
+      var deadline = new Date();
+      deadline.setSeconds(deadline.getSeconds() + 1);
+      proxy_client.clientStream(function(err, value) {
+        done();
+      }, null, {deadline: deadline});
+    });
+    it('With a bidi stream call', function(done) {
+      done = multiDone(done, 2);
+      proxy_impl.bidiStream = function(parent) {
+        var child = client.bidiStream(
+            null, {parent: parent, propagate_flags: deadline_flags});
+        child.on('error', function(err) {
+          assert(err);
+          assert(err.code === grpc.status.DEADLINE_EXCEEDED ||
+              err.code === grpc.status.INTERNAL);
           done();
         });
+      };
+      proxy.addProtoService(test_service, proxy_impl);
+      var proxy_port = proxy.bind('localhost:0', server_insecure_creds);
+      proxy.start();
+      var proxy_client = new Client('localhost:' + proxy_port,
+                                    grpc.credentials.createInsecure());
+      var deadline = new Date();
+      deadline.setSeconds(deadline.getSeconds() + 1);
+      var call = proxy_client.bidiStream(null, {deadline: deadline});
+      call.on('error', function(err) {
+        done();
       });
     });
   });
@@ -866,7 +888,7 @@ describe('Cancelling surface client', function() {
     });
     var port = server.bind('localhost:0', server_insecure_creds);
     var Client = surface_client.makeProtobufClientConstructor(mathService);
-    client = new Client('localhost:' + port, grpc.Credentials.createInsecure());
+    client = new Client('localhost:' + port, grpc.credentials.createInsecure());
     server.start();
   });
   after(function() {
diff --git a/src/objective-c/README.md b/src/objective-c/README.md
index 6c27657def06f859d96af55c8eb0cf67b6aeb6a2..a861a9f6f93cba29640887c0508912e5cff413ed 100644
--- a/src/objective-c/README.md
+++ b/src/objective-c/README.md
@@ -17,7 +17,7 @@ services.
 <a name="install"></a>
 ## Install protoc with the gRPC plugin
 
-On Mac OS X, install [homebrew][]. On Linux, install [linuxbrew][].
+On Mac OS X, install [homebrew][].
 
 Run the following command to install _protoc_ and the gRPC _protoc_ plugin:
 ```sh
@@ -153,7 +153,7 @@ _protoc_, in which case no system modification nor renaming is necessary.
 <a name="no-cocoapods"></a>
 ### Integrate the generated gRPC library without using Cocoapods
 
-You need to compile the generated `.pbpbjc.*` files (the enums and messages) without ARC support,
+You need to compile the generated `.pbobjc.*` files (the enums and messages) without ARC support,
 and the generated `.pbrpc.*` files (the services) with ARC support. The generated code depends on
 v0.5+ of the Objective-C gRPC runtime library and v3.0.0-alpha-3+ of the Objective-C Protobuf
 runtime library.
@@ -168,7 +168,6 @@ Objective-C Protobuf runtime library.
 
 [Protocol Buffers]:https://developers.google.com/protocol-buffers/
 [homebrew]:http://brew.sh
-[linuxbrew]:https://github.com/Homebrew/linuxbrew
 [gRPC install script]:https://raw.githubusercontent.com/grpc/homebrew-grpc/master/scripts/install
 [example Podfile]:https://github.com/grpc/grpc/blob/master/src/objective-c/examples/Sample/Podfile
 [sample app]: https://github.com/grpc/grpc/tree/master/src/objective-c/examples/Sample
diff --git a/src/objective-c/RxLibrary/GRXWriter.m b/src/objective-c/RxLibrary/GRXWriter.m
index 019fcbd7858320819cb9648dde98f62ccb4874e8..fee33f5556343ff062b73d4bb39563ac255b036e 100644
--- a/src/objective-c/RxLibrary/GRXWriter.m
+++ b/src/objective-c/RxLibrary/GRXWriter.m
@@ -35,4 +35,14 @@
 
 @implementation GRXWriter
 
+- (void)startWithWriteable:(id<GRXWriteable>)writeable {
+  NSAssert(NO, @"Missing base implementation for %@", NSStringFromSelector(_cmd));
+  [self doesNotRecognizeSelector:_cmd];
+}
+
+- (void)finishWithError:(NSError *)errorOrNil {
+  NSAssert(NO, @"Missing base implementation for %@", NSStringFromSelector(_cmd));
+  [self doesNotRecognizeSelector:_cmd];
+}
+
 @end
diff --git a/src/php/ext/grpc/package.xml b/src/php/ext/grpc/package.xml
index f41902f041eb278b7e02d18a1b8ad1e895ab4387..921cfc6ae68d085120331c0de9db36ff4f2f7d69 100644
--- a/src/php/ext/grpc/package.xml
+++ b/src/php/ext/grpc/package.xml
@@ -10,10 +10,10 @@
   <email>grpc-packages@google.com</email>
   <active>yes</active>
  </lead>
- <date>2015-09-24</date>
- <time>09:51:04</time>
+ <date>2015-10-07</date>
+ <time>13:40:54</time>
  <version>
-  <release>0.6.0</release>
+  <release>0.6.1</release>
   <api>0.6.0</api>
  </version>
  <stability>
@@ -22,12 +22,7 @@
  </stability>
  <license>BSD</license>
  <notes>
-- support per message compression disable
-- expose per-call host override option
-- expose connectivity API
-- expose channel target and call peer
-- add user-agent
-- update to wrap gRPC C core library beta version 0.11.0
+- fixed undefined constant fatal error when run with apache/nginx #2275
  </notes>
  <contents>
   <dir baseinstalldir="/" name="/">
@@ -44,7 +39,7 @@
    <file baseinstalldir="/" md5sum="6988d6e97c19c8f8e3eb92371cf8246b" name="credentials.h" role="src" />
    <file baseinstalldir="/" md5sum="38a1bc979d810c36ebc2a52d4b7b5319" name="CREDITS" role="doc" />
    <file baseinstalldir="/" md5sum="3f35b472bbdef5a788cd90617d7d0847" name="LICENSE" role="doc" />
-   <file baseinstalldir="/" md5sum="6a550516a1423def0786851c76f87c85" name="php_grpc.c" role="src" />
+   <file baseinstalldir="/" md5sum="b77f1f3941aaf7a21090b493e9f26037" name="php_grpc.c" role="src" />
    <file baseinstalldir="/" md5sum="673b07859d9f69232f8a754c56780686" name="php_grpc.h" role="src" />
    <file baseinstalldir="/" md5sum="7533a6d3ea02c78cad23a9651de0825d" name="README.md" role="doc" />
    <file baseinstalldir="/" md5sum="3e4e960454ebb2fc7b78a840493f5315" name="server.c" role="src" />
@@ -118,5 +113,20 @@ Update to wrap gRPC C Core version 0.10.0
 - update to wrap gRPC C core library beta version 0.11.0
    </notes>
   </release>
+  <release>
+   <version>
+    <release>0.6.1</release>
+    <api>0.6.0</api>
+   </version>
+   <stability>
+    <release>beta</release>
+    <api>beta</api>
+   </stability>
+   <date>2015-10-07</date>
+   <license>BSD</license>
+   <notes>
+- fixed undefined constant fatal error when run with apache/nginx #2275
+   </notes>
+  </release>
  </changelog>
 </package>
diff --git a/src/php/ext/grpc/php_grpc.c b/src/php/ext/grpc/php_grpc.c
index 0f730ea7567724b103f9535f8dadd9a1ec4d07d9..fcd94a6306230db39d60f2ede6305c950978931c 100644
--- a/src/php/ext/grpc/php_grpc.c
+++ b/src/php/ext/grpc/php_grpc.c
@@ -109,91 +109,125 @@ PHP_MINIT_FUNCTION(grpc) {
   */
   /* Register call error constants */
   grpc_init();
-  REGISTER_LONG_CONSTANT("Grpc\\CALL_OK", GRPC_CALL_OK, CONST_CS);
-  REGISTER_LONG_CONSTANT("Grpc\\CALL_ERROR", GRPC_CALL_ERROR, CONST_CS);
+  REGISTER_LONG_CONSTANT("Grpc\\CALL_OK", GRPC_CALL_OK,
+                         CONST_CS | CONST_PERSISTENT);
+  REGISTER_LONG_CONSTANT("Grpc\\CALL_ERROR", GRPC_CALL_ERROR,
+                         CONST_CS | CONST_PERSISTENT);
   REGISTER_LONG_CONSTANT("Grpc\\CALL_ERROR_NOT_ON_SERVER",
-                         GRPC_CALL_ERROR_NOT_ON_SERVER, CONST_CS);
+                         GRPC_CALL_ERROR_NOT_ON_SERVER,
+                         CONST_CS | CONST_PERSISTENT);
   REGISTER_LONG_CONSTANT("Grpc\\CALL_ERROR_NOT_ON_CLIENT",
-                         GRPC_CALL_ERROR_NOT_ON_CLIENT, CONST_CS);
+                         GRPC_CALL_ERROR_NOT_ON_CLIENT,
+                         CONST_CS | CONST_PERSISTENT);
   REGISTER_LONG_CONSTANT("Grpc\\CALL_ERROR_ALREADY_INVOKED",
-                         GRPC_CALL_ERROR_ALREADY_INVOKED, CONST_CS);
+                         GRPC_CALL_ERROR_ALREADY_INVOKED,
+                         CONST_CS | CONST_PERSISTENT);
   REGISTER_LONG_CONSTANT("Grpc\\CALL_ERROR_NOT_INVOKED",
-                         GRPC_CALL_ERROR_NOT_INVOKED, CONST_CS);
+                         GRPC_CALL_ERROR_NOT_INVOKED,
+                         CONST_CS | CONST_PERSISTENT);
   REGISTER_LONG_CONSTANT("Grpc\\CALL_ERROR_ALREADY_FINISHED",
-                         GRPC_CALL_ERROR_ALREADY_FINISHED, CONST_CS);
+                         GRPC_CALL_ERROR_ALREADY_FINISHED,
+                         CONST_CS | CONST_PERSISTENT);
   REGISTER_LONG_CONSTANT("Grpc\\CALL_ERROR_TOO_MANY_OPERATIONS",
-                         GRPC_CALL_ERROR_TOO_MANY_OPERATIONS, CONST_CS);
+                         GRPC_CALL_ERROR_TOO_MANY_OPERATIONS,
+                         CONST_CS | CONST_PERSISTENT);
   REGISTER_LONG_CONSTANT("Grpc\\CALL_ERROR_INVALID_FLAGS",
-                         GRPC_CALL_ERROR_INVALID_FLAGS, CONST_CS);
+                         GRPC_CALL_ERROR_INVALID_FLAGS,
+                         CONST_CS | CONST_PERSISTENT);
 
   /* Register flag constants */
   REGISTER_LONG_CONSTANT("Grpc\\WRITE_BUFFER_HINT", GRPC_WRITE_BUFFER_HINT,
-                         CONST_CS);
+                         CONST_CS | CONST_PERSISTENT);
   REGISTER_LONG_CONSTANT("Grpc\\WRITE_NO_COMPRESS", GRPC_WRITE_NO_COMPRESS,
-                         CONST_CS);
+                         CONST_CS | CONST_PERSISTENT);
 
   /* Register status constants */
-  REGISTER_LONG_CONSTANT("Grpc\\STATUS_OK", GRPC_STATUS_OK, CONST_CS);
+  REGISTER_LONG_CONSTANT("Grpc\\STATUS_OK", GRPC_STATUS_OK,
+                         CONST_CS | CONST_PERSISTENT);
   REGISTER_LONG_CONSTANT("Grpc\\STATUS_CANCELLED", GRPC_STATUS_CANCELLED,
-                         CONST_CS);
-  REGISTER_LONG_CONSTANT("Grpc\\STATUS_UNKNOWN", GRPC_STATUS_UNKNOWN, CONST_CS);
+                         CONST_CS | CONST_PERSISTENT);
+  REGISTER_LONG_CONSTANT("Grpc\\STATUS_UNKNOWN", GRPC_STATUS_UNKNOWN,
+                         CONST_CS | CONST_PERSISTENT);
   REGISTER_LONG_CONSTANT("Grpc\\STATUS_INVALID_ARGUMENT",
-                         GRPC_STATUS_INVALID_ARGUMENT, CONST_CS);
+                         GRPC_STATUS_INVALID_ARGUMENT,
+                         CONST_CS | CONST_PERSISTENT);
   REGISTER_LONG_CONSTANT("Grpc\\STATUS_DEADLINE_EXCEEDED",
-                         GRPC_STATUS_DEADLINE_EXCEEDED, CONST_CS);
+                         GRPC_STATUS_DEADLINE_EXCEEDED,
+                         CONST_CS | CONST_PERSISTENT);
   REGISTER_LONG_CONSTANT("Grpc\\STATUS_NOT_FOUND", GRPC_STATUS_NOT_FOUND,
-                         CONST_CS);
+                         CONST_CS | CONST_PERSISTENT);
   REGISTER_LONG_CONSTANT("Grpc\\STATUS_ALREADY_EXISTS",
-                         GRPC_STATUS_ALREADY_EXISTS, CONST_CS);
+                         GRPC_STATUS_ALREADY_EXISTS,
+                         CONST_CS | CONST_PERSISTENT);
   REGISTER_LONG_CONSTANT("Grpc\\STATUS_PERMISSION_DENIED",
-                         GRPC_STATUS_PERMISSION_DENIED, CONST_CS);
+                         GRPC_STATUS_PERMISSION_DENIED,
+                         CONST_CS | CONST_PERSISTENT);
   REGISTER_LONG_CONSTANT("Grpc\\STATUS_UNAUTHENTICATED",
-                         GRPC_STATUS_UNAUTHENTICATED, CONST_CS);
+                         GRPC_STATUS_UNAUTHENTICATED,
+                         CONST_CS | CONST_PERSISTENT);
   REGISTER_LONG_CONSTANT("Grpc\\STATUS_RESOURCE_EXHAUSTED",
-                         GRPC_STATUS_RESOURCE_EXHAUSTED, CONST_CS);
+                         GRPC_STATUS_RESOURCE_EXHAUSTED,
+                         CONST_CS | CONST_PERSISTENT);
   REGISTER_LONG_CONSTANT("Grpc\\STATUS_FAILED_PRECONDITION",
-                         GRPC_STATUS_FAILED_PRECONDITION, CONST_CS);
-  REGISTER_LONG_CONSTANT("Grpc\\STATUS_ABORTED", GRPC_STATUS_ABORTED, CONST_CS);
-  REGISTER_LONG_CONSTANT("Grpc\\STATUS_OUT_OF_RANGE", GRPC_STATUS_OUT_OF_RANGE,
-                         CONST_CS);
+                         GRPC_STATUS_FAILED_PRECONDITION,
+                         CONST_CS | CONST_PERSISTENT);
+  REGISTER_LONG_CONSTANT("Grpc\\STATUS_ABORTED", GRPC_STATUS_ABORTED,
+                         CONST_CS | CONST_PERSISTENT);
+  REGISTER_LONG_CONSTANT("Grpc\\STATUS_OUT_OF_RANGE",
+                         GRPC_STATUS_OUT_OF_RANGE,
+                         CONST_CS | CONST_PERSISTENT);
   REGISTER_LONG_CONSTANT("Grpc\\STATUS_UNIMPLEMENTED",
-                         GRPC_STATUS_UNIMPLEMENTED, CONST_CS);
+                         GRPC_STATUS_UNIMPLEMENTED,
+                         CONST_CS | CONST_PERSISTENT);
   REGISTER_LONG_CONSTANT("Grpc\\STATUS_INTERNAL", GRPC_STATUS_INTERNAL,
-                         CONST_CS);
+                         CONST_CS | CONST_PERSISTENT);
   REGISTER_LONG_CONSTANT("Grpc\\STATUS_UNAVAILABLE", GRPC_STATUS_UNAVAILABLE,
-                         CONST_CS);
+                         CONST_CS | CONST_PERSISTENT);
   REGISTER_LONG_CONSTANT("Grpc\\STATUS_DATA_LOSS", GRPC_STATUS_DATA_LOSS,
-                         CONST_CS);
+                         CONST_CS | CONST_PERSISTENT);
 
   /* Register op type constants */
   REGISTER_LONG_CONSTANT("Grpc\\OP_SEND_INITIAL_METADATA",
-                         GRPC_OP_SEND_INITIAL_METADATA, CONST_CS);
+                         GRPC_OP_SEND_INITIAL_METADATA,
+                         CONST_CS | CONST_PERSISTENT);
   REGISTER_LONG_CONSTANT("Grpc\\OP_SEND_MESSAGE",
-                         GRPC_OP_SEND_MESSAGE, CONST_CS);
+                         GRPC_OP_SEND_MESSAGE,
+                         CONST_CS | CONST_PERSISTENT);
   REGISTER_LONG_CONSTANT("Grpc\\OP_SEND_CLOSE_FROM_CLIENT",
-                         GRPC_OP_SEND_CLOSE_FROM_CLIENT, CONST_CS);
+                         GRPC_OP_SEND_CLOSE_FROM_CLIENT,
+                         CONST_CS | CONST_PERSISTENT);
   REGISTER_LONG_CONSTANT("Grpc\\OP_SEND_STATUS_FROM_SERVER",
-                         GRPC_OP_SEND_STATUS_FROM_SERVER, CONST_CS);
+                         GRPC_OP_SEND_STATUS_FROM_SERVER,
+                         CONST_CS | CONST_PERSISTENT);
   REGISTER_LONG_CONSTANT("Grpc\\OP_RECV_INITIAL_METADATA",
-                         GRPC_OP_RECV_INITIAL_METADATA, CONST_CS);
+                         GRPC_OP_RECV_INITIAL_METADATA,
+                         CONST_CS | CONST_PERSISTENT);
   REGISTER_LONG_CONSTANT("Grpc\\OP_RECV_MESSAGE",
-                         GRPC_OP_RECV_MESSAGE, CONST_CS);
+                         GRPC_OP_RECV_MESSAGE,
+                         CONST_CS | CONST_PERSISTENT);
   REGISTER_LONG_CONSTANT("Grpc\\OP_RECV_STATUS_ON_CLIENT",
-                         GRPC_OP_RECV_STATUS_ON_CLIENT, CONST_CS);
+                         GRPC_OP_RECV_STATUS_ON_CLIENT,
+                         CONST_CS | CONST_PERSISTENT);
   REGISTER_LONG_CONSTANT("Grpc\\OP_RECV_CLOSE_ON_SERVER",
-                         GRPC_OP_RECV_CLOSE_ON_SERVER, CONST_CS);
+                         GRPC_OP_RECV_CLOSE_ON_SERVER,
+                         CONST_CS | CONST_PERSISTENT);
 
   /* Register connectivity state constants */
   REGISTER_LONG_CONSTANT("Grpc\\CHANNEL_IDLE",
-                         GRPC_CHANNEL_IDLE, CONST_CS);
+                         GRPC_CHANNEL_IDLE,
+                         CONST_CS | CONST_PERSISTENT);
   REGISTER_LONG_CONSTANT("Grpc\\CHANNEL_CONNECTING",
-                         GRPC_CHANNEL_CONNECTING, CONST_CS);
+                         GRPC_CHANNEL_CONNECTING,
+                         CONST_CS | CONST_PERSISTENT);
   REGISTER_LONG_CONSTANT("Grpc\\CHANNEL_READY",
-                         GRPC_CHANNEL_READY, CONST_CS);
+                         GRPC_CHANNEL_READY,
+                         CONST_CS | CONST_PERSISTENT);
   REGISTER_LONG_CONSTANT("Grpc\\CHANNEL_TRANSIENT_FAILURE",
-                         GRPC_CHANNEL_TRANSIENT_FAILURE, CONST_CS);
+                         GRPC_CHANNEL_TRANSIENT_FAILURE,
+                         CONST_CS | CONST_PERSISTENT);
   REGISTER_LONG_CONSTANT("Grpc\\CHANNEL_FATAL_FAILURE",
-                         GRPC_CHANNEL_FATAL_FAILURE, CONST_CS);
+                         GRPC_CHANNEL_FATAL_FAILURE,
+                         CONST_CS | CONST_PERSISTENT);
 
   grpc_init_call(TSRMLS_C);
   grpc_init_channel(TSRMLS_C);
diff --git a/src/php/lib/Grpc/BaseStub.php b/src/php/lib/Grpc/BaseStub.php
index 381b1143993301cf34dba9e1fb85f21c57d9ec49..0a3e1f78bf45ecf10c5e700da2b73a037e25ac2c 100755
--- a/src/php/lib/Grpc/BaseStub.php
+++ b/src/php/lib/Grpc/BaseStub.php
@@ -114,7 +114,7 @@ class BaseStub {
       return true;
     }
     if ($new_state == \Grpc\CHANNEL_FATAL_FAILURE) {
-      throw new Exception('Failed to connect to server');
+      throw new \Exception('Failed to connect to server');
     }
     return false;
   }
@@ -153,6 +153,25 @@ class BaseStub {
     return array($metadata_copy, $timeout);
   }
 
+  /**
+   * validate and normalize the metadata array
+   * @param $metadata The metadata map
+   * @return $metadata Validated and key-normalized metadata map
+   * @throw InvalidArgumentException if key contains invalid characters
+   */
+  private function _validate_and_normalize_metadata($metadata) {
+    $metadata_copy = array();
+    foreach ($metadata as $key => $value) {
+      if (!preg_match('/^[A-Za-z\d_-]+$/', $key)) {
+        throw new \InvalidArgumentException(
+            'Metadata keys must be nonempty strings containing only '.
+            'alphanumeric characters, hyphens and underscores');
+      }
+      $metadata_copy[strtolower($key)] = $value;
+    }
+    return $metadata_copy;
+  }
+
   /* This class is intended to be subclassed by generated code, so all functions
      begin with "_" to avoid name collisions. */
 
@@ -178,6 +197,7 @@ class BaseStub {
                                         $actual_metadata,
                                         $jwt_aud_uri);
     }
+    $actual_metadata = $this->_validate_and_normalize_metadata($actual_metadata);
     $call->start($argument, $actual_metadata, $options);
     return $call;
   }
@@ -204,6 +224,7 @@ class BaseStub {
                                         $actual_metadata,
                                         $jwt_aud_uri);
     }
+    $actual_metadata = $this->_validate_and_normalize_metadata($actual_metadata);
     $call->start($actual_metadata);
     return $call;
   }
@@ -231,6 +252,7 @@ class BaseStub {
                                         $actual_metadata,
                                         $jwt_aud_uri);
     }
+    $actual_metadata = $this->_validate_and_normalize_metadata($actual_metadata);
     $call->start($argument, $actual_metadata, $options);
     return $call;
   }
@@ -254,6 +276,7 @@ class BaseStub {
                                         $actual_metadata,
                                         $jwt_aud_uri);
     }
+    $actual_metadata = $this->_validate_and_normalize_metadata($actual_metadata);
     $call->start($actual_metadata);
     return $call;
   }
diff --git a/src/php/tests/generated_code/AbstractGeneratedCodeTest.php b/src/php/tests/generated_code/AbstractGeneratedCodeTest.php
index 9cee1886666c0011b03ef703c8de9615889eb92e..5cdba1e5a0fde706f4bb9501cab8d496f6895d55 100644
--- a/src/php/tests/generated_code/AbstractGeneratedCodeTest.php
+++ b/src/php/tests/generated_code/AbstractGeneratedCodeTest.php
@@ -51,6 +51,14 @@ abstract class AbstractGeneratedCodeTest extends PHPUnit_Framework_TestCase {
     $this->assertTrue(is_string(self::$client->getTarget()));
   }
 
+  /**
+   * @expectedException InvalidArgumentException
+   */
+  public function testInvalidMetadata() {
+    $div_arg = new math\DivArgs();
+    $call = self::$client->Div($div_arg, array(' ' => 'abc123'));
+  }
+
   public function testWriteFlags() {
     $div_arg = new math\DivArgs();
     $div_arg->setDividend(7);
diff --git a/src/php/tests/interop/interop_client.php b/src/php/tests/interop/interop_client.php
index d55d5629b74d15d231667ca965a1ac58ff978052..0590264ef80ba351f44a5535c46f7d798e80afda 100755
--- a/src/php/tests/interop/interop_client.php
+++ b/src/php/tests/interop/interop_client.php
@@ -250,6 +250,23 @@ function pingPong($stub) {
               'Call did not complete successfully');
 }
 
+/**
+ * Run the empty_stream test.
+ * Passes when run against the Node server as of 2015-10-09
+ * @param $stub Stub object that has service methods.
+ */
+function emptyStream($stub) {
+  // for the current PHP implementation, $call->read() will wait
+  // forever for a server response if the server is not sending any.
+  // so this test is imeplemented as a timeout to indicate the absence
+  // of receiving any response from the server
+  $call = $stub->FullDuplexCall(array('timeout' => 100000));
+  $call->writesDone();
+  hardAssert($call->read() === null, 'Server returned too many responses');
+  hardAssert($call->getStatus()->code === Grpc\STATUS_OK,
+              'Call did not complete successfully');
+}
+
 /**
  * Run the cancel_after_begin test.
  * Passes when run against the Node server as of 2015-08-28
@@ -370,6 +387,9 @@ switch ($args['test_case']) {
   case 'ping_pong':
     pingPong($stub);
     break;
+  case 'empty_stream':
+    emptyStream($stub);
+    break;
   case 'cancel_after_begin':
     cancelAfterBegin($stub);
     break;
diff --git a/src/ruby/lib/grpc/generic/client_stub.rb b/src/ruby/lib/grpc/generic/client_stub.rb
index 8c923845298e8ce65c5cd2605216d78cf8d88ade..b8e33ad295ab3c6e556446854346895f2df9189a 100644
--- a/src/ruby/lib/grpc/generic/client_stub.rb
+++ b/src/ruby/lib/grpc/generic/client_stub.rb
@@ -176,8 +176,7 @@ module GRPC
                           deadline: deadline,
                           timeout: timeout,
                           parent: parent)
-      kw_with_jwt_uri = self.class.update_with_jwt_aud_uri(kw, @host, method)
-      md = @update_metadata.nil? ? kw : @update_metadata.call(kw_with_jwt_uri)
+      md = update_metadata(kw, method)
       return c.request_response(req, **md) unless return_op
 
       # return the operation view of the active_call; define #execute as a
@@ -244,8 +243,7 @@ module GRPC
                           deadline: deadline,
                           timeout: timeout,
                           parent: parent)
-      kw_with_jwt_uri = self.class.update_with_jwt_aud_uri(kw, @host, method)
-      md = @update_metadata.nil? ? kw : @update_metadata.call(kw_with_jwt_uri)
+      md = update_metadata(kw, method)
       return c.client_streamer(requests, **md) unless return_op
 
       # return the operation view of the active_call; define #execute as a
@@ -322,8 +320,7 @@ module GRPC
                           deadline: deadline,
                           timeout: timeout,
                           parent: parent)
-      kw_with_jwt_uri = self.class.update_with_jwt_aud_uri(kw, @host, method)
-      md = @update_metadata.nil? ? kw : @update_metadata.call(kw_with_jwt_uri)
+      md = update_metadata(kw, method)
       return c.server_streamer(req, **md, &blk) unless return_op
 
       # return the operation view of the active_call; define #execute
@@ -439,8 +436,7 @@ module GRPC
                           deadline: deadline,
                           timeout: timeout,
                           parent: parent)
-      kw_with_jwt_uri = self.class.update_with_jwt_aud_uri(kw, @host, method)
-      md = @update_metadata.nil? ? kw : @update_metadata.call(kw_with_jwt_uri)
+      md = update_metadata(kw, method)
       return c.bidi_streamer(requests, **md, &blk) unless return_op
 
       # return the operation view of the active_call; define #execute
@@ -454,6 +450,16 @@ module GRPC
 
     private
 
+    def update_metadata(kw, method)
+      return kw if @update_metadata.nil?
+      just_jwt_uri = self.class.update_with_jwt_aud_uri({}, @host, method)
+      updated = @update_metadata.call(just_jwt_uri)
+
+      # keys should be lowercase
+      updated = Hash[updated.each_pair.map { |k, v|  [k.downcase, v] }]
+      kw.merge(updated)
+    end
+
     # Creates a new active stub
     #
     # @param method [string] the method being called.
diff --git a/src/ruby/spec/generic/client_stub_spec.rb b/src/ruby/spec/generic/client_stub_spec.rb
index a05433df75ea1893164952b4092f8e88236940b1..c5173aee1d59c62c2d2a462f3596abf4aedee0cf 100644
--- a/src/ruby/spec/generic/client_stub_spec.rb
+++ b/src/ruby/spec/generic/client_stub_spec.rb
@@ -159,6 +159,20 @@ describe 'ClientStub' do
         th.join
       end
 
+      it 'should downcase the keys provided by the metadata updater' do
+        server_port = create_test_server
+        host = "localhost:#{server_port}"
+        th = run_request_response(@sent_msg, @resp, @pass,
+                                  k1: 'downcased-key-v1', k2: 'v2')
+        update_md = proc do |md|
+          md[:K1] = 'downcased-key-v1'
+          md
+        end
+        stub = GRPC::ClientStub.new(host, @cq, update_metadata: update_md)
+        expect(get_response(stub)).to eq(@resp)
+        th.join
+      end
+
       it 'should send a request when configured using an override channel' do
         server_port = create_test_server
         alt_host = "localhost:#{server_port}"
diff --git a/templates/grpc.gyp.template b/templates/binding.gyp.template
similarity index 52%
rename from templates/grpc.gyp.template
rename to templates/binding.gyp.template
index 873606202a1d74a80d6b0f5b22f859750b63fe4b..50d0823d1d4dfb9ae2954484891f5aa2b49b1b6d 100644
--- a/templates/grpc.gyp.template
+++ b/templates/binding.gyp.template
@@ -1,7 +1,7 @@
 %YAML 1.2
 --- |
-  # GRPC gyp file
-  # This currently builds C code.
+  # GRPC Node gyp file
+  # This currently builds the Node extension and dependencies
   # This file has been automatically generated from a template file.
   # Please look at the templates directory instead.
   # This file can be regenerated from the template by running
@@ -39,53 +39,28 @@
   # Some of this file is built with the help of
   # https://n8.io/converting-a-c-library-to-gyp/
   {
+    'variables': {
+      'config': '<!(echo $CONFIG)'
+    },
     # TODO: Finish windows support
     'target_defaults': {
-      'default_configuration': 'Debug',
-      'configurations': {
-        'Debug': {
-          'defines': [ 'DEBUG', '_DEBUG' ],
-          'msvs_settings': {
-            'VCCLCompilerTool': {
-              'RuntimeLibrary': 1, # static debug
-            },
-          },
-        },
-        'Release': {
-          'defines': [ 'NDEBUG' ],
-          'msvs_settings': {
-            'VCCLCompilerTool': {
-              'RuntimeLibrary': 0, # static release
-            },
-          },
-        }
-      },
-      'msvs_settings': {
-        'VCLinkerTool': {
-          'GenerateDebugInformation': 'true',
-        },
-      },
-      # TODO: Add fallback for Windows, and if pkg-config is not available
+        # Empirically, Node only exports ALPN symbols if its major version is >0.
+        # io.js always reports versions >0 and always exports ALPN symbols.
+        # Therefore, Node's major version will be truthy if and only if it
+        # supports ALPN. The output of "node -v" is v[major].[minor].[patch],
+        # like "v4.1.1" in a recent version. We use grep to extract just the
+        # major version. "4", would be the output for the example.
       'defines': [
-        'TSI_OPENSSL_ALPN_SUPPORT=<!(pkg-config --atleast-version=1.0.2 openssl >/dev/null 2>&1 && echo 1 || echo 0)'
+        'TSI_OPENSSL_ALPN_SUPPORT=<!(node -v | grep -oP "(?<=v)(\d+)(?=\.\d+\.\d+)")'
       ],
       'include_dirs': [
         '.',
         'include'
-      ],
-      # TODO: Check for libraries with pkg-config
-      'libraries': [
-        '-lcrypto',
-        '-lssl',
-        '-ldl',
-        '-lpthread',
-        '-lz'
       ]
     },
     'targets': [
       % for lib in libs:
-      # TODO: Add C++ targets
-      % if lib.language == 'c':
+      % if lib.name == 'gpr' or lib.name == 'grpc':
       {
         'target_name': '${lib.name}',
         'product_prefix': 'lib',
@@ -103,23 +78,65 @@
       },
       % endif
       % endfor
-      % for tgt in targets:
-      % if tgt.language == 'c':
       {
-        'target_name': '${tgt.name}',
-        'type': 'executable',
-        'dependencies': [
-          % for dep in getattr(tgt, 'deps', []):
-          '${dep}',
-          % endfor
+        'include_dirs': [
+          "<!(node -e \"require('nan')\")"
         ],
-        'sources': [
-          % for source in tgt.src:
-          '${source}',
-          % endfor
+        'cflags': [
+          '-std=c++0x',
+          '-Wall',
+          '-pthread',
+          '-g',
+          '-zdefs',
+          '-Werror',
+          '-Wno-error=deprecated-declarations'
+        ],
+        'ldflags': [
+          '-g'
+        ],
+        "conditions": [
+          ['OS != "win"', {
+            'conditions': [
+              ['config=="gcov"', {
+                'cflags': [
+                  '-ftest-coverage',
+                  '-fprofile-arcs',
+                  '-O0'
+                ],
+                'ldflags': [
+                  '-ftest-coverage',
+                  '-fprofile-arcs'
+                ]
+              }
+             ]
+            ]
+          }],
+          ['OS == "mac"', {
+            'xcode_settings': {
+              'MACOSX_DEPLOYMENT_TARGET': '10.9',
+              'OTHER_CFLAGS': [
+                '-std=c++11',
+                '-stdlib=libc++'
+              ]
+            }
+          }]
+        ],
+        "target_name": "grpc_node",
+        "sources": [
+          "src/node/ext/byte_buffer.cc",
+          "src/node/ext/call.cc",
+          "src/node/ext/call_credentials.cc",
+          "src/node/ext/channel.cc",
+          "src/node/ext/channel_credentials.cc",
+          "src/node/ext/completion_queue_async_worker.cc",
+          "src/node/ext/node_grpc.cc",
+          "src/node/ext/server.cc",
+          "src/node/ext/server_credentials.cc",
+          "src/node/ext/timeval.cc"
+        ],
+        "dependencies": [
+          "grpc"
         ]
-      },
-      % endif
-      % endfor
+      }
     ]
   }
diff --git a/test/core/end2end/tests/compressed_payload.c b/test/core/end2end/tests/compressed_payload.c
index a4614a2aba4b15d7cbfe52fc79b6b2bcfde52d4e..f321fe1e7c7f8f09769e64dab29394912f336172 100644
--- a/test/core/end2end/tests/compressed_payload.c
+++ b/test/core/end2end/tests/compressed_payload.c
@@ -46,7 +46,7 @@
 #include "test/core/end2end/cq_verifier.h"
 #include "src/core/channel/channel_args.h"
 #include "src/core/channel/compress_filter.h"
-#include "src/core/surface/call.h"
+#include "src/core/surface/call_test_only.h"
 
 enum { TIMEOUT = 200000 };
 
@@ -196,12 +196,13 @@ static void request_with_payload_template(
   cq_expect_completion(cqv, tag(101), 1);
   cq_verify(cqv);
 
-  GPR_ASSERT(GPR_BITCOUNT(grpc_call_get_encodings_accepted_by_peer(s)) == 3);
-  GPR_ASSERT(GPR_BITGET(grpc_call_get_encodings_accepted_by_peer(s),
+  GPR_ASSERT(
+      GPR_BITCOUNT(grpc_call_test_only_get_encodings_accepted_by_peer(s)) == 3);
+  GPR_ASSERT(GPR_BITGET(grpc_call_test_only_get_encodings_accepted_by_peer(s),
                         GRPC_COMPRESS_NONE) != 0);
-  GPR_ASSERT(GPR_BITGET(grpc_call_get_encodings_accepted_by_peer(s),
+  GPR_ASSERT(GPR_BITGET(grpc_call_test_only_get_encodings_accepted_by_peer(s),
                         GRPC_COMPRESS_DEFLATE) != 0);
-  GPR_ASSERT(GPR_BITGET(grpc_call_get_encodings_accepted_by_peer(s),
+  GPR_ASSERT(GPR_BITGET(grpc_call_test_only_get_encodings_accepted_by_peer(s),
                         GRPC_COMPRESS_GZIP) != 0);
 
   op = ops;
diff --git a/test/core/iomgr/udp_server_test.c b/test/core/iomgr/udp_server_test.c
index fc0026da4df9a5b2ebf43650ef686de6460fe02e..86e8767937825dcd16e4606091a117446b9b3dd8 100644
--- a/test/core/iomgr/udp_server_test.c
+++ b/test/core/iomgr/udp_server_test.c
@@ -49,7 +49,8 @@ static grpc_pollset g_pollset;
 static int g_number_of_reads = 0;
 static int g_number_of_bytes_read = 0;
 
-static void on_read(grpc_fd *emfd, grpc_server *server) {
+static void on_read(grpc_exec_ctx *exec_ctx, grpc_fd *emfd,
+                    grpc_server *server) {
   char read_buffer[512];
   ssize_t byte_count;
 
diff --git a/test/core/profiling/timers_test.c b/test/core/profiling/timers_test.c
index b79cde64bdb22076fcd6d663b75674c626ae1eee..7070fe465f17253729bde3cf3c7f599cf5cc6ae3 100644
--- a/test/core/profiling/timers_test.c
+++ b/test/core/profiling/timers_test.c
@@ -54,15 +54,15 @@ void test_log_events(size_t num_seqs) {
       for (j = 0; j < advance; j++) {
         switch (state[i]) {
           case 0:
-            GRPC_TIMER_MARK(STATE_0, i);
+            GPR_TIMER_MARK(STATE_0, i);
             state[i]++;
             break;
           case 1:
-            GRPC_TIMER_MARK(STATE_1, i);
+            GPR_TIMER_MARK(STATE_1, i);
             state[i]++;
             break;
           case 2:
-            GRPC_TIMER_MARK(STATE_2, i);
+            GPR_TIMER_MARK(STATE_2, i);
             state[i]++;
             break;
           case 3:
@@ -76,8 +76,8 @@ void test_log_events(size_t num_seqs) {
 
 int main(int argc, char **argv) {
   grpc_test_init(argc, argv);
-  grpc_timers_global_init();
+  gpr_timers_global_init();
   test_log_events(1000000);
-  grpc_timers_global_destroy();
+  gpr_timers_global_destroy();
   return 0;
 }
diff --git a/test/cpp/interop/client.cc b/test/cpp/interop/client.cc
index dbe29395b4f0efc58fdef53626a21d1421eecea0..cb9b396beb55cfeb17bb21e53365033ac1c14e7b 100644
--- a/test/cpp/interop/client.cc
+++ b/test/cpp/interop/client.cc
@@ -46,7 +46,7 @@
 #include "test/cpp/util/test_config.h"
 
 DEFINE_bool(use_tls, false, "Whether to use tls.");
-DEFINE_bool(use_prod_roots, false, "True to use SSL roots for google");
+DEFINE_bool(use_test_ca, false, "False to use SSL roots for google");
 DEFINE_int32(server_port, 0, "Server port.");
 DEFINE_string(server_host, "127.0.0.1", "Server host to connect to");
 DEFINE_string(server_host_override, "foo.test.google.fr",
diff --git a/test/cpp/interop/client_helper.cc b/test/cpp/interop/client_helper.cc
index cbad21e318e6d5cddb4a79a628ddb8546bab9873..61b46d25aa041a08f32dd901ec8b82b1ee02f786 100644
--- a/test/cpp/interop/client_helper.cc
+++ b/test/cpp/interop/client_helper.cc
@@ -52,7 +52,7 @@
 #include "test/cpp/util/create_test_channel.h"
 
 DECLARE_bool(use_tls);
-DECLARE_bool(use_prod_roots);
+DECLARE_bool(use_test_ca);
 DECLARE_int32(server_port);
 DECLARE_string(server_host);
 DECLARE_string(server_host_override);
@@ -102,7 +102,7 @@ std::shared_ptr<Channel> CreateChannelForTestCase(
     GPR_ASSERT(FLAGS_use_tls);
     creds = GoogleComputeEngineCredentials();
     return CreateTestChannel(host_port, FLAGS_server_host_override,
-                             FLAGS_use_tls, FLAGS_use_prod_roots, creds);
+                             FLAGS_use_tls, !FLAGS_use_test_ca, creds);
   } else if (test_case == "jwt_token_creds") {
     std::shared_ptr<Credentials> creds;
     GPR_ASSERT(FLAGS_use_tls);
@@ -111,15 +111,15 @@ std::shared_ptr<Channel> CreateChannelForTestCase(
     creds =
         ServiceAccountJWTAccessCredentials(json_key, token_lifetime.count());
     return CreateTestChannel(host_port, FLAGS_server_host_override,
-                             FLAGS_use_tls, FLAGS_use_prod_roots, creds);
+                             FLAGS_use_tls, !FLAGS_use_test_ca, creds);
   } else if (test_case == "oauth2_auth_token") {
     grpc::string raw_token = GetOauth2AccessToken();
     std::shared_ptr<Credentials> creds = AccessTokenCredentials(raw_token);
     return CreateTestChannel(host_port, FLAGS_server_host_override,
-                             FLAGS_use_tls, FLAGS_use_prod_roots, creds);
+                             FLAGS_use_tls, !FLAGS_use_test_ca, creds);
   } else {
     return CreateTestChannel(host_port, FLAGS_server_host_override,
-                             FLAGS_use_tls, FLAGS_use_prod_roots);
+                             FLAGS_use_tls, !FLAGS_use_test_ca);
   }
 }
 
diff --git a/test/cpp/interop/client_helper.h b/test/cpp/interop/client_helper.h
index 0221df93db5a715bd93781b2077297d1a64014b1..ace193042ee39b1ed88a4226773e4257a678e13d 100644
--- a/test/cpp/interop/client_helper.h
+++ b/test/cpp/interop/client_helper.h
@@ -38,7 +38,7 @@
 
 #include <grpc++/channel.h>
 
-#include "src/core/surface/call.h"
+#include "src/core/surface/call_test_only.h"
 
 namespace grpc {
 namespace testing {
@@ -57,11 +57,11 @@ class InteropClientContextInspector {
 
   // Inspector methods, able to peek inside ClientContext, follow.
   grpc_compression_algorithm GetCallCompressionAlgorithm() const {
-    return grpc_call_get_compression_algorithm(context_.call_);
+    return grpc_call_test_only_get_compression_algorithm(context_.call_);
   }
 
   gpr_uint32 GetMessageFlags() const {
-    return grpc_call_get_message_flags(context_.call_);
+    return grpc_call_test_only_get_message_flags(context_.call_);
   }
 
  private:
diff --git a/test/cpp/interop/server_helper.cc b/test/cpp/interop/server_helper.cc
index 4570750846674f276d0444f8ccbe782f0c8648f2..5138a38170a0797fcd2b77360a66afc45b4a8ca9 100644
--- a/test/cpp/interop/server_helper.cc
+++ b/test/cpp/interop/server_helper.cc
@@ -38,7 +38,7 @@
 #include <gflags/gflags.h>
 #include <grpc++/security/server_credentials.h>
 
-#include "src/core/surface/call.h"
+#include "src/core/surface/call_test_only.h"
 #include "test/core/end2end/data/ssl_test_data.h"
 
 DECLARE_bool(use_tls);
@@ -65,11 +65,11 @@ InteropServerContextInspector::InteropServerContextInspector(
 
 grpc_compression_algorithm
 InteropServerContextInspector::GetCallCompressionAlgorithm() const {
-  return grpc_call_get_compression_algorithm(context_.call_);
+  return grpc_call_test_only_get_compression_algorithm(context_.call_);
 }
 
 gpr_uint32 InteropServerContextInspector::GetEncodingsAcceptedByClient() const {
-  return grpc_call_get_encodings_accepted_by_peer(context_.call_);
+  return grpc_call_test_only_get_encodings_accepted_by_peer(context_.call_);
 }
 
 std::shared_ptr<const AuthContext>
diff --git a/test/cpp/qps/client_sync.cc b/test/cpp/qps/client_sync.cc
index beef604856760a28dcef2c57f9c0cb8803c07e97..3c33a1c5de45b34786977d8466ca07e13eea90bb 100644
--- a/test/cpp/qps/client_sync.cc
+++ b/test/cpp/qps/client_sync.cc
@@ -59,6 +59,8 @@
 #include "test/cpp/qps/interarrival.h"
 #include "test/cpp/qps/timer.h"
 
+#include "src/core/profiling/timers.h"
+
 namespace grpc {
 namespace testing {
 
@@ -99,6 +101,7 @@ class SynchronousUnaryClient GRPC_FINAL : public SynchronousClient {
     WaitToIssue(thread_idx);
     auto* stub = channels_[thread_idx % channels_.size()].get_stub();
     double start = Timer::Now();
+    GPR_TIMER_SCOPE("SynchronousUnaryClient::ThreadFunc", 0);
     grpc::ClientContext context;
     grpc::Status s =
         stub->UnaryCall(&context, request_, &responses_[thread_idx]);
@@ -135,6 +138,7 @@ class SynchronousStreamingClient GRPC_FINAL : public SynchronousClient {
 
   bool ThreadFunc(Histogram* histogram, size_t thread_idx) GRPC_OVERRIDE {
     WaitToIssue(thread_idx);
+    GPR_TIMER_SCOPE("SynchronousStreamingClient::ThreadFunc", 0);
     double start = Timer::Now();
     if (stream_[thread_idx]->Write(request_) &&
         stream_[thread_idx]->Read(&responses_[thread_idx])) {
diff --git a/test/cpp/qps/driver.cc b/test/cpp/qps/driver.cc
index ac763e4b3c617755ea5ef2a250c2d0ee19e98b9f..dd5c4f4f73fe5083d0bc0c549213107b5930c1aa 100644
--- a/test/cpp/qps/driver.cc
+++ b/test/cpp/qps/driver.cc
@@ -82,9 +82,12 @@ static deque<string> get_hosts(const string& name) {
 namespace runsc {
 
 // ClientContext allocator
-static ClientContext* AllocContext(list<ClientContext>* contexts) {
+template <class T>
+static ClientContext* AllocContext(list<ClientContext>* contexts, T deadline) {
   contexts->emplace_back();
-  return &contexts->back();
+  auto context = &contexts->back();
+  context->set_deadline(deadline);
+  return context;
 }
 
 struct ServerData {
@@ -147,6 +150,11 @@ std::unique_ptr<ScenarioResult> RunScenario(
   // Trim to just what we need
   workers.resize(num_clients + num_servers);
 
+  gpr_timespec deadline =
+      gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
+                   gpr_time_from_seconds(
+                       warmup_seconds + benchmark_seconds + 20, GPR_TIMESPAN));
+
   // Start servers
   using runsc::ServerData;
   // servers is array rather than std::vector to avoid gcc-4.4 issues
@@ -160,7 +168,7 @@ std::unique_ptr<ScenarioResult> RunScenario(
     result_server_config.set_host(workers[i]);
     *args.mutable_setup() = server_config;
     servers[i].stream =
-        servers[i].stub->RunServer(runsc::AllocContext(&contexts));
+        servers[i].stub->RunServer(runsc::AllocContext(&contexts, deadline));
     GPR_ASSERT(servers[i].stream->Write(args));
     ServerStatus init_status;
     GPR_ASSERT(servers[i].stream->Read(&init_status));
@@ -188,7 +196,7 @@ std::unique_ptr<ScenarioResult> RunScenario(
     result_client_config.set_host(workers[i + num_servers]);
     *args.mutable_setup() = client_config;
     clients[i].stream =
-        clients[i].stub->RunTest(runsc::AllocContext(&contexts));
+        clients[i].stub->RunTest(runsc::AllocContext(&contexts, deadline));
     GPR_ASSERT(clients[i].stream->Write(args));
     ClientStatus init_status;
     GPR_ASSERT(clients[i].stream->Read(&init_status));
diff --git a/tools/codegen/core/gen_hpack_tables.c b/tools/codegen/core/gen_hpack_tables.c
index d924aba6022ecadf77bbb0a6c3fae541c7b05ef8..bae4e4cd7340f3b591cac3892a68090e6164ba8b 100644
--- a/tools/codegen/core/gen_hpack_tables.c
+++ b/tools/codegen/core/gen_hpack_tables.c
@@ -71,7 +71,11 @@ static unsigned char prefix_mask(unsigned char prefix_len) {
   unsigned char i;
   unsigned char out = 0;
   for (i = 0; i < prefix_len; i++) {
-    out |= (unsigned char)(1 << (7 - i));
+    /* NB: the following integer arithmetic operation needs to be in its
+     * expanded form due to the "integral promotion" performed (see section
+     * 3.2.1.1 of the C89 draft standard). A cast to the smaller container type
+     * is then required to avoid the compiler warning */
+    out = (unsigned char)(out | (unsigned char)(1 << (7 - i)));
   }
   return out;
 }
@@ -92,7 +96,12 @@ static void generate_first_byte_lut(void) {
     chrspec = NULL;
     for (j = 0; j < num_fields; j++) {
       if ((prefix_mask(fields[j].prefix_length) & i) == fields[j].prefix) {
-        suffix = suffix_mask(fields[j].prefix_length) & (unsigned char)i;
+        /* NB: the following integer arithmetic operation needs to be in its
+         * expanded form due to the "integral promotion" performed (see section
+         * 3.2.1.1 of the C89 draft standard). A cast to the smaller container
+         * type is then required to avoid the compiler warning */
+        suffix = (unsigned char)(suffix_mask(fields[j].prefix_length) &
+                                 (unsigned char)i);
         if (suffix == suffix_mask(fields[j].prefix_length)) {
           if (fields[j].index != 2) continue;
         } else if (suffix == 0) {
diff --git a/tools/codegen/core/gen_legal_metadata_characters.c b/tools/codegen/core/gen_legal_metadata_characters.c
index 2ffda54a21f0d69b586f2f2a5d74d533487a2f48..677fa5c15569a842731af80a1dc9c5e78d76a664 100644
--- a/tools/codegen/core/gen_legal_metadata_characters.c
+++ b/tools/codegen/core/gen_legal_metadata_characters.c
@@ -41,7 +41,12 @@ static unsigned char legal_bits[256 / 8];
 static void legal(int x) {
   int byte = x / 8;
   int bit = x % 8;
-  legal_bits[byte] |= (unsigned char)(1 << bit);
+  /* NB: the following integer arithmetic operation needs to be in its
+   * expanded form due to the "integral promotion" performed (see section
+   * 3.2.1.1 of the C89 draft standard). A cast to the smaller container type
+   * is then required to avoid the compiler warning */
+  legal_bits[byte] =
+      (unsigned char)((legal_bits[byte] | (unsigned char)(1 << bit)));
 }
 
 static void dump(void) {
diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal
index 0ecb63cf8b03ab939d8457c23619ef18902afbfc..ca2cf01815434b759660a86e34a9ab3acc3a2a4e 100644
--- a/tools/doxygen/Doxyfile.core.internal
+++ b/tools/doxygen/Doxyfile.core.internal
@@ -853,12 +853,12 @@ src/core/json/json.h \
 src/core/json/json_common.h \
 src/core/json/json_reader.h \
 src/core/json/json_writer.h \
-src/core/profiling/timers.h \
 src/core/statistics/census_interface.h \
 src/core/statistics/census_rpc_stats.h \
 src/core/surface/api_trace.h \
 src/core/surface/byte_buffer_queue.h \
 src/core/surface/call.h \
+src/core/surface/call_test_only.h \
 src/core/surface/channel.h \
 src/core/surface/completion_queue.h \
 src/core/surface/event_string.h \
@@ -992,8 +992,6 @@ src/core/json/json.c \
 src/core/json/json_reader.c \
 src/core/json/json_string.c \
 src/core/json/json_writer.c \
-src/core/profiling/basic_timers.c \
-src/core/profiling/stap_timers.c \
 src/core/surface/api_trace.c \
 src/core/surface/byte_buffer.c \
 src/core/surface/byte_buffer_queue.c \
@@ -1070,6 +1068,7 @@ include/grpc/support/tls_gcc.h \
 include/grpc/support/tls_msvc.h \
 include/grpc/support/tls_pthread.h \
 include/grpc/support/useful.h \
+src/core/profiling/timers.h \
 src/core/support/block_annotate.h \
 src/core/support/env.h \
 src/core/support/file.h \
@@ -1079,6 +1078,8 @@ src/core/support/string.h \
 src/core/support/string_win32.h \
 src/core/support/thd_internal.h \
 src/core/support/time_precise.h \
+src/core/profiling/basic_timers.c \
+src/core/profiling/stap_timers.c \
 src/core/support/alloc.c \
 src/core/support/cmdline.c \
 src/core/support/cpu_iphone.c \
@@ -1114,6 +1115,7 @@ src/core/support/thd_posix.c \
 src/core/support/thd_win32.c \
 src/core/support/time.c \
 src/core/support/time_posix.c \
+src/core/support/time_precise.c \
 src/core/support/time_win32.c \
 src/core/support/tls_pthread.c
 
diff --git a/tools/gce_setup/grpc_docker.sh b/tools/gce_setup/grpc_docker.sh
index fdb7736327306ab50840399d0d2db56bff79c510..e50706ec74b4c613306995730572aaca9fb63db7 100755
--- a/tools/gce_setup/grpc_docker.sh
+++ b/tools/gce_setup/grpc_docker.sh
@@ -1477,7 +1477,7 @@ grpc_cloud_prod_auth_compute_engine_creds_gen_node_cmd() {
 #   cmd=$($grpc_gen_test_cmd $flags)
 grpc_interop_gen_cxx_cmd() {
     local cmd_prefix="sudo docker run grpc/cxx";
-    local test_script="/var/local/git/grpc/bins/opt/interop_client --use_tls";
+    local test_script="/var/local/git/grpc/bins/opt/interop_client --use_tls --use_test_ca";
     local the_cmd="$cmd_prefix $test_script $@";
     echo $the_cmd
 }
@@ -1489,7 +1489,7 @@ grpc_interop_gen_cxx_cmd() {
 #   cmd=$($grpc_gen_test_cmd $flags)
 grpc_cloud_prod_gen_cxx_cmd() {
     local cmd_prefix="sudo docker run grpc/cxx";
-    local test_script="/var/local/git/grpc/bins/opt/interop_client --use_tls --use_prod_roots";
+    local test_script="/var/local/git/grpc/bins/opt/interop_client --use_tls";
     local gfe_flags=$(_grpc_prod_gfe_flags)
     local the_cmd="$cmd_prefix $test_script $gfe_flags $@";
     echo $the_cmd
@@ -1502,7 +1502,7 @@ grpc_cloud_prod_gen_cxx_cmd() {
 #   cmd=$($grpc_gen_test_cmd $flags)
 grpc_cloud_prod_auth_service_account_creds_gen_cxx_cmd() {
     local cmd_prefix="sudo docker run grpc/cxx";
-    local test_script="/var/local/git/grpc/bins/opt/interop_client --use_tls --use_prod_roots";
+    local test_script="/var/local/git/grpc/bins/opt/interop_client --use_tls";
     local gfe_flags=$(_grpc_prod_gfe_flags)
     local added_gfe_flags=$(_grpc_svc_acc_test_flags)
     local the_cmd="$cmd_prefix $test_script $gfe_flags $added_gfe_flags $@";
@@ -1516,7 +1516,7 @@ grpc_cloud_prod_auth_service_account_creds_gen_cxx_cmd() {
 #   cmd=$($grpc_gen_test_cmd $flags)
 grpc_cloud_prod_auth_compute_engine_creds_gen_cxx_cmd() {
     local cmd_prefix="sudo docker run grpc/cxx";
-    local test_script="/var/local/git/grpc/bins/opt/interop_client --use_tls --use_prod_roots";
+    local test_script="/var/local/git/grpc/bins/opt/interop_client --use_tls";
     local gfe_flags=$(_grpc_prod_gfe_flags)
     local added_gfe_flags=$(_grpc_gce_test_flags)
     local the_cmd="$cmd_prefix $test_script $gfe_flags $added_gfe_flags $@";
@@ -1530,7 +1530,7 @@ grpc_cloud_prod_auth_compute_engine_creds_gen_cxx_cmd() {
 #   cmd=$($grpc_gen_test_cmd $flags)
 grpc_cloud_prod_auth_jwt_token_creds_gen_cxx_cmd() {
     local cmd_prefix="sudo docker run grpc/cxx";
-    local test_script="/var/local/git/grpc/bins/opt/interop_client --use_tls --use_prod_roots";
+    local test_script="/var/local/git/grpc/bins/opt/interop_client --use_tls";
     local gfe_flags=$(_grpc_prod_gfe_flags)
     local added_gfe_flags=$(_grpc_jwt_token_test_flags)
     local the_cmd="$cmd_prefix $test_script $gfe_flags $added_gfe_flags $@";
diff --git a/tools/http2_interop/README.md b/tools/http2_interop/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..21688f09804c0e47d9c2db6df2ae65039c866064
--- /dev/null
+++ b/tools/http2_interop/README.md
@@ -0,0 +1,9 @@
+HTTP/2 Interop Tests
+====
+
+This is a suite of tests that check a server to see if it plays nicely with other HTTP/2 clients.  To run, just type:
+
+`go test -spec :1234`
+
+Where ":1234" is the ip:port of a running server.
+ 
diff --git a/tools/http2_interop/doc.go b/tools/http2_interop/doc.go
new file mode 100644
index 0000000000000000000000000000000000000000..6c6b5cb1938e0af0f52319b4d9e70657de460b0d
--- /dev/null
+++ b/tools/http2_interop/doc.go
@@ -0,0 +1,6 @@
+// http2interop project doc.go
+
+/*
+http2interop document
+*/
+package http2interop
diff --git a/tools/http2_interop/frame.go b/tools/http2_interop/frame.go
new file mode 100644
index 0000000000000000000000000000000000000000..12689e9b33d6967bed2e4569e467da47b31b0c48
--- /dev/null
+++ b/tools/http2_interop/frame.go
@@ -0,0 +1,11 @@
+package http2interop
+
+import (
+	"io"
+)
+
+type Frame interface {
+	GetHeader() *FrameHeader
+	ParsePayload(io.Reader) error
+	MarshalBinary() ([]byte, error)
+}
diff --git a/tools/http2_interop/frameheader.go b/tools/http2_interop/frameheader.go
new file mode 100644
index 0000000000000000000000000000000000000000..78fe4201f627c75fa985c434302d087ae28cf3db
--- /dev/null
+++ b/tools/http2_interop/frameheader.go
@@ -0,0 +1,109 @@
+package http2interop
+
+import (
+	"encoding/binary"
+	"fmt"
+	"io"
+)
+
+type FrameHeader struct {
+	Length   int
+	Type     FrameType
+	Flags    byte
+	Reserved Reserved
+	StreamID
+}
+
+type Reserved bool
+
+func (r Reserved) String() string {
+	if r {
+		return "R"
+	}
+	return ""
+}
+
+func (fh *FrameHeader) Parse(r io.Reader) error {
+	buf := make([]byte, 9)
+	if _, err := io.ReadFull(r, buf); err != nil {
+		return err
+	}
+	return fh.UnmarshalBinary(buf)
+}
+
+func (fh *FrameHeader) UnmarshalBinary(b []byte) error {
+	if len(b) != 9 {
+		return fmt.Errorf("Invalid frame header length %d", len(b))
+	}
+	*fh = FrameHeader{
+		Length:   int(b[0])<<16 | int(b[1])<<8 | int(b[2]),
+		Type:     FrameType(b[3]),
+		Flags:    b[4],
+		Reserved: Reserved(b[5]>>7 == 1),
+		StreamID: StreamID(binary.BigEndian.Uint32(b[5:9]) & 0x7fffffff),
+	}
+	return nil
+}
+
+func (fh *FrameHeader) MarshalBinary() ([]byte, error) {
+	buf := make([]byte, 9, 9+fh.Length)
+
+	if fh.Length > 0xFFFFFF || fh.Length < 0 {
+		return nil, fmt.Errorf("Invalid frame header length: %d", fh.Length)
+	}
+	if fh.StreamID < 0 {
+		return nil, fmt.Errorf("Invalid Stream ID: %v", fh.StreamID)
+	}
+
+	buf[0], buf[1], buf[2] = byte(fh.Length>>16), byte(fh.Length>>8), byte(fh.Length)
+	buf[3] = byte(fh.Type)
+	buf[4] = fh.Flags
+	binary.BigEndian.PutUint32(buf[5:], uint32(fh.StreamID))
+
+	return buf, nil
+}
+
+type StreamID int32
+
+type FrameType byte
+
+func (ft FrameType) String() string {
+	switch ft {
+	case DataFrameType:
+		return "DATA"
+	case HeadersFrameType:
+		return "HEADERS"
+	case PriorityFrameType:
+		return "PRIORITY"
+	case ResetStreamFrameType:
+		return "RST_STREAM"
+	case SettingsFrameType:
+		return "SETTINGS"
+	case PushPromiseFrameType:
+		return "PUSH_PROMISE"
+	case PingFrameType:
+		return "PING"
+	case GoAwayFrameType:
+		return "GOAWAY"
+	case WindowUpdateFrameType:
+		return "WINDOW_UPDATE"
+	case ContinuationFrameType:
+		return "CONTINUATION"
+	default:
+		return fmt.Sprintf("UNKNOWN(%d)", byte(ft))
+	}
+}
+
+// Types
+const (
+	DataFrameType         FrameType = 0
+	HeadersFrameType      FrameType = 1
+	PriorityFrameType     FrameType = 2
+	ResetStreamFrameType  FrameType = 3
+	SettingsFrameType     FrameType = 4
+	PushPromiseFrameType  FrameType = 5
+	PingFrameType         FrameType = 6
+	GoAwayFrameType       FrameType = 7
+	WindowUpdateFrameType FrameType = 8
+	ContinuationFrameType FrameType = 9
+)
diff --git a/tools/http2_interop/http2interop.go b/tools/http2_interop/http2interop.go
new file mode 100644
index 0000000000000000000000000000000000000000..f1bca7fe13dfdf52879a6c685be8ac03bac7bbc6
--- /dev/null
+++ b/tools/http2_interop/http2interop.go
@@ -0,0 +1,245 @@
+package http2interop
+
+import (
+	"crypto/tls"
+	"fmt"
+	"io"
+	"log"
+)
+
+const (
+	Preface = "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"
+)
+
+func parseFrame(r io.Reader) (Frame, error) {
+	fh := FrameHeader{}
+	if err := fh.Parse(r); err != nil {
+		return nil, err
+	}
+	var f Frame
+	switch fh.Type {
+	case PingFrameType:
+		f = &PingFrame{
+			Header: fh,
+		}
+	case SettingsFrameType:
+		f = &SettingsFrame{
+			Header: fh,
+		}
+	default:
+		f = &UnknownFrame{
+			Header: fh,
+		}
+	}
+	if err := f.ParsePayload(r); err != nil {
+		return nil, err
+	}
+
+	return f, nil
+}
+
+func streamFrame(w io.Writer, f Frame) error {
+	raw, err := f.MarshalBinary()
+	if err != nil {
+		return err
+	}
+	if _, err := w.Write(raw); err != nil {
+		return err
+	}
+	return nil
+}
+
+func getHttp2Conn(addr string) (*tls.Conn, error) {
+	config := &tls.Config{
+		InsecureSkipVerify: true,
+		NextProtos:         []string{"h2"},
+	}
+
+	conn, err := tls.Dial("tcp", addr, config)
+	if err != nil {
+		return nil, err
+	}
+
+	return conn, nil
+}
+
+func testClientShortSettings(addr string, length int) error {
+	c, err := getHttp2Conn(addr)
+	if err != nil {
+		return err
+	}
+	defer c.Close()
+
+	if _, err := c.Write([]byte(Preface)); err != nil {
+		return err
+	}
+
+	// Bad, settings, non multiple of 6
+	sf := &UnknownFrame{
+		Header: FrameHeader{
+			Type: SettingsFrameType,
+		},
+		Data: make([]byte, length),
+	}
+	if err := streamFrame(c, sf); err != nil {
+		return err
+	}
+
+	for {
+		frame, err := parseFrame(c)
+		if err != nil {
+			return err
+		}
+		log.Println(frame)
+	}
+
+	return nil
+}
+
+func testClientPrefaceWithStreamId(addr string) error {
+	c, err := getHttp2Conn(addr)
+	if err != nil {
+		return err
+	}
+	defer c.Close()
+
+	// Good so far
+	if _, err := c.Write([]byte(Preface)); err != nil {
+		return err
+	}
+
+	// Bad, settings do not have ids
+	sf := &SettingsFrame{
+		Header: FrameHeader{
+			StreamID: 1,
+		},
+	}
+	if err := streamFrame(c, sf); err != nil {
+		return err
+	}
+
+	for {
+		frame, err := parseFrame(c)
+		if err != nil {
+			return err
+		}
+		log.Println(frame)
+	}
+
+	return nil
+}
+
+func testUnknownFrameType(addr string) error {
+	c, err := getHttp2Conn(addr)
+	if err != nil {
+		return err
+	}
+	defer c.Close()
+
+	if _, err := c.Write([]byte(Preface)); err != nil {
+		return err
+	}
+
+	// Send some settings, which are part of the client preface
+	sf := &SettingsFrame{}
+	if err := streamFrame(c, sf); err != nil {
+		return err
+	}
+
+	// Write a bunch of invalid frame types.
+	for ft := ContinuationFrameType + 1; ft != 0; ft++ {
+		fh := &UnknownFrame{
+			Header: FrameHeader{
+				Type: ft,
+			},
+		}
+		if err := streamFrame(c, fh); err != nil {
+			return err
+		}
+	}
+
+	pf := &PingFrame{
+		Data: []byte("01234567"),
+	}
+	if err := streamFrame(c, pf); err != nil {
+		return err
+	}
+
+	for {
+		frame, err := parseFrame(c)
+		if err != nil {
+			return err
+		}
+		if npf, ok := frame.(*PingFrame); !ok {
+			continue
+		} else {
+			if string(npf.Data) != string(pf.Data) || npf.Header.Flags&PING_ACK == 0 {
+				return fmt.Errorf("Bad ping %+v", *npf)
+			}
+			return nil
+		}
+	}
+
+	return nil
+}
+
+func testShortPreface(addr string, prefacePrefix string) error {
+	c, err := getHttp2Conn(addr)
+	if err != nil {
+		return err
+	}
+	defer c.Close()
+
+	if _, err := c.Write([]byte(prefacePrefix)); err != nil {
+		return err
+	}
+
+	buf := make([]byte, 256)
+	for ; err == nil; _, err = c.Read(buf) {
+	}
+	// TODO: maybe check for a GOAWAY?
+	return err
+}
+
+func testTLSMaxVersion(addr string, version uint16) error {
+	config := &tls.Config{
+		InsecureSkipVerify: true,
+		NextProtos:         []string{"h2"},
+		MaxVersion:         version,
+	}
+	conn, err := tls.Dial("tcp", addr, config)
+	if err != nil {
+		return err
+	}
+	defer conn.Close()
+
+	buf := make([]byte, 256)
+	if n, err := conn.Read(buf); err != nil {
+		if n != 0 {
+			return fmt.Errorf("Expected no bytes to be read, but was %d", n)
+		}
+		return err
+	}
+	return nil
+}
+
+func testTLSApplicationProtocol(addr string) error {
+	config := &tls.Config{
+		InsecureSkipVerify: true,
+		NextProtos:         []string{"h2c"},
+	}
+	conn, err := tls.Dial("tcp", addr, config)
+	if err != nil {
+		return err
+	}
+	defer conn.Close()
+
+	buf := make([]byte, 256)
+	if n, err := conn.Read(buf); err != nil {
+		if n != 0 {
+			return fmt.Errorf("Expected no bytes to be read, but was %d", n)
+		}
+		return err
+	}
+	return nil
+}
diff --git a/tools/http2_interop/http2interop_test.go b/tools/http2_interop/http2interop_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..3b687c035e8748bcba20952138d3b02f0cd2b2d2
--- /dev/null
+++ b/tools/http2_interop/http2interop_test.go
@@ -0,0 +1,50 @@
+package http2interop
+
+import (
+	"crypto/tls"
+	"flag"
+	"io"
+	"os"
+	"testing"
+)
+
+var (
+	serverSpec = flag.String("spec", ":50051", "The server spec to test")
+)
+
+func TestShortPreface(t *testing.T) {
+	for i := 0; i < len(Preface)-1; i++ {
+		if err := testShortPreface(*serverSpec, Preface[:i]+"X"); err != io.EOF {
+			t.Error("Expected an EOF but was", err)
+		}
+	}
+}
+
+func TestUnknownFrameType(t *testing.T) {
+	if err := testUnknownFrameType(*serverSpec); err != nil {
+		t.Fatal(err)
+	}
+}
+
+func TestTLSApplicationProtocol(t *testing.T) {
+	if err := testTLSApplicationProtocol(*serverSpec); err != io.EOF {
+		t.Fatal("Expected an EOF but was", err)
+	}
+}
+
+func TestTLSMaxVersion(t *testing.T) {
+	if err := testTLSMaxVersion(*serverSpec, tls.VersionTLS11); err != io.EOF {
+		t.Fatal("Expected an EOF but was", err)
+	}
+}
+
+func TestClientPrefaceWithStreamId(t *testing.T) {
+	if err := testClientPrefaceWithStreamId(*serverSpec); err != io.EOF {
+		t.Fatal("Expected an EOF but was", err)
+	}
+}
+
+func TestMain(m *testing.M) {
+	flag.Parse()
+	os.Exit(m.Run())
+}
diff --git a/tools/http2_interop/ping.go b/tools/http2_interop/ping.go
new file mode 100644
index 0000000000000000000000000000000000000000..6011eed4511c4a9f46ed77c8d55b3aa8be935b99
--- /dev/null
+++ b/tools/http2_interop/ping.go
@@ -0,0 +1,65 @@
+package http2interop
+
+import (
+	"fmt"
+	"io"
+)
+
+type PingFrame struct {
+	Header FrameHeader
+	Data   []byte
+}
+
+const (
+	PING_ACK = 0x01
+)
+
+func (f *PingFrame) GetHeader() *FrameHeader {
+	return &f.Header
+}
+
+func (f *PingFrame) ParsePayload(r io.Reader) error {
+	raw := make([]byte, f.Header.Length)
+	if _, err := io.ReadFull(r, raw); err != nil {
+		return err
+	}
+	return f.UnmarshalPayload(raw)
+}
+
+func (f *PingFrame) UnmarshalPayload(raw []byte) error {
+	if f.Header.Length != len(raw) {
+		return fmt.Errorf("Invalid Payload length %d != %d", f.Header.Length, len(raw))
+	}
+	if f.Header.Length != 8 {
+		return fmt.Errorf("Invalid Payload length %d", f.Header.Length)
+	}
+
+	f.Data = []byte(string(raw))
+
+	return nil
+}
+
+func (f *PingFrame) MarshalPayload() ([]byte, error) {
+	if len(f.Data) != 8 {
+		return nil, fmt.Errorf("Invalid Payload length %d", len(f.Data))
+	}
+	return []byte(string(f.Data)), nil
+}
+
+func (f *PingFrame) MarshalBinary() ([]byte, error) {
+	payload, err := f.MarshalPayload()
+	if err != nil {
+		return nil, err
+	}
+
+	f.Header.Length = len(payload)
+	f.Header.Type = PingFrameType
+	header, err := f.Header.MarshalBinary()
+	if err != nil {
+		return nil, err
+	}
+
+	header = append(header, payload...)
+
+	return header, nil
+}
diff --git a/tools/http2_interop/settings.go b/tools/http2_interop/settings.go
new file mode 100644
index 0000000000000000000000000000000000000000..5a2b1ada6513c84df5134b7e87fc4122695f775b
--- /dev/null
+++ b/tools/http2_interop/settings.go
@@ -0,0 +1,109 @@
+package http2interop
+
+import (
+	"encoding/binary"
+	"fmt"
+	"io"
+)
+
+const (
+	SETTINGS_ACK = 1
+)
+
+type SettingsFrame struct {
+	Header FrameHeader
+	Params []SettingsParameter
+}
+
+type SettingsIdentifier uint16
+
+const (
+	SettingsHeaderTableSize      SettingsIdentifier = 1
+	SettingsEnablePush           SettingsIdentifier = 2
+	SettingsMaxConcurrentStreams SettingsIdentifier = 3
+	SettingsInitialWindowSize    SettingsIdentifier = 4
+	SettingsMaxFrameSize         SettingsIdentifier = 5
+	SettingsMaxHeaderListSize    SettingsIdentifier = 6
+)
+
+func (si SettingsIdentifier) String() string {
+	switch si {
+	case SettingsHeaderTableSize:
+		return "HEADER_TABLE_SIZE"
+	case SettingsEnablePush:
+		return "ENABLE_PUSH"
+	case SettingsMaxConcurrentStreams:
+		return "MAX_CONCURRENT_STREAMS"
+	case SettingsInitialWindowSize:
+		return "INITIAL_WINDOW_SIZE"
+	case SettingsMaxFrameSize:
+		return "MAX_FRAME_SIZE"
+	case SettingsMaxHeaderListSize:
+		return "MAX_HEADER_LIST_SIZE"
+	default:
+		return fmt.Sprintf("UNKNOWN(%d)", uint16(si))
+	}
+}
+
+type SettingsParameter struct {
+	Identifier SettingsIdentifier
+	Value      uint32
+}
+
+func (f *SettingsFrame) GetHeader() *FrameHeader {
+	return &f.Header
+}
+
+func (f *SettingsFrame) ParsePayload(r io.Reader) error {
+	raw := make([]byte, f.Header.Length)
+	if _, err := io.ReadFull(r, raw); err != nil {
+		return err
+	}
+	return f.UnmarshalPayload(raw)
+}
+
+func (f *SettingsFrame) UnmarshalPayload(raw []byte) error {
+	if f.Header.Length != len(raw) {
+		return fmt.Errorf("Invalid Payload length %d != %d", f.Header.Length, len(raw))
+	}
+
+	if f.Header.Length%6 != 0 {
+		return fmt.Errorf("Invalid Payload length %d", f.Header.Length)
+	}
+
+	f.Params = make([]SettingsParameter, 0, f.Header.Length/6)
+	for i := 0; i < len(raw); i += 6 {
+		f.Params = append(f.Params, SettingsParameter{
+			Identifier: SettingsIdentifier(binary.BigEndian.Uint16(raw[i : i+2])),
+			Value:      binary.BigEndian.Uint32(raw[i+2 : i+6]),
+		})
+	}
+	return nil
+}
+
+func (f *SettingsFrame) MarshalPayload() ([]byte, error) {
+	raw := make([]byte, 0, len(f.Params)*6)
+	for i, p := range f.Params {
+		binary.BigEndian.PutUint16(raw[i*6:i*6+2], uint16(p.Identifier))
+		binary.BigEndian.PutUint32(raw[i*6+2:i*6+6], p.Value)
+	}
+	return raw, nil
+}
+
+func (f *SettingsFrame) MarshalBinary() ([]byte, error) {
+	payload, err := f.MarshalPayload()
+	if err != nil {
+		return nil, err
+	}
+
+	f.Header.Length = len(payload)
+	f.Header.Type = SettingsFrameType
+	header, err := f.Header.MarshalBinary()
+	if err != nil {
+		return nil, err
+	}
+
+	header = append(header, payload...)
+
+	return header, nil
+}
diff --git a/tools/http2_interop/unknownframe.go b/tools/http2_interop/unknownframe.go
new file mode 100644
index 0000000000000000000000000000000000000000..0450e7e976caa551b8cf1c200893b64caeb49c83
--- /dev/null
+++ b/tools/http2_interop/unknownframe.go
@@ -0,0 +1,54 @@
+package http2interop
+
+import (
+	"fmt"
+	"io"
+)
+
+type UnknownFrame struct {
+	Header FrameHeader
+	Data   []byte
+}
+
+func (f *UnknownFrame) GetHeader() *FrameHeader {
+	return &f.Header
+}
+
+func (f *UnknownFrame) ParsePayload(r io.Reader) error {
+	raw := make([]byte, f.Header.Length)
+	if _, err := io.ReadFull(r, raw); err != nil {
+		return err
+	}
+	return f.UnmarshalPayload(raw)
+}
+
+func (f *UnknownFrame) UnmarshalPayload(raw []byte) error {
+	if f.Header.Length != len(raw) {
+		return fmt.Errorf("Invalid Payload length %d != %d", f.Header.Length, len(raw))
+	}
+
+	f.Data = []byte(string(raw))
+
+	return nil
+}
+
+func (f *UnknownFrame) MarshalPayload() ([]byte, error) {
+	return []byte(string(f.Data)), nil
+}
+
+func (f *UnknownFrame) MarshalBinary() ([]byte, error) {
+	f.Header.Length = len(f.Data)
+	buf, err := f.Header.MarshalBinary()
+	if err != nil {
+		return nil, err
+	}
+
+	payload, err := f.MarshalPayload()
+	if err != nil {
+		return nil, err
+	}
+
+	buf = append(buf, payload...)
+
+	return buf, nil
+}
diff --git a/tools/jenkins/build_docker_and_run_tests.sh b/tools/jenkins/build_docker_and_run_tests.sh
index 2c562e992aa4771da617336254b037096d065769..5bb2b6b18860037262d67efa1513f7564e9685ba 100755
--- a/tools/jenkins/build_docker_and_run_tests.sh
+++ b/tools/jenkins/build_docker_and_run_tests.sh
@@ -37,8 +37,13 @@ cd `dirname $0`/../..
 git_root=`pwd`
 cd -
 
+# Ensure existence of ccache directory
 mkdir -p /tmp/ccache
 
+# Ensure existence of the home directory for XDG caches (e.g. what pip uses for
+# its cache location now that --download-cache is deprecated).
+mkdir -p /tmp/xdg-cache-home
+
 # Create a local branch so the child Docker script won't complain
 git branch -f jenkins-docker
 
@@ -48,8 +53,8 @@ DOCKER_IMAGE_NAME=grpc_jenkins_slave${docker_suffix}_`sha1sum tools/jenkins/grpc
 # Make sure docker image has been built. Should be instantaneous if so.
 docker build -t $DOCKER_IMAGE_NAME tools/jenkins/grpc_jenkins_slave$docker_suffix
 
-# Make sure the CID file is gone.
-rm -f docker.cid
+# Choose random name for docker container
+CONTAINER_NAME="run_tests_$(uuidgen)"
 
 # Run tests inside docker
 docker run \
@@ -57,29 +62,30 @@ docker run \
   -e "config=$config" \
   -e "arch=$arch" \
   -e CCACHE_DIR=/tmp/ccache \
+  -e XDG_CACHE_HOME=/tmp/xdg-cache-home \
   -i $TTY_FLAG \
   -v "$git_root:/var/local/jenkins/grpc" \
   -v /tmp/ccache:/tmp/ccache \
+  -v /tmp/npm-cache:/tmp/npm-cache \
+  -v /tmp/xdg-cache-home:/tmp/xdg-cache-home \
   -v /var/run/docker.sock:/var/run/docker.sock \
   -v $(which docker):/bin/docker \
   -w /var/local/git/grpc \
-  --cidfile=docker.cid \
+  --name=$CONTAINER_NAME \
   $DOCKER_IMAGE_NAME \
   bash -l /var/local/jenkins/grpc/tools/jenkins/docker_run_tests.sh || DOCKER_FAILED="true"
 
-DOCKER_CID=`cat docker.cid`
-
 if [ "$XML_REPORT" != "" ]
 then
-  docker cp "$DOCKER_CID:/var/local/git/grpc/$XML_REPORT" $git_root
+  docker cp "$CONTAINER_NAME:/var/local/git/grpc/$XML_REPORT" $git_root
 fi
 
-docker cp "$DOCKER_CID:/var/local/git/grpc/reports.zip" $git_root || true
+docker cp "$CONTAINER_NAME:/var/local/git/grpc/reports.zip" $git_root || true
 unzip $git_root/reports.zip -d $git_root || true
 rm -f reports.zip
 
 # remove the container, possibly killing it first
-docker rm -f $DOCKER_CID || true
+docker rm -f $CONTAINER_NAME || true
 
 if [ "$DOCKER_FAILED" != "" ] && [ "$XML_REPORT" == "" ]
 then
diff --git a/tools/jenkins/build_interop_image.sh b/tools/jenkins/build_interop_image.sh
index b5958588f2bc1ba6c8115ffed4f1141b7fd6cc29..166efbd9e2f0123048ac22910fc356bdf205fc37 100755
--- a/tools/jenkins/build_interop_image.sh
+++ b/tools/jenkins/build_interop_image.sh
@@ -35,12 +35,12 @@ set -x
 
 cd `dirname $0`/../..
 GRPC_ROOT=`pwd`
-MOUNT_ARGS="-v $GRPC_ROOT:/var/local/jenkins/grpc"
+MOUNT_ARGS="-v $GRPC_ROOT:/var/local/jenkins/grpc:ro"
 
 GRPC_JAVA_ROOT=`cd ../grpc-java && pwd`
 if [ "$GRPC_JAVA_ROOT" != "" ]
 then
-  MOUNT_ARGS+=" -v $GRPC_JAVA_ROOT:/var/local/jenkins/grpc-java"
+  MOUNT_ARGS+=" -v $GRPC_JAVA_ROOT:/var/local/jenkins/grpc-java:ro"
 else
   echo "WARNING: grpc-java not found, it won't be mounted to the docker container."
 fi
@@ -48,7 +48,7 @@ fi
 GRPC_GO_ROOT=`cd ../grpc-go && pwd`
 if [ "$GRPC_GO_ROOT" != "" ]
 then
-  MOUNT_ARGS+=" -v $GRPC_GO_ROOT:/var/local/jenkins/grpc-go"
+  MOUNT_ARGS+=" -v $GRPC_GO_ROOT:/var/local/jenkins/grpc-go:ro"
 else
   echo "WARNING: grpc-go not found, it won't be mounted to the docker container."
 fi
@@ -60,6 +60,14 @@ mkdir -p /tmp/ccache
 #  BASE_NAME - base name used to locate the base Dockerfile and build script
 #  TTY_FLAG - optional -t flag to make docker allocate tty.
 
+# Mount service account dir if available.
+# If service_directory does not contain the service account JSON file,
+# some of the tests will fail.
+if [ -e $HOME/service_account ]
+then
+  MOUNT_ARGS+=" -v $HOME/service_account:/var/local/jenkins/service_account:ro"
+fi
+
 # Use image name based on Dockerfile checksum
 BASE_IMAGE=${BASE_NAME}_base:`sha1sum tools/jenkins/$BASE_NAME/Dockerfile | cut -f1 -d\ `
 
@@ -69,7 +77,7 @@ docker build -t $BASE_IMAGE --force-rm=true tools/jenkins/$BASE_NAME || exit $?
 # Create a local branch so the child Docker script won't complain
 git branch -f jenkins-docker
 
-CIDFILE=`mktemp -u --suffix=.cid`
+CONTAINER_NAME="build_${BASE_NAME}_$(uuidgen)"
 
 # Prepare image for interop tests, commit it on success.
 (docker run \
@@ -77,17 +85,14 @@ CIDFILE=`mktemp -u --suffix=.cid`
   -i $TTY_FLAG \
   $MOUNT_ARGS \
   -v /tmp/ccache:/tmp/ccache \
-  --cidfile=$CIDFILE \
+  --name=$CONTAINER_NAME \
   $BASE_IMAGE \
   bash -l /var/local/jenkins/grpc/tools/jenkins/$BASE_NAME/build_interop.sh \
-  && docker commit `cat $CIDFILE` $INTEROP_IMAGE \
+  && docker commit $CONTAINER_NAME $INTEROP_IMAGE \
   && echo "Successfully built image $INTEROP_IMAGE")
 EXITCODE=$?
 
 # remove intermediate container, possibly killing it first
-docker rm -f `cat $CIDFILE`
-
-# remove the cidfile
-rm -rf `cat $CIDFILE`
+docker rm -f $CONTAINER_NAME
 
 exit $EXITCODE
diff --git a/tools/jenkins/docker_run_tests.sh b/tools/jenkins/docker_run_tests.sh
index 2e39bc6f51e2a4ef208342c004dad339fae66ea7..8bafeea6200f290ec78a1697254613f1688036ea 100755
--- a/tools/jenkins/docker_run_tests.sh
+++ b/tools/jenkins/docker_run_tests.sh
@@ -36,6 +36,10 @@ set -e
 export CONFIG=$config
 export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer-3.5
 
+# Ensure that programs depending on current-user-ownership of cache directories
+# are satisfied (it's being mounted from outside the image).
+chown `whoami` $XDG_CACHE_HOME
+
 mkdir -p /var/local/git
 git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc
 
diff --git a/tools/jenkins/grpc_interop_csharp/build_interop.sh b/tools/jenkins/grpc_interop_csharp/build_interop.sh
index e91cbed81ea7fb265c81422689db2d905200bd46..8fde687900a380025ccd023adc68f73d47eb1732 100755
--- a/tools/jenkins/grpc_interop_csharp/build_interop.sh
+++ b/tools/jenkins/grpc_interop_csharp/build_interop.sh
@@ -34,6 +34,9 @@ set -e
 mkdir -p /var/local/git
 git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc
 
+# copy service account keys if available
+cp -r /var/local/jenkins/service_account $HOME || true
+
 cd /var/local/git/grpc
 
 make install-certs
diff --git a/tools/jenkins/grpc_interop_cxx/build_interop.sh b/tools/jenkins/grpc_interop_cxx/build_interop.sh
index 4163e11ecc786f18c94231e53d635817c06b8108..1c0828d23a6ea6ced82f87b80fc91ce7c306bcde 100755
--- a/tools/jenkins/grpc_interop_cxx/build_interop.sh
+++ b/tools/jenkins/grpc_interop_cxx/build_interop.sh
@@ -34,6 +34,9 @@ set -e
 mkdir -p /var/local/git
 git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc
 
+# copy service account keys if available
+cp -r /var/local/jenkins/service_account $HOME || true
+
 cd /var/local/git/grpc
 
 make install-certs
diff --git a/tools/jenkins/grpc_interop_go/build_interop.sh b/tools/jenkins/grpc_interop_go/build_interop.sh
index 78dd4ea9cf5eb8495a4e53835598a0953d0a3559..05fc6dfdfb62af86ddace04317f2d348f4c26d20 100755
--- a/tools/jenkins/grpc_interop_go/build_interop.sh
+++ b/tools/jenkins/grpc_interop_go/build_interop.sh
@@ -36,6 +36,9 @@ set -e
 # to test instead of using "go get" to download from Github directly.
 git clone --recursive /var/local/jenkins/grpc-go src/gooogle.golang.org/grpc
 
+# copy service account keys if available
+cp -r /var/local/jenkins/service_account $HOME || true
+
 # Get dependencies from GitHub
 # NOTE: once grpc-go dependencies change, this needs to be updated manually
 # but we don't expect this to happen any time soon.
diff --git a/tools/jenkins/grpc_interop_java/build_interop.sh b/tools/jenkins/grpc_interop_java/build_interop.sh
index 4ee2f44e3d5b42b68b5a1932ee8c7af8647c5852..9997c63308b50fa739840c84b7d0100d47570b60 100755
--- a/tools/jenkins/grpc_interop_java/build_interop.sh
+++ b/tools/jenkins/grpc_interop_java/build_interop.sh
@@ -34,6 +34,9 @@ set -e
 mkdir -p /var/local/git
 git clone --recursive --depth 1 /var/local/jenkins/grpc-java /var/local/git/grpc-java
 
+# copy service account keys if available
+cp -r /var/local/jenkins/service_account $HOME || true
+
 cd /var/local/git/grpc-java
 
 ./gradlew :grpc-interop-testing:installDist -PskipCodegen=true
diff --git a/tools/jenkins/grpc_interop_node/Dockerfile b/tools/jenkins/grpc_interop_node/Dockerfile
index 587227b94294daec0c98f3de898a6f949f0a8af4..db5aff844de1aa96584e56d7a3ee3b474c7cf345 100644
--- a/tools/jenkins/grpc_interop_node/Dockerfile
+++ b/tools/jenkins/grpc_interop_node/Dockerfile
@@ -48,6 +48,7 @@ RUN apt-get update && apt-get install -y \
   libc6-dbg \
   libc6-dev \
   libgtest-dev \
+  libssl-dev \
   libtool \
   make \
   strace \
diff --git a/tools/jenkins/grpc_interop_node/build_interop.sh b/tools/jenkins/grpc_interop_node/build_interop.sh
index 55e2a4081bcc89a7e7213276a830f7abf1c11e2f..3b69715c9af983effb7126e0312b1588483a0e5c 100755
--- a/tools/jenkins/grpc_interop_node/build_interop.sh
+++ b/tools/jenkins/grpc_interop_node/build_interop.sh
@@ -34,6 +34,9 @@ set -e
 mkdir -p /var/local/git
 git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc
 
+# copy service account keys if available
+cp -r /var/local/jenkins/service_account $HOME || true
+
 cd /var/local/git/grpc
 nvm use 0.12
 nvm alias default 0.12  # prevent the need to run 'nvm use' in every shell
@@ -42,5 +45,4 @@ make install-certs
 
 # build Node interop client & server
 npm install -g node-gyp
-make install_c -C /var/local/git/grpc
-(cd src/node && npm install && node-gyp rebuild)
+(npm install && node-gyp rebuild)
diff --git a/tools/jenkins/grpc_interop_php/build_interop.sh b/tools/jenkins/grpc_interop_php/build_interop.sh
index 745dea845d6f2ed6b51d994f9dc340502f83233b..cd9d67804af685ed987362423e401be1d32a98ba 100755
--- a/tools/jenkins/grpc_interop_php/build_interop.sh
+++ b/tools/jenkins/grpc_interop_php/build_interop.sh
@@ -34,6 +34,9 @@ set -e
 mkdir -p /var/local/git
 git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc
 
+# copy service account keys if available
+cp -r /var/local/jenkins/service_account $HOME || true
+
 cd /var/local/git/grpc
 rvm --default use ruby-2.1
 
diff --git a/tools/jenkins/grpc_interop_ruby/build_interop.sh b/tools/jenkins/grpc_interop_ruby/build_interop.sh
index 7d407e7d0a9e2971df9187aef0dda32db6365fd5..c5023f5c1d4e18cbe371b5dfbcf7fd4f2c39782b 100755
--- a/tools/jenkins/grpc_interop_ruby/build_interop.sh
+++ b/tools/jenkins/grpc_interop_ruby/build_interop.sh
@@ -34,6 +34,9 @@ set -e
 mkdir -p /var/local/git
 git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc
 
+# copy service account keys if available
+cp -r /var/local/jenkins/service_account $HOME || true
+
 cd /var/local/git/grpc
 rvm --default use ruby-2.1
 
diff --git a/tools/jenkins/grpc_jenkins_slave/Dockerfile b/tools/jenkins/grpc_jenkins_slave/Dockerfile
index 4f5387eeb55f2f5a786aab6972163854bb40801f..5b8c24c076ca217204a539a5109f4f24151b8b66 100644
--- a/tools/jenkins/grpc_jenkins_slave/Dockerfile
+++ b/tools/jenkins/grpc_jenkins_slave/Dockerfile
@@ -101,7 +101,7 @@ ENV NUGET mono /var/local/NuGet.exe
 # Install nvm
 RUN touch .profile
 RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.25.4/install.sh | bash
-RUN /bin/bash -l -c "nvm install 0.12"
+RUN /bin/bash -l -c "nvm install 0.12 && npm config set cache /tmp/npm-cache"
 
 ##################
 # Ruby dependencies
@@ -126,10 +126,11 @@ RUN /bin/bash -l -c "gem install bundler --no-ri --no-rdoc"
 RUN apt-get update && apt-get install -y \
     python-all-dev \
     python3-all-dev \
-    python-pip \
-    python-virtualenv
+    python-pip
 
 # Install Python packages from PyPI
+RUN pip install pip --upgrade
+RUN pip install virtualenv
 RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.0.0a2
 
 # For sanity test
@@ -156,6 +157,12 @@ RUN apt-get update && apt-get install -y \
 
 RUN apt-get install -y libzookeeper-mt-dev
 
+##################
+# Docker "inception".
+# Note this is quite the ugly hack.
+# This makes sure that the docker binary we inject has its dependencies.
+RUN curl https://get.docker.com/ | sh
+RUN apt-get remove --purge -y docker-engine
 
 RUN mkdir /var/local/jenkins
 
diff --git a/tools/jenkins/grpc_jenkins_slave_32bits/Dockerfile b/tools/jenkins/grpc_jenkins_slave_32bits/Dockerfile
index 81a039909160acc66f9a3222caf9011c7a2a9112..7179a50cc5993fd063c59e8805659e0c496e58d8 100644
--- a/tools/jenkins/grpc_jenkins_slave_32bits/Dockerfile
+++ b/tools/jenkins/grpc_jenkins_slave_32bits/Dockerfile
@@ -101,7 +101,7 @@ ENV NUGET mono /var/local/NuGet.exe
 # Install nvm
 RUN touch .profile
 RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.25.4/install.sh | bash
-RUN /bin/bash -l -c "nvm install 0.12"
+RUN /bin/bash -l -c "nvm install 0.12 && npm config set cache /tmp/npm-cache"
 
 ##################
 # Ruby dependencies
diff --git a/tools/jenkins/run_interop.sh b/tools/jenkins/run_interop.sh
new file mode 100755
index 0000000000000000000000000000000000000000..14e075691cd31303576519bf5a6efe0fdf9e59b1
--- /dev/null
+++ b/tools/jenkins/run_interop.sh
@@ -0,0 +1,37 @@
+#!/usr/bin/env bash
+# Copyright 2015, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# This script is invoked by Jenkins and runs interop test suite.
+set -ex
+
+# Enter the gRPC repo root
+cd $(dirname $0)/../..
+
+tools/run_tests/run_interop_tests.py -l all -s all --cloud_to_prod --use_docker -t -j 8 $@ || true
diff --git a/tools/jenkins/run_jenkins.sh b/tools/jenkins/run_jenkins.sh
index f79e739f6aecb92648165c79f134918bb2ff7cf1..0e1af2a2a9a94702a529645139ad418dd4edec64 100755
--- a/tools/jenkins/run_jenkins.sh
+++ b/tools/jenkins/run_jenkins.sh
@@ -63,10 +63,6 @@ then
   # Prevent msbuild from picking up "platform" env variable, which would break the build
   unset platform
 
-  # TODO(jtattermusch): integrate nuget restore in a nicer way.
-  /cygdrive/c/nuget/nuget.exe restore vsprojects/grpc.sln
-  /cygdrive/c/nuget/nuget.exe restore src/csharp/Grpc.sln
-
   python tools/run_tests/run_tests.py -t -l $language -x report.xml $@ || true
 
 elif [ "$platform" == "macos" ]
@@ -90,3 +86,9 @@ else
   echo "Unknown platform $platform"
   exit 1
 fi
+
+if [ ! -e reports/index.html ]
+then
+  mkdir -p reports
+  echo 'No reports generated.' > reports/index.html
+fi
diff --git a/tools/profile_analyzer/profile_analyzer.py b/tools/profile_analyzer/profile_analyzer.py
deleted file mode 100755
index e5e9a28a92df18496ac59daa9371c95f3a3a6bb4..0000000000000000000000000000000000000000
--- a/tools/profile_analyzer/profile_analyzer.py
+++ /dev/null
@@ -1,188 +0,0 @@
-#!/usr/bin/env python2.7
-# Copyright 2015, Google Inc.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-#     * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-#     * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-"""
-Read GRPC basic profiles, analyze the data.
-
-Usage:
-  bins/basicprof/qps_smoke_test > log
-  cat log | tools/profile_analyzer/profile_analyzer.py
-"""
-
-
-import collections
-import itertools
-import math
-import re
-
-# Create a regex to parse output of the C core basic profiler,
-# as defined in src/core/profiling/basic_timers.c.
-_RE_LINE = re.compile(r'GRPC_LAT_PROF ' +
-                      r'([0-9]+\.[0-9]+) 0x([0-9a-f]+) ([{}.!]) ([0-9]+) ' +
-                      r'([^ ]+) ([^ ]+) ([0-9]+)')
-
-Entry = collections.namedtuple(
-    'Entry',
-    ['time', 'thread', 'type', 'tag', 'id', 'file', 'line'])
-
-
-class ImportantMark(object):
-  def __init__(self, entry, stack):
-    self._entry = entry
-    self._pre_stack = stack
-    self._post_stack = list()
-    self._n = len(stack)  # we'll also compute times to that many closing }s
-
-  @property
-  def entry(self):
-    return self._entry
-
-  @property
-  def max_depth(self):
-    return self._n
-
-  def append_post_entry(self, post_entry):
-    if self._n > 0 and post_entry.thread == self._entry.thread:
-      self._post_stack.append(post_entry)
-      self._n -= 1
-
-  def get_deltas(self):
-    pre_and_post_stacks = itertools.chain(self._pre_stack, self._post_stack)
-    return collections.OrderedDict((stack_entry,
-                                   abs(self._entry.time - stack_entry.time))
-                                   for stack_entry in pre_and_post_stacks)
-
-
-def print_block_statistics(block_times):
-  print '{:<12s}  {:>12s} {:>12s} {:>12s} {:>12s}'.format(
-          'Block tag', '50th p.', '90th p.', '95th p.', '99th p.')
-  for tag, tag_times in sorted(block_times.iteritems()):
-    times = sorted(tag_times)
-    print '{:<12d}: {:>12.3f} {:>12.3f} {:>12.3f} {:>12.3f}'.format(
-            tag, percentile(times, 50), percentile(times, 90),
-            percentile(times, 95), percentile(times, 99))
-  print
-
-def print_grouped_imark_statistics(group_key, imarks_group):
-  values = collections.OrderedDict()
-  for imark in imarks_group:
-    deltas = imark.get_deltas()
-    for relative_entry, time_delta_us in deltas.iteritems():
-      key = '{tag} {type} ({file}:{line})'.format(**relative_entry._asdict())
-      l = values.setdefault(key, list())
-      l.append(time_delta_us)
-
-  print group_key
-  print '{:<50s}  {:>12s} {:>12s} {:>12s} {:>12s}'.format(
-        'Relative mark', '50th p.', '90th p.', '95th p.', '99th p.')
-  for key, time_values in values.iteritems():
-    time_values = sorted(time_values)
-    print '{:<50s}: {:>12.3f} {:>12.3f} {:>12.3f} {:>12.3f}'.format(
-          key, percentile(time_values, 50), percentile(time_values, 90),
-          percentile(time_values, 95), percentile(time_values, 99))
-  print
-
-def percentile(vals, percent):
-  """ Calculates the interpolated percentile given a sorted sequence and a
-  percent (in the usual 0-100 range)."""
-  assert vals, "Empty input sequence."
-  percent /= 100.0
-  k = (len(vals)-1) * percent
-  f = math.floor(k)
-  c = math.ceil(k)
-  if f == c:
-      return vals[int(k)]
-  # else, interpolate
-  d0 = vals[int(f)] * (c-k)
-  d1 = vals[int(c)] * (k-f)
-  return d0 + d1
-
-def entries(f):
-  for line in f:
-    m = _RE_LINE.match(line)
-    if not m: continue
-    yield Entry(time=float(m.group(1)),
-                thread=m.group(2),
-                type=m.group(3),
-                tag=int(m.group(4)),
-                id=m.group(5),
-                file=m.group(6),
-                line=m.group(7))
-
-def main(f):
-  percentiles = (50, 90, 95, 99)
-  threads = collections.defaultdict(lambda: collections.defaultdict(list))
-  times = collections.defaultdict(list)
-  important_marks = collections.defaultdict(list)
-  stack_depth = collections.defaultdict(int)
-  for entry in entries(f):
-    thread = threads[entry.thread]
-    if entry.type == '{':
-      thread[entry.tag].append(entry)
-      stack_depth[entry.thread] += 1
-    if entry.type == '!':
-      # Save a snapshot of the current stack inside a new ImportantMark instance.
-      # Get all entries _for any tag in the thread_.
-      stack = [e for entries_for_tag in thread.itervalues()
-                 for e in entries_for_tag]
-      imark_group_key = '{tag}/{thread}@{file}:{line}'.format(**entry._asdict())
-      important_marks[imark_group_key].append(ImportantMark(entry, stack))
-    elif entry.type == '}':
-      last = thread[entry.tag].pop()
-      times[entry.tag].append(entry.time - last.time)
-      # only access the last "depth" imarks for the tag.
-      depth = stack_depth[entry.thread]
-      for imarks_group in important_marks.itervalues():
-        for imark in imarks_group[-depth:]:
-          # if at a '}' deeper than where the current "imark" was found, ignore.
-          if depth > imark.max_depth: continue
-          imark.append_post_entry(entry)
-      stack_depth[entry.thread] -= 1
-
-  print
-  print 'Block marks:'
-  print '============'
-  print_block_statistics(times)
-
-  print
-  print 'Important marks:'
-  print '================'
-  for group_key, imarks_group in important_marks.iteritems():
-    print_grouped_imark_statistics(group_key, imarks_group)
-
-
-if __name__ == '__main__':
-  # If invoked without arguments, read off sys.stdin. If one argument is given,
-  # take it as a file name and open it for reading.
-  import sys
-  f = sys.stdin
-  if len(sys.argv) == 2:
-    f = open(sys.argv[1], 'r')
-  main(f)
diff --git a/tools/profiling/latency_profile/profile_analyzer.py b/tools/profiling/latency_profile/profile_analyzer.py
new file mode 100755
index 0000000000000000000000000000000000000000..b12e1074e521b4ca2cb389416fb8beb5cc8fc80b
--- /dev/null
+++ b/tools/profiling/latency_profile/profile_analyzer.py
@@ -0,0 +1,231 @@
+#!/usr/bin/env python2.7
+import argparse
+import collections
+import hashlib
+import itertools
+import json
+import math
+import tabulate
+import time
+
+
+SELF_TIME = object()
+TIME_FROM_SCOPE_START = object()
+TIME_TO_SCOPE_END = object()
+TIME_FROM_STACK_START = object()
+TIME_TO_STACK_END = object()
+
+
+argp = argparse.ArgumentParser(description='Process output of basic_prof builds')
+argp.add_argument('--source', default='latency_trace.txt', type=str)
+argp.add_argument('--fmt', choices=tabulate.tabulate_formats, default='simple')
+args = argp.parse_args()
+
+class LineItem(object):
+
+  def __init__(self, line, indent):
+    self.tag = line['tag']
+    self.indent = indent
+    self.start_time = line['t']
+    self.end_time = None
+    self.important = line['imp']
+    self.filename = line['file']
+    self.fileline = line['line']
+    self.times = {}
+
+
+class ScopeBuilder(object):
+
+  def __init__(self, call_stack_builder, line):
+    self.call_stack_builder = call_stack_builder
+    self.indent = len(call_stack_builder.stk)
+    self.top_line = LineItem(line, self.indent)
+    call_stack_builder.lines.append(self.top_line)
+    self.first_child_pos = len(call_stack_builder.lines)
+
+  def mark(self, line):
+    line_item = LineItem(line, self.indent + 1)
+    line_item.end_time = line_item.start_time
+    self.call_stack_builder.lines.append(line_item)
+
+  def finish(self, line):
+    assert line['tag'] == self.top_line.tag, 'expected %s, got %s' % (self.top_line.tag, line['tag'])
+    final_time_stamp = line['t']
+    assert self.top_line.end_time is None
+    self.top_line.end_time = final_time_stamp
+    assert SELF_TIME not in self.top_line.times
+    self.top_line.times[SELF_TIME] = final_time_stamp - self.top_line.start_time
+    for line in self.call_stack_builder.lines[self.first_child_pos:]:
+      if TIME_FROM_SCOPE_START not in line.times:
+        line.times[TIME_FROM_SCOPE_START] = line.start_time - self.top_line.start_time
+        line.times[TIME_TO_SCOPE_END] = final_time_stamp - line.end_time
+
+
+class CallStackBuilder(object):
+
+  def __init__(self):
+    self.stk = []
+    self.signature = hashlib.md5()
+    self.lines = []
+
+  def finish(self):
+    start_time = self.lines[0].start_time
+    end_time = self.lines[0].end_time
+    self.signature = self.signature.hexdigest()
+    for line in self.lines:
+      line.times[TIME_FROM_STACK_START] = line.start_time - start_time
+      line.times[TIME_TO_STACK_END] = end_time - line.end_time
+
+  def add(self, line):
+    line_type = line['type']
+    self.signature.update(line_type)
+    self.signature.update(line['tag'])
+    if line_type == '{':
+      self.stk.append(ScopeBuilder(self, line))
+      return False
+    elif line_type == '}':
+      self.stk.pop().finish(line)
+      if not self.stk:
+        self.finish()
+        return True
+      return False
+    elif line_type == '.' or line_type == '!':
+      self.stk[-1].mark(line)
+      return False
+    else:
+      raise Exception('Unknown line type: \'%s\'' % line_type)
+
+
+class CallStack(object):
+
+  def __init__(self, initial_call_stack_builder):
+    self.count = 1
+    self.signature = initial_call_stack_builder.signature
+    self.lines = initial_call_stack_builder.lines
+    for line in self.lines:
+      for key, val in line.times.items():
+        line.times[key] = [val]
+
+  def add(self, call_stack_builder):
+    assert self.signature == call_stack_builder.signature
+    self.count += 1
+    assert len(self.lines) == len(call_stack_builder.lines)
+    for lsum, line in itertools.izip(self.lines, call_stack_builder.lines):
+      assert lsum.tag == line.tag
+      assert lsum.times.keys() == line.times.keys()
+      for k, lst in lsum.times.iteritems():
+        lst.append(line.times[k])
+
+  def finish(self):
+    for line in self.lines:
+      for lst in line.times.itervalues():
+        lst.sort()
+
+builder = collections.defaultdict(CallStackBuilder)
+call_stacks = collections.defaultdict(CallStack)
+
+lines = 0
+start = time.time()
+with open(args.source) as f:
+  for line in f:
+    lines += 1
+    inf = json.loads(line)
+    thd = inf['thd']
+    cs = builder[thd]
+    if cs.add(inf):
+      if cs.signature in call_stacks:
+        call_stacks[cs.signature].add(cs)
+      else:
+        call_stacks[cs.signature] = CallStack(cs)
+      del builder[thd]
+time_taken = time.time() - start
+
+call_stacks = sorted(call_stacks.values(), key=lambda cs: cs.count, reverse=True)
+total_stacks = 0
+for cs in call_stacks:
+  total_stacks += cs.count
+  cs.finish()
+
+def percentile(N, percent, key=lambda x:x):
+    """
+    Find the percentile of a list of values.
+
+    @parameter N - is a list of values. Note N MUST BE already sorted.
+    @parameter percent - a float value from 0.0 to 1.0.
+    @parameter key - optional key function to compute value from each element of N.
+
+    @return - the percentile of the values
+    """
+    if not N:
+        return None
+    k = (len(N)-1) * percent
+    f = math.floor(k)
+    c = math.ceil(k)
+    if f == c:
+        return key(N[int(k)])
+    d0 = key(N[int(f)]) * (c-k)
+    d1 = key(N[int(c)]) * (k-f)
+    return d0+d1
+
+def tidy_tag(tag):
+  if tag[0:10] == 'GRPC_PTAG_':
+    return tag[10:]
+  return tag
+
+def time_string(values):
+  num_values = len(values)
+  return '%.1f/%.1f/%.1f' % (
+      1e6 * percentile(values, 0.5),
+      1e6 * percentile(values, 0.9),
+      1e6 * percentile(values, 0.99))
+
+def time_format(idx):
+  def ent(line, idx=idx):
+    if idx in line.times:
+      return time_string(line.times[idx])
+    return ''
+  return ent
+
+FORMAT = [
+  ('TAG', lambda line: '..'*line.indent + tidy_tag(line.tag)),
+  ('LOC', lambda line: '%s:%d' % (line.filename[line.filename.rfind('/')+1:], line.fileline)),
+  ('FROM_STACK_START', time_format(TIME_FROM_STACK_START)),
+  ('SELF', time_format(SELF_TIME)),
+  ('TO_STACK_END', time_format(TIME_TO_STACK_END)),
+  ('FROM_SCOPE_START', time_format(TIME_FROM_SCOPE_START)),
+  ('SELF', time_format(SELF_TIME)),
+  ('TO_SCOPE_END', time_format(TIME_TO_SCOPE_END)),
+]
+
+BANNER = {
+    'simple': 'Count: %(count)d',
+    'html': '<h1>Count: %(count)d</h1>'
+}
+
+if args.fmt == 'html':
+  print '<html>'
+  print '<head>'
+  print '<title>Profile Report</title>'
+  print '</head>'
+
+accounted_for = 0
+for cs in call_stacks:
+  if args.fmt in BANNER:
+    print BANNER[args.fmt] % {
+        'count': cs.count,
+    }
+  header, _ = zip(*FORMAT)
+  table = []
+  for line in cs.lines:
+    fields = []
+    for _, fn in FORMAT:
+      fields.append(fn(line))
+    table.append(fields)
+  print tabulate.tabulate(table, header, tablefmt=args.fmt)
+  accounted_for += cs.count
+  if accounted_for > .99 * total_stacks:
+    break
+
+if args.fmt == 'html':
+  print '</html>'
+
diff --git a/tools/profiling/latency_profile/run_latency_profile.sh b/tools/profiling/latency_profile/run_latency_profile.sh
new file mode 100755
index 0000000000000000000000000000000000000000..41686be56069235f4c4a9e00f439de9f21a56e59
--- /dev/null
+++ b/tools/profiling/latency_profile/run_latency_profile.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+set -ex
+
+cd $(dirname $0)/../../..
+
+BINS="sync_unary_ping_pong_test sync_streaming_ping_pong_test"
+CPUS=`python -c 'import multiprocessing; print multiprocessing.cpu_count()'`
+
+make CONFIG=basicprof -j$CPUS $BINS
+
+mkdir -p reports
+
+echo '<html><head></head><body>' > reports/index.html
+for bin in $BINS
+do
+  bins/basicprof/$bin
+  mv latency_trace.txt $bin.trace
+  echo "<a href='$bin.txt'>$bin</a><br/>" >> reports/index.html
+done
+for bin in $BINS
+do
+  tools/profiling/latency_profile/profile_analyzer.py \
+    --source=$bin.trace --fmt=simple > reports/$bin.txt &
+done
+echo '</body></html>' >> reports/index.html
+
+wait
+
diff --git a/tools/run_tests/build_csharp.sh b/tools/run_tests/build_csharp.sh
index eae7bd50405aa37fbacbda8bfe62a4efdc87d931..6737d88b273fa577083d535442bc70a53ebca3c5 100755
--- a/tools/run_tests/build_csharp.sh
+++ b/tools/run_tests/build_csharp.sh
@@ -37,14 +37,6 @@ else
   MSBUILD_CONFIG="Release"
 fi
 
-# change to gRPC repo root
-cd $(dirname $0)/../..
+cd $(dirname $0)/../../src/csharp
 
-root=`pwd`
-
-if [ -n "$NUGET" ]
-then
-  $NUGET restore src/csharp/Grpc.sln
-fi
-
-xbuild /p:Configuration=$MSBUILD_CONFIG src/csharp/Grpc.sln
+xbuild /p:Configuration=$MSBUILD_CONFIG Grpc.sln
diff --git a/tools/run_tests/build_node.sh b/tools/run_tests/build_node.sh
index 95ffb94c6eada11b03a3eb68024136a0085b6ca3..faa7b624b8e44e8a7e62cc4fd6aa48944f7f4877 100755
--- a/tools/run_tests/build_node.sh
+++ b/tools/run_tests/build_node.sh
@@ -36,9 +36,4 @@ CONFIG=${CONFIG:-opt}
 # change to grpc repo root
 cd $(dirname $0)/../..
 
-export CXXFLAGS=-I`pwd`/include
-export LDFLAGS=-L`pwd`/libs/$CONFIG
-
-cd src/node
-
 npm install --unsafe-perm
diff --git a/tools/run_tests/build_python.sh b/tools/run_tests/build_python.sh
index 2efc2c714d09eaed0eba5509ab405c51e9feae42..24cf6ba7c88e5222afd8a73fe72e1078536dc663 100755
--- a/tools/run_tests/build_python.sh
+++ b/tools/run_tests/build_python.sh
@@ -39,6 +39,33 @@ GRPCIO=$ROOT/src/python/grpcio
 GRPCIO_TEST=$ROOT/src/python/grpcio_test
 GRPCIO_HEALTH_CHECKING=$ROOT/src/python/grpcio_health_checking
 
+install_grpcio_deps() {
+  cd $GRPCIO
+  pip install -r requirements.txt
+}
+install_grpcio_test_deps() {
+  cd $GRPCIO_TEST
+  pip install -r requirements.txt
+}
+
+install_grpcio() {
+  CFLAGS="-I$ROOT/include -std=c89" LDFLAGS=-L$ROOT/libs/$CONFIG GRPC_PYTHON_BUILD_WITH_CYTHON=1 pip install $GRPCIO
+}
+install_grpcio_test() {
+  pip install $GRPCIO_TEST
+}
+install_grpcio_health_checking() {
+  pip install $GRPCIO_HEALTH_CHECKING
+}
+
+# Cleans the environment of previous installations
+clean_grpcio_all() {
+  (yes | pip uninstall grpcio) || true
+  (yes | pip uninstall grpcio_test) || true
+  (yes | pip uninstall grpcio_health_checking) || true
+}
+
+# Builds the testing environment.
 make_virtualenv() {
   virtualenv_name="python"$1"_virtual_environment"
   if [ ! -d $virtualenv_name ]
@@ -48,33 +75,29 @@ make_virtualenv() {
     source $virtualenv_name/bin/activate
 
     # Install grpcio
-    cd $GRPCIO
-    pip install -r requirements.txt
-    CFLAGS="-I$ROOT/include -std=c89" LDFLAGS=-L$ROOT/libs/$CONFIG GRPC_PYTHON_BUILD_WITH_CYTHON=1 pip install $GRPCIO
+    install_grpcio_deps
+    install_grpcio
 
     # Install grpcio_test
-    cd $GRPCIO_TEST
-    pip install -r requirements.txt
-    pip install $GRPCIO_TEST
+    install_grpcio_test_deps
+    install_grpcio_test
 
     # Install grpcio_health_checking
-    pip install $GRPCIO_HEALTH_CHECKING
+    install_grpcio_health_checking
   else
     source $virtualenv_name/bin/activate
     # Uninstall and re-install the packages we care about. Don't use
     # --force-reinstall or --ignore-installed to avoid propagating this
     # unnecessarily to dependencies. Don't use --no-deps to avoid missing
     # dependency upgrades.
-    (yes | pip uninstall grpcio) || true
-    (yes | pip uninstall grpcio_test) || true
-    (yes | pip uninstall grpcio_health_checking) || true
-    (CFLAGS="-I$ROOT/include -std=c89" LDFLAGS=-L$ROOT/libs/$CONFIG GRPC_PYTHON_BUILD_WITH_CYTHON=1 pip install $GRPCIO) || (
+    clean_grpcio_all
+    install_grpcio || (
       # Fall back to rebuilding the entire environment
       rm -rf $virtualenv_name
       make_virtualenv $1
     )
-    pip install $GRPCIO_TEST
-    pip install $GRPCIO_HEALTH_CHECKING
+    install_grpcio_test
+    install_grpcio_health_checking
   fi
 }
 
diff --git a/tools/run_tests/build_ruby.sh b/tools/run_tests/build_ruby.sh
index 259f336ef225763a40da5d3b57dae65fd2de2ca6..6d23c316c5ad1e8781d4685ff34a82d6005104a3 100755
--- a/tools/run_tests/build_ruby.sh
+++ b/tools/run_tests/build_ruby.sh
@@ -37,6 +37,4 @@ export GRPC_CONFIG=${CONFIG:-opt}
 cd $(dirname $0)/../../src/ruby
 
 rm -rf ./tmp
-
-bundle install
 rake compile:grpc
diff --git a/tools/run_tests/dockerjob.py b/tools/run_tests/dockerjob.py
index 11686d46b09ed8267a157d216ae1b671e28bcb47..1d67fe3033e2d0880fedb512cc96ff0dbeaaf80f 100755
--- a/tools/run_tests/dockerjob.py
+++ b/tools/run_tests/dockerjob.py
@@ -38,24 +38,32 @@ import subprocess
 
 _DEVNULL = open(os.devnull, 'w')
 
-def wait_for_file(filepath, timeout_seconds=15):
-  """Wait until given file exists and returns its content."""
-  started = time.time()
-  while time.time() - started < timeout_seconds:
-    if os.path.isfile(filepath):
-      with open(filepath, 'r') as f:
-        content = f.read()
-        # make sure we don't return empty content
-        if content:
-          return content
-    time.sleep(1)
-  raise Exception('Failed to read file %s.' % filepath)
+
+def random_name(base_name):
+  """Randomizes given base name."""
+  return '%s_%s' % (base_name, uuid.uuid4())
+
+
+def docker_kill(cid):
+  """Kills a docker container. Returns True if successful."""
+  return subprocess.call(['docker','kill', str(cid)],
+                         stdout=_DEVNULL,
+                         stderr=subprocess.STDOUT) == 0
 
 
-def docker_mapped_port(cid, port):
+def docker_mapped_port(cid, port, timeout_seconds=15):
   """Get port mapped to internal given internal port for given container."""
-  output = subprocess.check_output('docker port %s %s' % (cid, port), shell=True)
-  return int(output.split(':', 2)[1])
+  started = time.time()
+  while time.time() - started < timeout_seconds:
+    try:
+      output = subprocess.check_output('docker port %s %s' % (cid, port),
+                                       stderr=_DEVNULL,
+                                       shell=True)
+      return int(output.split(':', 2)[1])
+    except subprocess.CalledProcessError as e:
+      pass
+  raise Exception('Failed to get exposed port %s for container %s.' %
+                  (port, cid))
 
 
 def finish_jobs(jobs):
@@ -71,7 +79,7 @@ def image_exists(image):
   """Returns True if given docker image exists."""
   return subprocess.call(['docker','inspect', image],
                          stdout=_DEVNULL,
-                         stderr=_DEVNULL) == 0
+                         stderr=subprocess.STDOUT) == 0
 
 
 def remove_image(image, skip_nonexistent=False, max_retries=10):
@@ -79,7 +87,9 @@ def remove_image(image, skip_nonexistent=False, max_retries=10):
   if skip_nonexistent and not image_exists(image):
     return True
   for attempt in range(0, max_retries):
-    if subprocess.call(['docker','rmi', '-f', image]) == 0:
+    if subprocess.call(['docker','rmi', '-f', image],
+                       stdout=_DEVNULL,
+                       stderr=subprocess.STDOUT) == 0:
       return True
     time.sleep(2)
   print 'Failed to remove docker image %s' % image
@@ -92,23 +102,16 @@ class DockerJob:
   def __init__(self, spec):
     self._spec = spec
     self._job = jobset.Job(spec, bin_hash=None, newline_on_success=True, travis=True, add_env={}, xml_report=None)
-    self._cidfile = spec.cidfile
-    self._cid = None
-
-  def cid(self):
-    """Gets cid of this container"""
-    if not self._cid:
-      self._cid = wait_for_file(self._cidfile)
-    return self._cid
+    self._container_name = spec.container_name
 
   def mapped_port(self, port):
-    return docker_mapped_port(self.cid(), port)
+    return docker_mapped_port(self._container_name, port)
 
   def kill(self, suppress_failure=False):
     """Sends kill signal to the container."""
     if suppress_failure:
       self._job.suppress_failure_message()
-    return subprocess.call(['docker','kill', self.cid()]) == 0
+    return docker_kill(self._container_name)
 
   def is_running(self):
     """Polls a job and returns True if given job is still running."""
diff --git a/tools/run_tests/jobset.py b/tools/run_tests/jobset.py
index 87be703b4cdfa6d1a3b859db603801b32a461717..17a63c02e8413a2c2c04fcd6b959afb6cded0fd6 100755
--- a/tools/run_tests/jobset.py
+++ b/tools/run_tests/jobset.py
@@ -135,13 +135,14 @@ class JobSpec(object):
 
   def __init__(self, cmdline, shortname=None, environ=None, hash_targets=None,
                cwd=None, shell=False, timeout_seconds=5*60, flake_retries=0,
-               timeout_retries=0):
+               timeout_retries=0, kill_handler=None):
     """
     Arguments:
       cmdline: a list of arguments to pass as the command line
       environ: a dictionary of environment variables to set in the child process
       hash_targets: which files to include in the hash representing the jobs version
                     (or empty, indicating the job should not be hashed)
+      kill_handler: a handler that will be called whenever job.kill() is invoked
     """
     if environ is None:
       environ = {}
@@ -156,6 +157,7 @@ class JobSpec(object):
     self.timeout_seconds = timeout_seconds
     self.flake_retries = flake_retries
     self.timeout_retries = timeout_retries
+    self.kill_handler = kill_handler
 
   def identity(self):
     return '%r %r %r' % (self.cmdline, self.environ, self.hash_targets)
@@ -254,6 +256,8 @@ class Job(object):
   def kill(self):
     if self._state == _RUNNING:
       self._state = _KILLED
+      if self._spec.kill_handler:
+        self._spec.kill_handler(self)
       self._process.terminate()
 
   def suppress_failure_message(self):
diff --git a/tools/run_tests/port_server.py b/tools/run_tests/port_server.py
index 48b6214b9589260ce0e3c6f7b4029cf2e3e47f5a..3b85486ebfe599732f38f1db2756db9b03edc2e4 100755
--- a/tools/run_tests/port_server.py
+++ b/tools/run_tests/port_server.py
@@ -38,18 +38,35 @@ import socket
 import sys
 import time
 
+
+# increment this number whenever making a change to ensure that
+# the changes are picked up by running CI servers
+# note that all changes must be backwards compatible
+_MY_VERSION = 5
+
+
+if len(sys.argv) == 2 and sys.argv[1] == 'dump_version':
+  print _MY_VERSION
+  sys.exit(0)
+
+
 argp = argparse.ArgumentParser(description='Server for httpcli_test')
 argp.add_argument('-p', '--port', default=12345, type=int)
+argp.add_argument('-l', '--logfile', default=None, type=str)
 args = argp.parse_args()
 
+if args.logfile is not None:
+  sys.stdin.close()
+  sys.stderr.close()
+  sys.stdout.close()
+  sys.stderr = open(args.logfile, 'w')
+  sys.stdout = sys.stderr
+
 print 'port server running on port %d' % args.port
 
 pool = []
 in_use = {}
 
-with open(__file__) as f:
-  _MY_VERSION = hashlib.sha1(f.read()).hexdigest()
-
 
 def refill_pool(max_timeout, req):
   """Scan for ports not marked for being in use"""
@@ -110,10 +127,13 @@ class Handler(BaseHTTPServer.BaseHTTPRequestHandler):
       self.send_header('Content-Type', 'text/plain')
       self.end_headers()
       p = int(self.path[6:])
-      del in_use[p]
-      pool.append(p)
-      self.log_message('drop port %d' % p)
-    elif self.path == '/version':
+      if p in in_use:
+        del in_use[p]
+        pool.append(p)
+        self.log_message('drop known port %d' % p)
+      else:
+        self.log_message('drop unknown port %d' % p)
+    elif self.path == '/version_number':
       # fetch a version string and the current process pid
       self.send_response(200)
       self.send_header('Content-Type', 'text/plain')
@@ -128,7 +148,7 @@ class Handler(BaseHTTPServer.BaseHTTPRequestHandler):
       self.end_headers()
       now = time.time()
       self.wfile.write(yaml.dump({'pool': pool, 'in_use': dict((k, now - v) for k, v in in_use.iteritems())}))
-    elif self.path == '/quit':
+    elif self.path == '/quitquitquit':
       self.send_response(200)
       self.end_headers()
       keep_running = False
@@ -137,6 +157,6 @@ class Handler(BaseHTTPServer.BaseHTTPRequestHandler):
 httpd = BaseHTTPServer.HTTPServer(('', args.port), Handler)
 while keep_running:
   httpd.handle_request()
+  sys.stderr.flush()
 
 print 'done'
-
diff --git a/tools/run_tests/post_tests_c.sh b/tools/run_tests/post_tests_c.sh
new file mode 100755
index 0000000000000000000000000000000000000000..f2f3ce9432df6493e1a94dce45331615de4ea618
--- /dev/null
+++ b/tools/run_tests/post_tests_c.sh
@@ -0,0 +1,41 @@
+#!/bin/bash
+# Copyright 2015, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+set -ex
+
+if [ "$CONFIG" != "gcov" ] ; then exit ; fi
+
+root=$(readlink -f $(dirname $0)/../..)
+out=$root/reports/c_cxx_coverage
+tmp=$(mktemp)
+cd $root
+lcov --capture --directory . --output-file $tmp
+genhtml $tmp --output-directory $out
+rm $tmp
diff --git a/tools/run_tests/pre_build_c.bat b/tools/run_tests/pre_build_c.bat
new file mode 100644
index 0000000000000000000000000000000000000000..f0449f3c424af08e7a2c01ed2f215fc4033db451
--- /dev/null
+++ b/tools/run_tests/pre_build_c.bat
@@ -0,0 +1,21 @@
+@rem Performs nuget restore step for C/C++.
+
+setlocal
+
+@rem enter repo root
+cd /d %~dp0\..\..
+
+@rem Location of nuget.exe
+set NUGET=C:\nuget\nuget.exe
+
+if exist %NUGET% (
+  %NUGET% restore vsprojects/grpc.sln || goto :error
+)
+
+endlocal
+
+goto :EOF
+
+:error
+echo Failed!
+exit /b %errorlevel%
diff --git a/tools/run_tests/pre_build_csharp.bat b/tools/run_tests/pre_build_csharp.bat
new file mode 100644
index 0000000000000000000000000000000000000000..853a8f4325542c6529013912556c9ed22ae5d1bd
--- /dev/null
+++ b/tools/run_tests/pre_build_csharp.bat
@@ -0,0 +1,22 @@
+@rem Performs nuget restore step for C#.
+
+setlocal
+
+@rem enter repo root
+cd /d %~dp0\..\..
+
+@rem Location of nuget.exe
+set NUGET=C:\nuget\nuget.exe
+
+if exist %NUGET% (
+  %NUGET% restore vsprojects/grpc_csharp_ext.sln || goto :error
+  %NUGET% restore src/csharp/Grpc.sln || goto :error
+)
+
+endlocal
+
+goto :EOF
+
+:error
+echo Failed!
+exit /b %errorlevel%
diff --git a/tools/run_tests/pre_build_csharp.sh b/tools/run_tests/pre_build_csharp.sh
new file mode 100755
index 0000000000000000000000000000000000000000..42ff60bea220f38f4a8ee0c30f71ddf94d0a0125
--- /dev/null
+++ b/tools/run_tests/pre_build_csharp.sh
@@ -0,0 +1,41 @@
+#!/bin/bash
+# Copyright 2015, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+set -ex
+
+# cd to gRPC csharp directory
+cd $(dirname $0)/../../src/csharp
+
+root=`pwd`
+
+if [ -n "$NUGET" ]
+then
+  $NUGET restore Grpc.sln
+fi
diff --git a/tools/run_tests/pre_build_ruby.sh b/tools/run_tests/pre_build_ruby.sh
new file mode 100755
index 0000000000000000000000000000000000000000..569a1d0333b8876dfca778bd3c1c90dad23d6c5d
--- /dev/null
+++ b/tools/run_tests/pre_build_ruby.sh
@@ -0,0 +1,39 @@
+#!/bin/bash
+
+# Copyright 2015, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+set -ex
+
+export GRPC_CONFIG=${CONFIG:-opt}
+
+# change to grpc's ruby directory
+cd $(dirname $0)/../../src/ruby
+
+bundle install
diff --git a/tools/run_tests/run_interop_tests.py b/tools/run_tests/run_interop_tests.py
index f0935fb5d6140194f9905ba236fa3ba4a9886517..6daa967bba488f01f0e8a589a205aa72a3c079ce 100755
--- a/tools/run_tests/run_interop_tests.py
+++ b/tools/run_tests/run_interop_tests.py
@@ -62,7 +62,6 @@ _CLOUD_TO_CLOUD_BASE_ARGS = [
 _SSL_CERT_ENV = { 'SSL_CERT_FILE':'/usr/local/share/grpc/roots.pem' }
 
 # TODO(jtattermusch) unify usage of --use_tls and --use_tls=true
-# TODO(jtattermusch) unify usage of --use_prod_roots and --use_test_ca
 # TODO(jtattermusch) go uses --tls_ca_file instead of --use_test_ca
 
 
@@ -72,17 +71,18 @@ class CXXLanguage:
     self.client_cmdline_base = ['bins/opt/interop_client']
     self.client_cwd = None
     self.server_cwd = None
+    self.safename = 'cxx'
 
   def cloud_to_prod_args(self):
     return (self.client_cmdline_base + _CLOUD_TO_PROD_BASE_ARGS +
-            ['--use_tls=true','--use_prod_roots'])
+            ['--use_tls=true'])
 
   def cloud_to_cloud_args(self):
     return (self.client_cmdline_base + _CLOUD_TO_CLOUD_BASE_ARGS +
-            ['--use_tls=true'])
+            ['--use_tls=true', '--use_test_ca=true'])
 
   def cloud_to_prod_env(self):
-    return None
+    return {}
 
   def server_args(self):
     return ['bins/opt/interop_server', '--use_tls=true']
@@ -97,20 +97,21 @@ class CSharpLanguage:
     self.client_cmdline_base = ['mono', 'Grpc.IntegrationTesting.Client.exe']
     self.client_cwd = 'src/csharp/Grpc.IntegrationTesting.Client/bin/Debug'
     self.server_cwd = 'src/csharp/Grpc.IntegrationTesting.Server/bin/Debug'
+    self.safename = str(self)
 
   def cloud_to_prod_args(self):
     return (self.client_cmdline_base + _CLOUD_TO_PROD_BASE_ARGS +
-            ['--use_tls'])
+            ['--use_tls=true'])
 
   def cloud_to_cloud_args(self):
     return (self.client_cmdline_base + _CLOUD_TO_CLOUD_BASE_ARGS +
-            ['--use_tls', '--use_test_ca'])
+            ['--use_tls=true', '--use_test_ca=true'])
 
   def cloud_to_prod_env(self):
     return _SSL_CERT_ENV
 
   def server_args(self):
-    return ['mono', 'Grpc.IntegrationTesting.Server.exe', '--use_tls']
+    return ['mono', 'Grpc.IntegrationTesting.Server.exe', '--use_tls=true']
 
   def __str__(self):
     return 'csharp'
@@ -122,6 +123,7 @@ class JavaLanguage:
     self.client_cmdline_base = ['./run-test-client.sh']
     self.client_cwd = '../grpc-java'
     self.server_cwd = '../grpc-java'
+    self.safename = str(self)
 
   def cloud_to_prod_args(self):
     return (self.client_cmdline_base + _CLOUD_TO_PROD_BASE_ARGS +
@@ -132,7 +134,7 @@ class JavaLanguage:
             ['--use_tls=true', '--use_test_ca=true'])
 
   def cloud_to_prod_env(self):
-    return None
+    return {}
 
   def server_args(self):
     return ['./run-test-server.sh', '--use_tls=true']
@@ -148,6 +150,7 @@ class GoLanguage:
     # TODO: this relies on running inside docker
     self.client_cwd = '/go/src/google.golang.org/grpc/interop/client'
     self.server_cwd = '/go/src/google.golang.org/grpc/interop/server'
+    self.safename = str(self)
 
   def cloud_to_prod_args(self):
     return (self.client_cmdline_base + _CLOUD_TO_PROD_BASE_ARGS +
@@ -158,7 +161,7 @@ class GoLanguage:
             ['--use_tls=true'])
 
   def cloud_to_prod_env(self):
-    return None
+    return {}
 
   def server_args(self):
     return ['go', 'run', 'server.go', '--use_tls=true']
@@ -173,6 +176,7 @@ class NodeLanguage:
     self.client_cmdline_base = ['node', 'src/node/interop/interop_client.js']
     self.client_cwd = None
     self.server_cwd = None
+    self.safename = str(self)
 
   def cloud_to_prod_args(self):
     return (self.client_cmdline_base + _CLOUD_TO_PROD_BASE_ARGS +
@@ -197,6 +201,7 @@ class PHPLanguage:
   def __init__(self):
     self.client_cmdline_base = ['src/php/bin/interop_client.sh']
     self.client_cwd = None
+    self.safename = str(self)
 
   def cloud_to_prod_args(self):
     return (self.client_cmdline_base + _CLOUD_TO_PROD_BASE_ARGS +
@@ -219,6 +224,7 @@ class RubyLanguage:
     self.client_cmdline_base = ['ruby', 'src/ruby/bin/interop/interop_client.rb']
     self.client_cwd = None
     self.server_cwd = None
+    self.safename = str(self)
 
   def cloud_to_prod_args(self):
     return (self.client_cmdline_base + _CLOUD_TO_PROD_BASE_ARGS +
@@ -250,16 +256,16 @@ _LANGUAGES = {
 }
 
 # languages supported as cloud_to_cloud servers
-# TODO(jtattermusch): enable other languages as servers as well
-_SERVERS = ['c++', 'node', 'csharp', 'java', 'go']
+_SERVERS = ['c++', 'node', 'csharp', 'java', 'go', 'ruby']
 
-# TODO(jtattermusch): add empty_stream once PHP starts supporting it.
 # TODO(jtattermusch): add timeout_on_sleeping_server once java starts supporting it.
-# TODO(jtattermusch): add support for auth tests.
 _TEST_CASES = ['large_unary', 'empty_unary', 'ping_pong',
-               'client_streaming', 'server_streaming',
+               'empty_stream', 'client_streaming', 'server_streaming',
                'cancel_after_begin', 'cancel_after_first_response']
 
+_AUTH_TEST_CASES = ['compute_engine_creds', 'jwt_token_creds',
+                    'oauth2_auth_token', 'per_rpc_creds']
+
 
 def docker_run_cmdline(cmdline, image, docker_args=[], cwd=None, environ=None):
   """Wraps given cmdline array to create 'docker run' cmdline from it."""
@@ -288,25 +294,75 @@ def bash_login_cmdline(cmdline):
   return ['bash', '-l', '-c', ' '.join(cmdline)]
 
 
-def cloud_to_prod_jobspec(language, test_case, docker_image=None):
+def add_auth_options(language, test_case, cmdline, env):
+  """Returns (cmdline, env) tuple with cloud_to_prod_auth test options."""
+
+  language = str(language)
+  cmdline = list(cmdline)
+  env = env.copy()
+
+  # TODO(jtattermusch): this file path only works inside docker
+  key_filepath = '/root/service_account/stubbyCloudTestingTest-ee3fce360ac5.json'
+  oauth_scope_arg = '--oauth_scope=https://www.googleapis.com/auth/xapi.zoo'
+  key_file_arg = '--service_account_key_file=%s' % key_filepath
+  default_account_arg = '--default_service_account=830293263384-compute@developer.gserviceaccount.com'
+
+  if test_case in ['jwt_token_creds', 'per_rpc_creds', 'oauth2_auth_token']:
+    if language in ['csharp', 'node', 'php', 'ruby']:
+      env['GOOGLE_APPLICATION_CREDENTIALS'] = key_filepath
+    else:
+      cmdline += [key_file_arg]
+
+  if test_case in ['per_rpc_creds', 'oauth2_auth_token']:
+    cmdline += [oauth_scope_arg]
+
+  if test_case == 'oauth2_auth_token' and language == 'c++':
+    # C++ oauth2 test uses GCE creds and thus needs to know the default account
+    cmdline += [default_account_arg]
+
+  if test_case == 'compute_engine_creds':
+    cmdline += [oauth_scope_arg, default_account_arg]
+
+  return (cmdline, env)
+
+
+def _job_kill_handler(job):
+  if job._spec.container_name:
+    dockerjob.docker_kill(job._spec.container_name)
+
+
+def cloud_to_prod_jobspec(language, test_case, docker_image=None, auth=False):
   """Creates jobspec for cloud-to-prod interop test"""
-  cmdline = bash_login_cmdline(language.cloud_to_prod_args() +
-                               ['--test_case=%s' % test_case])
+  cmdline = language.cloud_to_prod_args() + ['--test_case=%s' % test_case]
   cwd = language.client_cwd
   environ = language.cloud_to_prod_env()
+  container_name = None
+  if auth:
+    cmdline, environ = add_auth_options(language, test_case, cmdline, environ)
+  cmdline = bash_login_cmdline(cmdline)
+
   if docker_image:
-    cmdline = docker_run_cmdline(cmdline, image=docker_image, cwd=cwd, environ=environ)
+    container_name = dockerjob.random_name('interop_client_%s' % language.safename)
+    cmdline = docker_run_cmdline(cmdline,
+                                 image=docker_image,
+                                 cwd=cwd,
+                                 environ=environ,
+                                 docker_args=['--net=host',
+                                              '--name', container_name])
     cwd = None
     environ = None
 
+  suite_name='cloud_to_prod_auth' if auth else 'cloud_to_prod'
   test_job = jobset.JobSpec(
           cmdline=cmdline,
           cwd=cwd,
           environ=environ,
-          shortname="cloud_to_prod:%s:%s" % (language, test_case),
+          shortname="%s:%s:%s" % (suite_name, language, test_case),
           timeout_seconds=2*60,
           flake_retries=5 if args.allow_flakes else 0,
-          timeout_retries=2 if args.allow_flakes else 0)
+          timeout_retries=2 if args.allow_flakes else 0,
+          kill_handler=_job_kill_handler)
+  test_job.container_name = container_name
   return test_job
 
 
@@ -319,11 +375,14 @@ def cloud_to_cloud_jobspec(language, test_case, server_name, server_host,
                                 '--server_port=%s' % server_port ])
   cwd = language.client_cwd
   if docker_image:
+    container_name = dockerjob.random_name('interop_client_%s' % language.safename)
     cmdline = docker_run_cmdline(cmdline,
                                  image=docker_image,
                                  cwd=cwd,
-                                 docker_args=['--net=host'])
+                                 docker_args=['--net=host',
+                                              '--name', container_name])
     cwd = None
+
   test_job = jobset.JobSpec(
           cmdline=cmdline,
           cwd=cwd,
@@ -331,34 +390,36 @@ def cloud_to_cloud_jobspec(language, test_case, server_name, server_host,
                                                  test_case),
           timeout_seconds=2*60,
           flake_retries=5 if args.allow_flakes else 0,
-          timeout_retries=2 if args.allow_flakes else 0)
+          timeout_retries=2 if args.allow_flakes else 0,
+          kill_handler=_job_kill_handler)
+  test_job.container_name = container_name
   return test_job
 
 
 def server_jobspec(language, docker_image):
   """Create jobspec for running a server"""
-  cidfile = tempfile.mktemp()
+  container_name = dockerjob.random_name('interop_server_%s' % language.safename)
   cmdline = bash_login_cmdline(language.server_args() +
                                ['--port=%s' % _DEFAULT_SERVER_PORT])
   docker_cmdline = docker_run_cmdline(cmdline,
                                       image=docker_image,
                                       cwd=language.server_cwd,
                                       docker_args=['-p', str(_DEFAULT_SERVER_PORT),
-                                                   '--cidfile', cidfile])
+                                                   '--name', container_name])
   server_job = jobset.JobSpec(
           cmdline=docker_cmdline,
-          shortname="interop_server:%s" % language,
+          shortname="interop_server_%s" % language,
           timeout_seconds=30*60)
-  server_job.cidfile = cidfile
+  server_job.container_name = container_name
   return server_job
 
 
 def build_interop_image_jobspec(language, tag=None):
   """Creates jobspec for building interop docker image for a language"""
-  safelang = str(language).replace("+", "x")
   if not tag:
-    tag = 'grpc_interop_%s:%s' % (safelang, uuid.uuid4())
-  env = {'INTEROP_IMAGE': tag, 'BASE_NAME': 'grpc_interop_%s' % safelang}
+    tag = 'grpc_interop_%s:%s' % (language.safename, uuid.uuid4())
+  env = {'INTEROP_IMAGE': tag,
+         'BASE_NAME': 'grpc_interop_%s' % language.safename}
   if not args.travis:
     env['TTY_FLAG'] = '-t'
   build_job = jobset.JobSpec(
@@ -382,6 +443,11 @@ argp.add_argument('--cloud_to_prod',
                   action='store_const',
                   const=True,
                   help='Run cloud_to_prod tests.')
+argp.add_argument('--cloud_to_prod_auth',
+                  default=False,
+                  action='store_const',
+                  const=True,
+                  help='Run cloud_to_prod_auth tests.')
 argp.add_argument('-s', '--server',
                   choices=['all'] + sorted(_SERVERS),
                   action='append',
@@ -476,6 +542,14 @@ try:
                                          docker_image=docker_images.get(str(language)))
         jobs.append(test_job)
 
+  if args.cloud_to_prod_auth:
+    for language in languages:
+      for test_case in _AUTH_TEST_CASES:
+        test_job = cloud_to_prod_jobspec(language, test_case,
+                                         docker_image=docker_images.get(str(language)),
+                                         auth=True)
+        jobs.append(test_job)
+
   for server in args.override_server:
     server_name = server[0]
     (server_host, server_port) = server[1].split(':')
diff --git a/tools/run_tests/run_lcov.sh b/tools/run_tests/run_lcov.sh
index 69b1de6b8973b7ca81712571dc695aaa9699824d..a28ec138bb606a2365cfa1e67505b1a4847b4890 100755
--- a/tools/run_tests/run_lcov.sh
+++ b/tools/run_tests/run_lcov.sh
@@ -30,10 +30,10 @@
 
 set -ex
 
-out=`realpath ${1:-coverage}`
+out=$(readlink -f ${1:-coverage})
 
-root=`realpath $(dirname $0)/../..`
-tmp=`mktemp`
+root=$(readlink -f $(dirname $0)/../..)
+tmp=$(mktemp)
 cd $root
 tools/run_tests/run_tests.py -c gcov -l c c++ || true
 lcov --capture --directory . --output-file $tmp
diff --git a/tools/run_tests/run_node.sh b/tools/run_tests/run_node.sh
index e322ab1995a40c711af632dd6348ee1343917dec..0a11e87c37a7cfd023ae93cf84f3c0a60a4abde9 100755
--- a/tools/run_tests/run_node.sh
+++ b/tools/run_tests/run_node.sh
@@ -37,19 +37,17 @@ cd $(dirname $0)/../..
 
 root=`pwd`
 
-cd $root/src/node
-
-export LD_LIBRARY_PATH=$root/libs/$CONFIG
-
 if [ "$CONFIG" = "gcov" ]
 then
-  ./node_modules/.bin/istanbul cover --dir ../../reports/node_coverage \
-    ./node_modules/.bin/_mocha -- --timeout 8000
+  ./node_modules/.bin/istanbul cover --dir reports/node_coverage \
+    ./node_modules/.bin/_mocha -- --timeout 8000 src/node/test
   cd build
   gcov Release/obj.target/grpc/ext/*.o
   lcov --base-directory . --directory . -c -o coverage.info
-  genhtml -o ../../../reports/node_ext_coverage --num-spaces 2 \
+  genhtml -o ../reports/node_ext_coverage --num-spaces 2 \
     -t 'Node gRPC test coverage' coverage.info
+  echo '<html><head><meta http-equiv="refresh" content="0;URL=lcov-report/index.html"></head></html>' > \
+    ../reports/node_coverage/index.html
 else
-  ./node_modules/mocha/bin/mocha --timeout 8000
+  ./node_modules/mocha/bin/mocha --timeout 8000 src/node/test
 fi
diff --git a/tools/run_tests/run_python.sh b/tools/run_tests/run_python.sh
index e2135be04c563da4c9c971725b080ea967ea2442..848775e9b199e7c55361424a6f91c763785c85a3 100755
--- a/tools/run_tests/run_python.sh
+++ b/tools/run_tests/run_python.sh
@@ -40,4 +40,4 @@ export DYLD_LIBRARY_PATH=$ROOT/libs/$CONFIG
 export PATH=$ROOT/bins/$CONFIG:$ROOT/bins/$CONFIG/protobuf:$PATH
 source "python"$PYVER"_virtual_environment"/bin/activate
 
-"python"$PYVER $GRPCIO_TEST/setup.py test -a "-n8 --cov=grpc --junitxml=./report.xml --timeout=300"
+"python"$PYVER $GRPCIO_TEST/setup.py test -a "-n8 --cov=grpc --junitxml=./report.xml --timeout=300 -v --boxed --timeout_method=thread"
diff --git a/tools/run_tests/run_tests.py b/tools/run_tests/run_tests.py
index 6764586897ae9fd43be19ad9c6f4cb8ce430c928..ff8ad8ff784616bfb282589702f6e2f5a5a6a4fa 100755
--- a/tools/run_tests/run_tests.py
+++ b/tools/run_tests/run_tests.py
@@ -43,6 +43,8 @@ import re
 import socket
 import subprocess
 import sys
+import tempfile
+import traceback
 import time
 import xml.etree.cElementTree as ET
 import urllib2
@@ -71,16 +73,17 @@ def platform_string():
 # SimpleConfig: just compile with CONFIG=config, and run the binary to test
 class SimpleConfig(object):
 
-  def __init__(self, config, environ=None, timeout_seconds=5*60):
+  def __init__(self, config, environ=None, timeout_multiplier=1):
     if environ is None:
       environ = {}
     self.build_config = config
     self.allow_hashing = (config != 'gcov')
     self.environ = environ
     self.environ['CONFIG'] = config
-    self.timeout_seconds = timeout_seconds
+    self.timeout_multiplier = timeout_multiplier
 
-  def job_spec(self, cmdline, hash_targets, shortname=None, environ={}):
+  def job_spec(self, cmdline, hash_targets, timeout_seconds=5*60,
+               shortname=None, environ={}):
     """Construct a jobset.JobSpec for a test under this config
 
        Args:
@@ -98,10 +101,11 @@ class SimpleConfig(object):
     return jobset.JobSpec(cmdline=cmdline,
                           shortname=shortname,
                           environ=actual_environ,
-                          timeout_seconds=self.timeout_seconds,
+                          timeout_seconds=self.timeout_multiplier * timeout_seconds,
                           hash_targets=hash_targets
                               if self.allow_hashing else None,
-                          flake_retries=5 if args.allow_flakes else 0)
+                          flake_retries=5 if args.allow_flakes else 0,
+                          timeout_retries=3 if args.allow_flakes else 0)
 
 
 # ValgrindConfig: compile with some CONFIG=config, but use valgrind to run
@@ -121,7 +125,7 @@ class ValgrindConfig(object):
                           shortname='valgrind %s' % cmdline[0],
                           hash_targets=None,
                           flake_retries=5 if args.allow_flakes else 0,
-                          timeout_retries=2 if args.allow_flakes else 0)
+                          timeout_retries=3 if args.allow_flakes else 0)
 
 
 def get_c_tests(travis, test_lang) :
@@ -167,11 +171,20 @@ class CLanguage(object):
     return ['buildtests_%s' % self.make_target, 'tools_%s' % self.make_target]
 
   def pre_build_steps(self):
-    return []
+    if self.platform == 'windows':
+      return [['tools\\run_tests\\pre_build_c.bat']]
+    else:
+      return []
 
   def build_steps(self):
     return []
 
+  def post_tests_steps(self):
+    if self.platform == 'windows':
+      return []
+    else:
+      return [['tools/run_tests/post_tests_c.sh']]
+
   def makefile_name(self):
     return 'Makefile'
 
@@ -181,45 +194,6 @@ class CLanguage(object):
   def __str__(self):
     return self.make_target
 
-
-def gyp_test_paths(travis, config=None):
-  binaries = get_c_tests(travis, 'c')
-  out = []
-  for target in binaries:
-    if config is not None and config.build_config in target['exclude_configs']:
-        continue
-    binary = 'out/Debug/%s' % target['name']
-    out.append(binary)
-  return sorted(out)
-
-
-class GYPCLanguage(object):
-
-  def test_specs(self, config, travis):
-    return [config.job_spec([binary], [binary])
-            for binary in gyp_test_paths(travis, config)]
-
-  def pre_build_steps(self):
-    return [['gyp', '--depth=.', '--suffix=-gyp', 'grpc.gyp']]
-
-  def make_targets(self):
-    # HACK(ctiller): force fling_client and fling_server to be built, as fling_test
-    # needs these
-    return gyp_test_paths(False) + ['fling_client', 'fling_server']
-
-  def build_steps(self):
-    return []
-
-  def makefile_name(self):
-    return 'Makefile-gyp'
-
-  def supports_multi_config(self):
-    return False
-
-  def __str__(self):
-    return 'gyp'
-
-
 class NodeLanguage(object):
 
   def test_specs(self, config, travis):
@@ -227,14 +201,18 @@ class NodeLanguage(object):
                             environ=_FORCE_ENVIRON_FOR_WRAPPERS)]
 
   def pre_build_steps(self):
-    return []
+    # Default to 1 week cache expiration
+    return [['npm', 'update', '--cache-min', '604800']]
 
   def make_targets(self):
-    return ['static_c', 'shared_c']
+    return []
 
   def build_steps(self):
     return [['tools/run_tests/build_node.sh']]
 
+  def post_tests_steps(self):
+    return []
+
   def makefile_name(self):
     return 'Makefile'
 
@@ -260,6 +238,9 @@ class PhpLanguage(object):
   def build_steps(self):
     return [['tools/run_tests/build_php.sh']]
 
+  def post_tests_steps(self):
+    return []
+
   def makefile_name(self):
     return 'Makefile'
 
@@ -284,6 +265,7 @@ class PythonLanguage(object):
         None,
         environ=environment,
         shortname='py.test',
+        timeout_seconds=15*60
     )]
 
   def pre_build_steps(self):
@@ -306,6 +288,9 @@ class PythonLanguage(object):
                        do_newline=True)
     return commands
 
+  def post_tests_steps(self):
+    return []
+
   def makefile_name(self):
     return 'Makefile'
 
@@ -323,7 +308,7 @@ class RubyLanguage(object):
                             environ=_FORCE_ENVIRON_FOR_WRAPPERS)]
 
   def pre_build_steps(self):
-    return []
+    return [['tools/run_tests/pre_build_ruby.sh']]
 
   def make_targets(self):
     return ['static_c']
@@ -331,6 +316,9 @@ class RubyLanguage(object):
   def build_steps(self):
     return [['tools/run_tests/build_ruby.sh']]
 
+  def post_tests_steps(self):
+    return []
+
   def makefile_name(self):
     return 'Makefile'
 
@@ -360,7 +348,10 @@ class CSharpLanguage(object):
             for assembly in assemblies]
 
   def pre_build_steps(self):
-    return []
+    if self.platform == 'windows':
+      return [['tools\\run_tests\\pre_build_csharp.bat']]
+    else:
+      return [['tools/run_tests/pre_build_csharp.sh']]
 
   def make_targets(self):
     # For Windows, this target doesn't really build anything,
@@ -376,6 +367,9 @@ class CSharpLanguage(object):
     else:
       return [['tools/run_tests/build_csharp.sh']]
 
+  def post_tests_steps(self):
+    return []
+
   def makefile_name(self):
     return 'Makefile'
 
@@ -401,6 +395,9 @@ class ObjCLanguage(object):
   def build_steps(self):
     return [['src/objective-c/tests/build_tests.sh']]
 
+  def post_tests_steps(self):
+    return []
+
   def makefile_name(self):
     return 'Makefile'
 
@@ -426,6 +423,9 @@ class Sanity(object):
   def build_steps(self):
     return []
 
+  def post_tests_steps(self):
+    return []
+
   def makefile_name(self):
     return 'Makefile'
 
@@ -464,11 +464,11 @@ class Build(object):
 _CONFIGS = {
     'dbg': SimpleConfig('dbg'),
     'opt': SimpleConfig('opt'),
-    'tsan': SimpleConfig('tsan', timeout_seconds=10*60, environ={
+    'tsan': SimpleConfig('tsan', timeout_multiplier=2, environ={
         'TSAN_OPTIONS': 'suppressions=tools/tsan_suppressions.txt:halt_on_error=1:second_deadlock_stack=1'}),
-    'msan': SimpleConfig('msan', timeout_seconds=7*60),
+    'msan': SimpleConfig('msan', timeout_multiplier=1.5),
     'ubsan': SimpleConfig('ubsan'),
-    'asan': SimpleConfig('asan', timeout_seconds=7*60, environ={
+    'asan': SimpleConfig('asan', timeout_multiplier=1.5, environ={
         'ASAN_OPTIONS': 'detect_leaks=1:color=always:suppressions=tools/tsan_suppressions.txt',
         'LSAN_OPTIONS': 'report_objects=1'}),
     'asan-noleaks': SimpleConfig('asan', environ={
@@ -483,7 +483,6 @@ _DEFAULT = ['opt']
 _LANGUAGES = {
     'c++': CLanguage('cxx', 'c++'),
     'c': CLanguage('c', 'c'),
-    'gyp': GYPCLanguage(),
     'node': NodeLanguage(),
     'php': PhpLanguage(),
     'python': PythonLanguage(),
@@ -607,7 +606,7 @@ run_configs = set(_CONFIGS[cfg]
 build_configs = set(cfg.build_config for cfg in run_configs)
 
 if args.travis:
-  _FORCE_ENVIRON_FOR_WRAPPERS = {'GRPC_TRACE': 'surface,batch'}
+  _FORCE_ENVIRON_FOR_WRAPPERS = {'GRPC_TRACE': 'api'}
 
 languages = set(_LANGUAGES[l]
                 for l in itertools.chain.from_iterable(
@@ -624,7 +623,9 @@ if platform.system() == 'Windows':
   def make_jobspec(cfg, targets, makefile='Makefile'):
     extra_args = []
     # better do parallel compilation
-    extra_args.extend(["/m"])
+    # empirically /m:2 gives the best performance/price and should prevent
+    # overloading the windows workers.
+    extra_args.extend(["/m:2"])
     # disable PDB generation: it's broken, and we don't need it during CI
     extra_args.extend(["/p:Jenkins=true"])
     return [
@@ -650,7 +651,7 @@ for l in languages:
       set(l.make_targets()))
 
 build_steps = list(set(
-                   jobset.JobSpec(cmdline, environ={'CONFIG': cfg})
+                   jobset.JobSpec(cmdline, environ={'CONFIG': cfg}, flake_retries=5)
                    for cfg in build_configs
                    for l in languages
                    for cmdline in l.pre_build_steps()))
@@ -658,11 +659,16 @@ if make_targets:
   make_commands = itertools.chain.from_iterable(make_jobspec(cfg, list(targets), makefile) for cfg in build_configs for (makefile, targets) in make_targets.iteritems())
   build_steps.extend(set(make_commands))
 build_steps.extend(set(
-                   jobset.JobSpec(cmdline, environ={'CONFIG': cfg})
+                   jobset.JobSpec(cmdline, environ={'CONFIG': cfg}, timeout_seconds=10*60)
                    for cfg in build_configs
                    for l in languages
                    for cmdline in l.build_steps()))
 
+post_tests_steps = list(set(
+                        jobset.JobSpec(cmdline, environ={'CONFIG': cfg})
+                        for cfg in build_configs
+                        for l in languages
+                        for cmdline in l.post_tests_steps()))
 runs_per_test = args.runs_per_test
 forever = args.forever
 
@@ -713,51 +719,81 @@ def _start_port_server(port_server_port):
   # if not running ==> start a new one
   # otherwise, leave it up
   try:
-    version = urllib2.urlopen('http://localhost:%d/version' % port_server_port,
-                              timeout=1).read()
-    print 'detected port server running'
+    version = int(urllib2.urlopen(
+        'http://localhost:%d/version_number' % port_server_port,
+        timeout=1).read())
+    print 'detected port server running version %d' % version
     running = True
-  except Exception:
+  except Exception as e:
     print 'failed to detect port server: %s' % sys.exc_info()[0]
+    print e.strerror
     running = False
   if running:
-    with open('tools/run_tests/port_server.py') as f:
-      current_version = hashlib.sha1(f.read()).hexdigest()
-      running = (version == current_version)
-      if not running:
-        print 'port_server version mismatch: killing the old one'
-        urllib2.urlopen('http://localhost:%d/quit' % port_server_port).read()
-        time.sleep(1)
+    current_version = int(subprocess.check_output(
+        [sys.executable, 'tools/run_tests/port_server.py', 'dump_version']))
+    print 'my port server is version %d' % current_version
+    running = (version >= current_version)
+    if not running:
+      print 'port_server version mismatch: killing the old one'
+      urllib2.urlopen('http://localhost:%d/quitquitquit' % port_server_port).read()
+      time.sleep(1)
   if not running:
-    print 'starting port_server'
-    port_log = open('portlog.txt', 'w')
-    port_server = subprocess.Popen(
-        ['python2.7', 'tools/run_tests/port_server.py', '-p', '%d' % port_server_port],
-        stderr=subprocess.STDOUT,
-        stdout=port_log)
+    fd, logfile = tempfile.mkstemp()
+    os.close(fd)
+    print 'starting port_server, with log file %s' % logfile
+    args = [sys.executable, 'tools/run_tests/port_server.py', '-p', '%d' % port_server_port, '-l', logfile]
+    env = dict(os.environ)
+    env['BUILD_ID'] = 'pleaseDontKillMeJenkins'
+    if platform.system() == 'Windows':
+      port_server = subprocess.Popen(
+          args,
+          env=env,
+          creationflags = 0x00000008, # detached process
+          close_fds=True)
+    else:
+      port_server = subprocess.Popen(
+          args,
+          env=env,
+          preexec_fn=os.setsid,
+          close_fds=True)
+    time.sleep(1)
     # ensure port server is up
     waits = 0
     while True:
       if waits > 10:
+        print 'killing port server due to excessive start up waits'
         port_server.kill()
       if port_server.poll() is not None:
         print 'port_server failed to start'
-        port_log = open('portlog.txt', 'r').read()
-        print port_log
-        sys.exit(1)
+        # try one final time: maybe another build managed to start one
+        time.sleep(1)
+        try:
+          urllib2.urlopen('http://localhost:%d/get' % port_server_port,
+                          timeout=1).read()
+          print 'last ditch attempt to contact port server succeeded'
+          break
+        except:
+          traceback.print_exc();
+          port_log = open(logfile, 'r').read()
+          print port_log
+          sys.exit(1)
       try:
         urllib2.urlopen('http://localhost:%d/get' % port_server_port,
                         timeout=1).read()
+        print 'port server is up and ready'
         break
       except socket.timeout:
         print 'waiting for port_server: timeout'
-        time.sleep(0.5)
+        traceback.print_exc();
+        time.sleep(1)
         waits += 1
       except urllib2.URLError:
         print 'waiting for port_server: urlerror'
-        time.sleep(0.5)
+        traceback.print_exc();
+        time.sleep(1)
         waits += 1
       except:
+        traceback.print_exc();
         port_server.kill()
         raise
 
@@ -766,14 +802,14 @@ def _build_and_run(
     check_cancelled, newline_on_success, travis, cache, xml_report=None):
   """Do one pass of building & running tests."""
   # build latest sequentially
-  if not jobset.run(build_steps, maxjobs=1,
+  if not jobset.run(build_steps, maxjobs=1, stop_on_failure=True,
                     newline_on_success=newline_on_success, travis=travis):
     return 1
 
   # start antagonists
   antagonists = [subprocess.Popen(['tools/run_tests/antagonist.py'])
                  for _ in range(0, args.antagonists)]
-  port_server_port = 9999
+  port_server_port = 32767
   _start_port_server(port_server_port)
   try:
     infinite_runs = runs_per_test == 0
@@ -817,6 +853,10 @@ def _build_and_run(
       tree = ET.ElementTree(root)
       tree.write(xml_report, encoding='UTF-8')
 
+  if not jobset.run(post_tests_steps, maxjobs=1, stop_on_failure=True,
+                    newline_on_success=newline_on_success, travis=travis):
+    return 3
+
   if cache: cache.save()
 
   return 0
diff --git a/tools/run_tests/sources_and_headers.json b/tools/run_tests/sources_and_headers.json
index e94da70e99ca0320e2490e833ba47db857b46208..363569eeaa2581c126819453cfbbe165e5673560 100644
--- a/tools/run_tests/sources_and_headers.json
+++ b/tools/run_tests/sources_and_headers.json
@@ -13104,6 +13104,7 @@
       "include/grpc/support/tls_msvc.h", 
       "include/grpc/support/tls_pthread.h", 
       "include/grpc/support/useful.h", 
+      "src/core/profiling/timers.h", 
       "src/core/support/block_annotate.h", 
       "src/core/support/env.h", 
       "src/core/support/file.h", 
@@ -13144,6 +13145,9 @@
       "include/grpc/support/tls_msvc.h", 
       "include/grpc/support/tls_pthread.h", 
       "include/grpc/support/useful.h", 
+      "src/core/profiling/basic_timers.c", 
+      "src/core/profiling/stap_timers.c", 
+      "src/core/profiling/timers.h", 
       "src/core/support/alloc.c", 
       "src/core/support/block_annotate.h", 
       "src/core/support/cmdline.c", 
@@ -13187,6 +13191,7 @@
       "src/core/support/thd_win32.c", 
       "src/core/support/time.c", 
       "src/core/support/time_posix.c", 
+      "src/core/support/time_precise.c", 
       "src/core/support/time_precise.h", 
       "src/core/support/time_win32.c", 
       "src/core/support/tls_pthread.c"
@@ -13294,7 +13299,6 @@
       "src/core/json/json_common.h", 
       "src/core/json/json_reader.h", 
       "src/core/json/json_writer.h", 
-      "src/core/profiling/timers.h", 
       "src/core/security/auth_filters.h", 
       "src/core/security/base64.h", 
       "src/core/security/credentials.h", 
@@ -13309,6 +13313,7 @@
       "src/core/surface/api_trace.h", 
       "src/core/surface/byte_buffer_queue.h", 
       "src/core/surface/call.h", 
+      "src/core/surface/call_test_only.h", 
       "src/core/surface/channel.h", 
       "src/core/surface/completion_queue.h", 
       "src/core/surface/event_string.h", 
@@ -13514,9 +13519,6 @@
       "src/core/json/json_string.c", 
       "src/core/json/json_writer.c", 
       "src/core/json/json_writer.h", 
-      "src/core/profiling/basic_timers.c", 
-      "src/core/profiling/stap_timers.c", 
-      "src/core/profiling/timers.h", 
       "src/core/security/auth_filters.h", 
       "src/core/security/base64.c", 
       "src/core/security/base64.h", 
@@ -13553,6 +13555,7 @@
       "src/core/surface/call.h", 
       "src/core/surface/call_details.c", 
       "src/core/surface/call_log_batch.c", 
+      "src/core/surface/call_test_only.h", 
       "src/core/surface/channel.c", 
       "src/core/surface/channel.h", 
       "src/core/surface/channel_connectivity.c", 
@@ -13802,12 +13805,12 @@
       "src/core/json/json_common.h", 
       "src/core/json/json_reader.h", 
       "src/core/json/json_writer.h", 
-      "src/core/profiling/timers.h", 
       "src/core/statistics/census_interface.h", 
       "src/core/statistics/census_rpc_stats.h", 
       "src/core/surface/api_trace.h", 
       "src/core/surface/byte_buffer_queue.h", 
       "src/core/surface/call.h", 
+      "src/core/surface/call_test_only.h", 
       "src/core/surface/channel.h", 
       "src/core/surface/completion_queue.h", 
       "src/core/surface/event_string.h", 
@@ -14007,9 +14010,6 @@
       "src/core/json/json_string.c", 
       "src/core/json/json_writer.c", 
       "src/core/json/json_writer.h", 
-      "src/core/profiling/basic_timers.c", 
-      "src/core/profiling/stap_timers.c", 
-      "src/core/profiling/timers.h", 
       "src/core/statistics/census_interface.h", 
       "src/core/statistics/census_rpc_stats.h", 
       "src/core/surface/api_trace.c", 
@@ -14022,6 +14022,7 @@
       "src/core/surface/call.h", 
       "src/core/surface/call_details.c", 
       "src/core/surface/call_log_batch.c", 
+      "src/core/surface/call_test_only.h", 
       "src/core/surface/channel.c", 
       "src/core/surface/channel.h", 
       "src/core/surface/channel_connectivity.c", 
diff --git a/vsprojects/nuget_package/README.md b/vsprojects/nuget_package/README.md
index 00bb400d661f6e15bf0aeaeb56f19e094c87704d..9fcbb5f85df7c124d89cc77ef4191fb8e28cc4b1 100644
--- a/vsprojects/nuget_package/README.md
+++ b/vsprojects/nuget_package/README.md
@@ -16,7 +16,7 @@ Build all flavors of gRPC C# extension and package them as a NuGet package.
 ```
 buildall.bat
 
-nuget pack grpc.native.csharp_ext.nuspec
+nuget pack grpc.native.csharp.nuspec
 ```
 
 When building the NuGet package, ignore the "Assembly outside lib folder" warnings (they DLLs are not assemblies, they are native libraries).
diff --git a/vsprojects/nuget_package/grpc.native.csharp_ext.nuspec b/vsprojects/nuget_package/grpc.native.csharp.nuspec
similarity index 85%
rename from vsprojects/nuget_package/grpc.native.csharp_ext.nuspec
rename to vsprojects/nuget_package/grpc.native.csharp.nuspec
index 39791a5d8e040765ba9efc25ea60bb646aeca164..50b56e9e6e65e3dd605c79db44f7d7d5dbd68d75 100644
--- a/vsprojects/nuget_package/grpc.native.csharp_ext.nuspec
+++ b/vsprojects/nuget_package/grpc.native.csharp.nuspec
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <package>
   <metadata>
-    <id>grpc.native.csharp_ext</id>
+    <id>grpc.native.csharp</id>
     <version>$version$</version>
     <authors>Google Inc.</authors>
     <owners>grpc-packages</owners>
@@ -20,8 +20,8 @@
     </dependencies>
   </metadata>
   <files>
-    <file src="grpc.native.csharp_ext.props" target="\build\portable-net45\grpc.native.csharp_ext.props" />
-    <file src="grpc.native.csharp_ext.targets" target="\build\portable-net45\grpc.native.csharp_ext.targets" />
+    <file src="grpc.native.csharp.props" target="\build\portable-net45\grpc.native.csharp.props" />
+    <file src="grpc.native.csharp.targets" target="\build\portable-net45\grpc.native.csharp.targets" />
     <file src="output\v100\Win32\Release\grpc_csharp_ext.dll" target="/build/native/bin/v100\Win32\Release\grpc_csharp_ext.dll" />
     <file src="output\v120\Win32\Release\grpc_csharp_ext.dll" target="/build/native/bin/v120\Win32\Release\grpc_csharp_ext.dll" />
     <file src="output\v100\Win32\Debug\grpc_csharp_ext.dll" target="/build/native/bin/v100\Win32\Debug\grpc_csharp_ext.dll" />
diff --git a/vsprojects/nuget_package/grpc.native.csharp_ext.props b/vsprojects/nuget_package/grpc.native.csharp.props
similarity index 100%
rename from vsprojects/nuget_package/grpc.native.csharp_ext.props
rename to vsprojects/nuget_package/grpc.native.csharp.props
diff --git a/vsprojects/nuget_package/grpc.native.csharp_ext.targets b/vsprojects/nuget_package/grpc.native.csharp.targets
similarity index 100%
rename from vsprojects/nuget_package/grpc.native.csharp_ext.targets
rename to vsprojects/nuget_package/grpc.native.csharp.targets
diff --git a/vsprojects/vcxproj/gpr/gpr.vcxproj b/vsprojects/vcxproj/gpr/gpr.vcxproj
index 479286fe97cea7de9ade2452bb55e334b9a75690..fa495db07b663308881fcc11d16d3c115428560f 100644
--- a/vsprojects/vcxproj/gpr/gpr.vcxproj
+++ b/vsprojects/vcxproj/gpr/gpr.vcxproj
@@ -163,6 +163,7 @@
     <ClInclude Include="..\..\..\include\grpc\support\useful.h" />
   </ItemGroup>
   <ItemGroup>
+    <ClInclude Include="..\..\..\src\core\profiling\timers.h" />
     <ClInclude Include="..\..\..\src\core\support\block_annotate.h" />
     <ClInclude Include="..\..\..\src\core\support\env.h" />
     <ClInclude Include="..\..\..\src\core\support\file.h" />
@@ -174,6 +175,10 @@
     <ClInclude Include="..\..\..\src\core\support\time_precise.h" />
   </ItemGroup>
   <ItemGroup>
+    <ClCompile Include="..\..\..\src\core\profiling\basic_timers.c">
+    </ClCompile>
+    <ClCompile Include="..\..\..\src\core\profiling\stap_timers.c">
+    </ClCompile>
     <ClCompile Include="..\..\..\src\core\support\alloc.c">
     </ClCompile>
     <ClCompile Include="..\..\..\src\core\support\cmdline.c">
@@ -244,6 +249,8 @@
     </ClCompile>
     <ClCompile Include="..\..\..\src\core\support\time_posix.c">
     </ClCompile>
+    <ClCompile Include="..\..\..\src\core\support\time_precise.c">
+    </ClCompile>
     <ClCompile Include="..\..\..\src\core\support\time_win32.c">
     </ClCompile>
     <ClCompile Include="..\..\..\src\core\support\tls_pthread.c">
diff --git a/vsprojects/vcxproj/gpr/gpr.vcxproj.filters b/vsprojects/vcxproj/gpr/gpr.vcxproj.filters
index be5bb5162d3c2c8e3ff32548489af23908ac4c25..ee03e454535d8fe67eb60377ded282de312b5bf3 100644
--- a/vsprojects/vcxproj/gpr/gpr.vcxproj.filters
+++ b/vsprojects/vcxproj/gpr/gpr.vcxproj.filters
@@ -1,6 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup>
+    <ClCompile Include="..\..\..\src\core\profiling\basic_timers.c">
+      <Filter>src\core\profiling</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\src\core\profiling\stap_timers.c">
+      <Filter>src\core\profiling</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\..\src\core\support\alloc.c">
       <Filter>src\core\support</Filter>
     </ClCompile>
@@ -106,6 +112,9 @@
     <ClCompile Include="..\..\..\src\core\support\time_posix.c">
       <Filter>src\core\support</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\..\src\core\support\time_precise.c">
+      <Filter>src\core\support</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\..\src\core\support\time_win32.c">
       <Filter>src\core\support</Filter>
     </ClCompile>
@@ -197,6 +206,9 @@
     </ClInclude>
   </ItemGroup>
   <ItemGroup>
+    <ClInclude Include="..\..\..\src\core\profiling\timers.h">
+      <Filter>src\core\profiling</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\..\src\core\support\block_annotate.h">
       <Filter>src\core\support</Filter>
     </ClInclude>
@@ -242,6 +254,9 @@
     <Filter Include="src\core">
       <UniqueIdentifier>{c5e1baa7-de77-beb1-9675-942261648f79}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src\core\profiling">
+      <UniqueIdentifier>{93b7086c-8c8a-6bbf-fb14-1f166bf0146a}</UniqueIdentifier>
+    </Filter>
     <Filter Include="src\core\support">
       <UniqueIdentifier>{bb116f2a-ea2a-c233-82da-0c54e3cbfec1}</UniqueIdentifier>
     </Filter>
diff --git a/vsprojects/vcxproj/grpc/grpc.vcxproj b/vsprojects/vcxproj/grpc/grpc.vcxproj
index 9a2f1732f978ac78221cdddf27af834fa108bc30..62ce97359036a5b484f0b13ceb0e93c0cee89ebd 100644
--- a/vsprojects/vcxproj/grpc/grpc.vcxproj
+++ b/vsprojects/vcxproj/grpc/grpc.vcxproj
@@ -339,12 +339,12 @@
     <ClInclude Include="..\..\..\src\core\json\json_common.h" />
     <ClInclude Include="..\..\..\src\core\json\json_reader.h" />
     <ClInclude Include="..\..\..\src\core\json\json_writer.h" />
-    <ClInclude Include="..\..\..\src\core\profiling\timers.h" />
     <ClInclude Include="..\..\..\src\core\statistics\census_interface.h" />
     <ClInclude Include="..\..\..\src\core\statistics\census_rpc_stats.h" />
     <ClInclude Include="..\..\..\src\core\surface\api_trace.h" />
     <ClInclude Include="..\..\..\src\core\surface\byte_buffer_queue.h" />
     <ClInclude Include="..\..\..\src\core\surface\call.h" />
+    <ClInclude Include="..\..\..\src\core\surface\call_test_only.h" />
     <ClInclude Include="..\..\..\src\core\surface\channel.h" />
     <ClInclude Include="..\..\..\src\core\surface\completion_queue.h" />
     <ClInclude Include="..\..\..\src\core\surface\event_string.h" />
@@ -578,10 +578,6 @@
     </ClCompile>
     <ClCompile Include="..\..\..\src\core\json\json_writer.c">
     </ClCompile>
-    <ClCompile Include="..\..\..\src\core\profiling\basic_timers.c">
-    </ClCompile>
-    <ClCompile Include="..\..\..\src\core\profiling\stap_timers.c">
-    </ClCompile>
     <ClCompile Include="..\..\..\src\core\surface\api_trace.c">
     </ClCompile>
     <ClCompile Include="..\..\..\src\core\surface\byte_buffer.c">
diff --git a/vsprojects/vcxproj/grpc/grpc.vcxproj.filters b/vsprojects/vcxproj/grpc/grpc.vcxproj.filters
index b19d62110ef3ad23ea47808dfa23fedc4edac306..c78514ac0334c9222c1c03d1aa83feee922ff14d 100644
--- a/vsprojects/vcxproj/grpc/grpc.vcxproj.filters
+++ b/vsprojects/vcxproj/grpc/grpc.vcxproj.filters
@@ -295,12 +295,6 @@
     <ClCompile Include="..\..\..\src\core\json\json_writer.c">
       <Filter>src\core\json</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\..\src\core\profiling\basic_timers.c">
-      <Filter>src\core\profiling</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\..\src\core\profiling\stap_timers.c">
-      <Filter>src\core\profiling</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\..\src\core\surface\api_trace.c">
       <Filter>src\core\surface</Filter>
     </ClCompile>
@@ -731,9 +725,6 @@
     <ClInclude Include="..\..\..\src\core\json\json_writer.h">
       <Filter>src\core\json</Filter>
     </ClInclude>
-    <ClInclude Include="..\..\..\src\core\profiling\timers.h">
-      <Filter>src\core\profiling</Filter>
-    </ClInclude>
     <ClInclude Include="..\..\..\src\core\statistics\census_interface.h">
       <Filter>src\core\statistics</Filter>
     </ClInclude>
@@ -749,6 +740,9 @@
     <ClInclude Include="..\..\..\src\core\surface\call.h">
       <Filter>src\core\surface</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\..\src\core\surface\call_test_only.h">
+      <Filter>src\core\surface</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\..\src\core\surface\channel.h">
       <Filter>src\core\surface</Filter>
     </ClInclude>
@@ -902,9 +896,6 @@
     <Filter Include="src\core\json">
       <UniqueIdentifier>{e665cc0e-b994-d7c5-cc18-2007392019f0}</UniqueIdentifier>
     </Filter>
-    <Filter Include="src\core\profiling">
-      <UniqueIdentifier>{87674b72-0f05-0469-481a-bd8c7af9ad80}</UniqueIdentifier>
-    </Filter>
     <Filter Include="src\core\security">
       <UniqueIdentifier>{1d850ac6-e639-4eab-5338-4ba40272fcc9}</UniqueIdentifier>
     </Filter>
diff --git a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj
index 259c3594e0cfb00a7e2c93b95e14a9b1388f4eb2..fe39d6a2a67b9dc8e85c6c3ae73e34df983d4df8 100644
--- a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj
+++ b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj
@@ -318,12 +318,12 @@
     <ClInclude Include="..\..\..\src\core\json\json_common.h" />
     <ClInclude Include="..\..\..\src\core\json\json_reader.h" />
     <ClInclude Include="..\..\..\src\core\json\json_writer.h" />
-    <ClInclude Include="..\..\..\src\core\profiling\timers.h" />
     <ClInclude Include="..\..\..\src\core\statistics\census_interface.h" />
     <ClInclude Include="..\..\..\src\core\statistics\census_rpc_stats.h" />
     <ClInclude Include="..\..\..\src\core\surface\api_trace.h" />
     <ClInclude Include="..\..\..\src\core\surface\byte_buffer_queue.h" />
     <ClInclude Include="..\..\..\src\core\surface\call.h" />
+    <ClInclude Include="..\..\..\src\core\surface\call_test_only.h" />
     <ClInclude Include="..\..\..\src\core\surface\channel.h" />
     <ClInclude Include="..\..\..\src\core\surface\completion_queue.h" />
     <ClInclude Include="..\..\..\src\core\surface\event_string.h" />
@@ -517,10 +517,6 @@
     </ClCompile>
     <ClCompile Include="..\..\..\src\core\json\json_writer.c">
     </ClCompile>
-    <ClCompile Include="..\..\..\src\core\profiling\basic_timers.c">
-    </ClCompile>
-    <ClCompile Include="..\..\..\src\core\profiling\stap_timers.c">
-    </ClCompile>
     <ClCompile Include="..\..\..\src\core\surface\api_trace.c">
     </ClCompile>
     <ClCompile Include="..\..\..\src\core\surface\byte_buffer.c">
diff --git a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters
index a8c35235592f10095d4b40e88aaeb524bffc99b6..82948dab9c16ec364754e0f7d2eee5987e91c8d8 100644
--- a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters
+++ b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters
@@ -235,12 +235,6 @@
     <ClCompile Include="..\..\..\src\core\json\json_writer.c">
       <Filter>src\core\json</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\..\src\core\profiling\basic_timers.c">
-      <Filter>src\core\profiling</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\..\src\core\profiling\stap_timers.c">
-      <Filter>src\core\profiling</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\..\src\core\surface\api_trace.c">
       <Filter>src\core\surface</Filter>
     </ClCompile>
@@ -629,9 +623,6 @@
     <ClInclude Include="..\..\..\src\core\json\json_writer.h">
       <Filter>src\core\json</Filter>
     </ClInclude>
-    <ClInclude Include="..\..\..\src\core\profiling\timers.h">
-      <Filter>src\core\profiling</Filter>
-    </ClInclude>
     <ClInclude Include="..\..\..\src\core\statistics\census_interface.h">
       <Filter>src\core\statistics</Filter>
     </ClInclude>
@@ -647,6 +638,9 @@
     <ClInclude Include="..\..\..\src\core\surface\call.h">
       <Filter>src\core\surface</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\..\src\core\surface\call_test_only.h">
+      <Filter>src\core\surface</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\..\src\core\surface\channel.h">
       <Filter>src\core\surface</Filter>
     </ClInclude>
@@ -800,9 +794,6 @@
     <Filter Include="src\core\json">
       <UniqueIdentifier>{443ffc61-1bea-2477-6e54-1ddf8c139264}</UniqueIdentifier>
     </Filter>
-    <Filter Include="src\core\profiling">
-      <UniqueIdentifier>{7f91d9bf-c9de-835a-d74d-b16f843b89a9}</UniqueIdentifier>
-    </Filter>
     <Filter Include="src\core\statistics">
       <UniqueIdentifier>{e084164c-a069-00e3-db35-4e0b1cd6f0b7}</UniqueIdentifier>
     </Filter>