Merge pull request #3698 from ctiller/qps_test_be_locky

Add a timeout to benchmark test runs
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/binding.gyp b/binding.gyp
new file mode 100644
index 0000000..2a5cb1c
--- /dev/null
+++ b/binding.gyp
@@ -0,0 +1,95 @@
+# 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.
+{
+  "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"', {
+          '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.gyp:grpc"
+      ]
+    }
+  ]
+}
diff --git a/build.json b/build.json
deleted file mode 100644
index 0a4248c..0000000
--- 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/examples/node/greeter_client.js b/examples/node/greeter_client.js
index ddc8abb..175f8e6 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 44b44af..3600c8b 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 f0a044f..0000000
--- 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 1da6c69..525d68f 100644
--- a/examples/node/route_guide/route_guide_client.js
+++ b/examples/node/route_guide/route_guide_client.js
@@ -31,8 +31,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 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 faae308..5bb8144 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 a4ee8e6..8fb0608 100644
--- a/examples/php/README.md
+++ b/examples/php/README.md
@@ -8,7 +8,7 @@
 
 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 @@
 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 0000000..7b48c82
--- /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/helloworld_pb2.py b/examples/python/helloworld/helloworld_pb2.py
new file mode 100644
index 0000000..1b2674e
--- /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/grpc.gyp b/grpc.gyp
index 2225ca4..08185ac 100644
--- a/grpc.gyp
+++ b/grpc.gyp
@@ -78,10 +78,15 @@
       '-ldl',
       '-lpthread',
       '-lz'
-    ]
+    ],
+    'direct_dependent_settings': {
+      'include_dirs': [
+        '.',
+        'include'
+      ],
+    }
   },
   'targets': [
-    # TODO: Add C++ targets
     {
       'target_name': 'gpr',
       'product_prefix': 'lib',
@@ -128,19 +133,6 @@
         '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',
@@ -299,12351 +291,5 @@
         '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/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_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_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_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/src/node/package.json b/package.json
similarity index 60%
rename from src/node/package.json
rename to package.json
index 0aeca5f..0eea347 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/examples 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,24 @@
     "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",
+    "grpc.gyp",
+    "binding.gyp"
   ],
-  "main": "index.js",
+  "main": "src/node/index.js",
   "license": "BSD-3-Clause"
 }
diff --git a/src/core/channel/client_channel.c b/src/core/channel/client_channel.c
index b59b62a..8e7cb27 100644
--- a/src/core/channel/client_channel.c
+++ b/src/core/channel/client_channel.c
@@ -51,7 +51,7 @@
 
 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 */
diff --git a/src/core/client_config/lb_policies/pick_first.c b/src/core/client_config/lb_policies/pick_first.c
index 28155d0..4b3aaab 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 @@
   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 @@
   }
 }
 
+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,11 @@
         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 +316,15 @@
   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 +332,14 @@
   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/compression/algorithm.c b/src/core/compression/algorithm.c
index d55e499..fd95a3c 100644
--- a/src/core/compression/algorithm.c
+++ b/src/core/compression/algorithm.c
@@ -101,6 +101,7 @@
     default:
       /* we shouldn't be making it here */
       abort();
+      return GRPC_COMPRESS_NONE;
   }
 }
 
@@ -116,6 +117,7 @@
     }
   }
   abort();
+  return GRPC_COMPRESS_LEVEL_NONE;
 }
 
 void grpc_compression_options_init(grpc_compression_options *opts) {
diff --git a/src/core/iomgr/closure.c b/src/core/iomgr/closure.c
index 3265425..d916819 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 @@
   }
   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 982ffa4..d812659 100644
--- a/src/core/iomgr/closure.h
+++ b/src/core/iomgr/closure.h
@@ -77,6 +77,9 @@
 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/tcp_server_windows.c b/src/core/iomgr/tcp_server_windows.c
index db3319b..3fea8b5 100644
--- a/src/core/iomgr/tcp_server_windows.c
+++ b/src/core/iomgr/tcp_server_windows.c
@@ -336,6 +336,8 @@
                            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 1304f20..9903e97 100644
--- a/src/core/iomgr/udp_server.c
+++ b/src/core/iomgr/udp_server.c
@@ -278,7 +278,7 @@
 
   /* 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 dbbe097..de5736c 100644
--- a/src/core/iomgr/udp_server.h
+++ b/src/core/iomgr/udp_server.h
@@ -43,7 +43,8 @@
 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/surface/byte_buffer.c b/src/core/surface/byte_buffer.c
index a930949..295ef5a 100644
--- a/src/core/surface/byte_buffer.c
+++ b/src/core/surface/byte_buffer.c
@@ -97,4 +97,5 @@
   }
   gpr_log(GPR_ERROR, "should never reach here");
   abort();
+  return 0;
 }
diff --git a/src/core/surface/call.c b/src/core/surface/call.c
index 07c3ff6..8a7a772 100644
--- a/src/core/surface/call.c
+++ b/src/core/surface/call.c
@@ -436,6 +436,7 @@
   }
   gpr_log(GPR_ERROR, "should never reach here");
   abort();
+  return NULL;
 }
 
 static void done_completion(grpc_exec_ctx *exec_ctx, void *call,
diff --git a/src/csharp/Grpc.Auth/AuthInterceptors.cs b/src/csharp/Grpc.Auth/AuthInterceptors.cs
index c8ab4d9..fa92566 100644
--- a/src/csharp/Grpc.Auth/AuthInterceptors.cs
+++ b/src/csharp/Grpc.Auth/AuthInterceptors.cs
@@ -41,8 +41,8 @@
 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.
+    /// <seealso cref="GrpcCredentials"/>
     /// </summary>
     public static class AuthInterceptors
     {
@@ -50,31 +50,29 @@
         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/Grpc.Auth.csproj b/src/csharp/Grpc.Auth/Grpc.Auth.csproj
index 4fb087d..80ab07d 100644
--- a/src/csharp/Grpc.Auth/Grpc.Auth.csproj
+++ b/src/csharp/Grpc.Auth/Grpc.Auth.csproj
@@ -78,6 +78,7 @@
     <Compile Include="..\Grpc.Core\Version.cs">
       <Link>Version.cs</Link>
     </Compile>
+    <Compile Include="GrpcCredentials.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="AuthInterceptors.cs" />
   </ItemGroup>
diff --git a/src/csharp/Grpc.Auth/GrpcCredentials.cs b/src/csharp/Grpc.Auth/GrpcCredentials.cs
new file mode 100644
index 0000000..d8b1080
--- /dev/null
+++ b/src/csharp/Grpc.Auth/GrpcCredentials.cs
@@ -0,0 +1,93 @@
+#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 Google.Apis.Auth.OAuth2;
+using Grpc.Core;
+using Grpc.Core.Utils;
+
+namespace Grpc.Auth
+{
+    /// <summary>
+    /// Factory methods to create instances of <see cref="ChannelCredentials"/> and <see cref="CallCredentials"/> classes.
+    /// </summary>
+    public static class GrpcCredentials
+    {
+        /// <summary>
+        /// Creates a <see cref="MetadataCredentials"/> instance that will obtain access tokens 
+        /// from any credential 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 <c>MetadataCredentials</c> instance.</returns>
+        public static MetadataCredentials Create(ITokenAccess credential)
+        {
+            return new MetadataCredentials(AuthInterceptors.FromCredential(credential));
+        }
+
+        /// <summary>
+        /// Convenience method to create a <see cref="ChannelCredentials"/> instance from
+        /// <c>ITokenAccess</c> credential and <c>SslCredentials</c> instance.
+        /// </summary>
+        /// <param name="credential">The credential to use to obtain access tokens.</param>
+        /// <param name="sslCredentials">The <c>SslCredentials</c> instance.</param>
+        /// <returns>The channel credentials for access token based auth over a secure channel.</returns>
+        public static ChannelCredentials Create(ITokenAccess credential, SslCredentials sslCredentials)
+        {
+            return ChannelCredentials.Create(sslCredentials, Create(credential));
+        }
+
+        /// <summary>
+        /// Creates an instance of <see cref="MetadataCredentials"/> 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 MetadataCredentials FromAccessToken(string accessToken)
+        {
+            return new MetadataCredentials(AuthInterceptors.FromAccessToken(accessToken));
+        }
+
+        /// <summary>
+        /// Converts a <c>ITokenAccess</c> object into a <see cref="MetadataCredentials"/> object supported
+        /// by gRPC.
+        /// </summary>
+        /// <param name="credential"></param>
+        /// <returns></returns>
+        public static MetadataCredentials ToGrpcCredentials(this ITokenAccess credential)
+        {
+            return GrpcCredentials.Create(credential);
+        }
+    }
+}
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 2dc10eb..4519632 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 @@
 
 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(
+                new MetadataCredentials(async (uri, m) => { await Task.Delay(1); }),
+                new MetadataCredentials(async (uri, m) => { await Task.Delay(2); }));
+            using (var nativeComposite = composite.ToNativeCredentials())
+            {
+            }
         }
     }
 }
diff --git a/src/csharp/Grpc.Core.Tests/ClientBaseTest.cs b/src/csharp/Grpc.Core.Tests/ChannelCredentialsTest.cs
similarity index 61%
copy from src/csharp/Grpc.Core.Tests/ClientBaseTest.cs
copy to src/csharp/Grpc.Core.Tests/ChannelCredentialsTest.cs
index 2dc10eb..489bf38 100644
--- a/src/csharp/Grpc.Core.Tests/ClientBaseTest.cs
+++ b/src/csharp/Grpc.Core.Tests/ChannelCredentialsTest.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,31 @@
 
 namespace Grpc.Core.Tests
 {
-    public class ClientBaseTest
+    public class ChannelCredentialsTest
     {
         [Test]
-        public void GetAuthUriBase_Valid()
+        public void InsecureCredentials_IsNonComposable()
         {
-            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.IsFalse(ChannelCredentials.Insecure.IsComposable);
         }
 
         [Test]
-        public void GetAuthUriBase_Invalid()
+        public void ChannelCredentials_CreateComposite()
         {
-            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 = 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()));
+        }
+
+        [Test]
+        public void ChannelCredentials_CreateWrapped()
+        {
+            ChannelCredentials.Create(new FakeCallCredentials());
         }
     }
 }
diff --git a/src/csharp/Grpc.Core.Tests/ChannelTest.cs b/src/csharp/Grpc.Core.Tests/ChannelTest.cs
index dfbd928..f4ae9ab 100644
--- a/src/csharp/Grpc.Core.Tests/ChannelTest.cs
+++ b/src/csharp/Grpc.Core.Tests/ChannelTest.cs
@@ -44,13 +44,13 @@
         [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 @@
         [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 @@
         [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 @@
         [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/csharp/Grpc.Core.Tests/ClientBaseTest.cs b/src/csharp/Grpc.Core.Tests/FakeCredentials.cs
similarity index 65%
copy from src/csharp/Grpc.Core.Tests/ClientBaseTest.cs
copy to src/csharp/Grpc.Core.Tests/FakeCredentials.cs
index 2dc10eb..87d55cd 100644
--- a/src/csharp/Grpc.Core.Tests/ClientBaseTest.cs
+++ b/src/csharp/Grpc.Core.Tests/FakeCredentials.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,31 @@
 
 namespace Grpc.Core.Tests
 {
-    public class ClientBaseTest
+    internal class FakeChannelCredentials : ChannelCredentials
     {
-        [Test]
-        public void GetAuthUriBase_Valid()
+        readonly bool composable;
+
+        public FakeChannelCredentials(bool composable)
         {
-            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/"));
+            this.composable = composable;
         }
 
-        [Test]
-        public void GetAuthUriBase_Invalid()
+        internal override bool IsComposable
         {
-            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(""));
+            get { return composable; }
+        }
+
+        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 f730936..91d072a 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 685c5f7..246072b 100644
--- a/src/csharp/Grpc.Core.Tests/Internal/AsyncCallTest.cs
+++ b/src/csharp/Grpc.Core.Tests/Internal/AsyncCallTest.cs
@@ -49,7 +49,7 @@
         [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 83707e0..37fb369 100644
--- a/src/csharp/Grpc.Core.Tests/MarshallingErrorsTest.cs
+++ b/src/csharp/Grpc.Core.Tests/MarshallingErrorsTest.cs
@@ -119,7 +119,7 @@
         [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 @@
         {
             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 765732c..567e04e 100644
--- a/src/csharp/Grpc.Core.Tests/MockServiceHelper.cs
+++ b/src/csharp/Grpc.Core.Tests/MockServiceHelper.cs
@@ -154,7 +154,7 @@
         {
             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/CallCredentials.cs b/src/csharp/Grpc.Core/CallCredentials.cs
new file mode 100644
index 0000000..809c9f4
--- /dev/null
+++ b/src/csharp/Grpc.Core/CallCredentials.cs
@@ -0,0 +1,142 @@
+#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>
+    /// 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 native object for the credentials.
+        /// </summary>
+        /// <returns>The native credentials.</returns>
+        internal abstract CredentialsSafeHandle ToNativeCredentials();
+    }
+
+    /// <summary>
+    /// Asynchronous authentication interceptor for <see cref="MetadataCredentials"/>.
+    /// </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 credentials that delegate metadata based auth to an interceptor.
+    /// The interceptor is automatically invoked for each remote call that uses <c>MetadataCredentials.</c>
+    /// </summary>
+    public 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 = 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 c3bc9c3..c0f94c6 100644
--- a/src/csharp/Grpc.Core/CallOptions.cs
+++ b/src/csharp/Grpc.Core/CallOptions.cs
@@ -49,6 +49,7 @@
         CancellationToken cancellationToken;
         WriteOptions writeOptions;
         ContextPropagationToken propagationToken;
+        CallCredentials credentials;
 
         /// <summary>
         /// Creates a new instance of <c>CallOptions</c> struct.
@@ -58,14 +59,16 @@
         /// <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>
@@ -115,6 +118,17 @@
         }
 
         /// <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.
         /// </summary>
diff --git a/src/csharp/Grpc.Core/Channel.cs b/src/csharp/Grpc.Core/Channel.cs
index f194272..6b99055 100644
--- a/src/csharp/Grpc.Core/Channel.cs
+++ b/src/csharp/Grpc.Core/Channel.cs
@@ -68,7 +68,7 @@
         /// <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 @@
         /// <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/ChannelCredentials.cs b/src/csharp/Grpc.Core/ChannelCredentials.cs
new file mode 100644
index 0000000..599674e
--- /dev/null
+++ b/src/csharp/Grpc.Core/ChannelCredentials.cs
@@ -0,0 +1,238 @@
+#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>
+    /// Client-side channel credentials. Used for creation of a secure channel.
+    /// </summary>
+    public abstract class ChannelCredentials
+    {
+        static readonly ChannelCredentials InsecureInstance = new InsecureCredentialsImpl();
+
+        /// <summary>
+        /// Returns instance of credentials that provides no security and 
+        /// will result in creating an unsecure channel with no encryption whatsoever.
+        /// </summary>
+        public static ChannelCredentials Insecure
+        {
+            get
+            {
+                return InsecureInstance;
+            }
+        }
+
+        /// <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 a new instance of <c>ChannelCredentials</c> by wrapping
+        /// an instance of <c>CallCredentials</c>.
+        /// </summary>
+        /// <param name="callCredentials">Call credentials.</param>
+        /// <returns>The <c>ChannelCredentials</c> wrapping given call credentials.</returns>
+        public static ChannelCredentials Create(CallCredentials callCredentials)
+        {
+            return new WrappedCallCredentials(callCredentials);
+        }
+
+        /// <summary>
+        /// Creates native object for the credentials. May return null if insecure channel
+        /// should be created.
+        /// </summary>
+        /// <returns>The native credentials.</returns>
+        internal abstract CredentialsSafeHandle ToNativeCredentials();
+
+        /// <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()
+            {
+                return null;
+            }
+        }
+    }
+
+    /// <summary>
+    /// Client-side SSL credentials.
+    /// </summary>
+    public sealed class SslCredentials : ChannelCredentials
+    {
+        readonly string rootCertificates;
+        readonly KeyCertificatePair keyCertificatePair;
+
+        /// <summary>
+        /// Creates client-side SSL credentials loaded from
+        /// disk file pointed to by the GRPC_DEFAULT_SSL_ROOTS_FILE_PATH environment variable.
+        /// If that fails, gets the roots certificates from a well known place on disk.
+        /// </summary>
+        public SslCredentials() : this(null, null)
+        {
+        }
+
+        /// <summary>
+        /// Creates client-side SSL credentials from
+        /// a string containing PEM encoded root certificates.
+        /// </summary>
+        public SslCredentials(string rootCertificates) : this(rootCertificates, null)
+        {
+        }
+            
+        /// <summary>
+        /// Creates client-side SSL credentials.
+        /// </summary>
+        /// <param name="rootCertificates">string containing PEM encoded server root certificates.</param>
+        /// <param name="keyCertificatePair">a key certificate pair.</param>
+        public SslCredentials(string rootCertificates, KeyCertificatePair keyCertificatePair)
+        {
+            this.rootCertificates = rootCertificates;
+            this.keyCertificatePair = keyCertificatePair;
+        }
+
+        /// <summary>
+        /// PEM encoding of the server root certificates.
+        /// </summary>
+        public string RootCertificates
+        {
+            get
+            {
+                return this.rootCertificates;
+            }
+        }
+
+        /// <summary>
+        /// Client side key and certificate pair.
+        /// If null, client will not use key and certificate pair.
+        /// </summary>
+        public KeyCertificatePair KeyCertificatePair
+        {
+            get
+            {
+                return this.keyCertificatePair;
+            }
+        }
+
+        // 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;
+            }
+        }
+    }
+
+    /// <summary>
+    /// Credentials wrapping <see cref="CallCredentials"/> as <see cref="ChannelCredentials"/>.
+    /// </summary>
+    internal sealed class WrappedCallCredentials : ChannelCredentials
+    {
+        readonly CallCredentials callCredentials;
+
+        /// <summary>
+        /// Wraps instance of <c>CallCredentials</c> as <c>ChannelCredentials</c>.
+        /// </summary>
+        /// <param name="callCredentials">credentials to wrap</param>
+        public WrappedCallCredentials(CallCredentials callCredentials)
+        {
+            this.callCredentials = Preconditions.CheckNotNull(callCredentials);
+        }
+
+        internal override CredentialsSafeHandle ToNativeCredentials()
+        {
+            return callCredentials.ToNativeCredentials();
+        }
+    }
+}
diff --git a/src/csharp/Grpc.Core/ClientBase.cs b/src/csharp/Grpc.Core/ClientBase.cs
index f4533e7..e5b3980 100644
--- a/src/csharp/Grpc.Core/ClientBase.cs
+++ b/src/csharp/Grpc.Core/ClientBase.cs
@@ -40,18 +40,17 @@
     /// <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 @@
         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 @@
                 {
                     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/Credentials.cs b/src/csharp/Grpc.Core/Credentials.cs
deleted file mode 100644
index 4fcac0c..0000000
--- a/src/csharp/Grpc.Core/Credentials.cs
+++ /dev/null
@@ -1,138 +0,0 @@
-#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 Grpc.Core.Internal;
-
-namespace Grpc.Core
-{
-    /// <summary>
-    /// Client-side credentials. Used for creation of a secure channel.
-    /// </summary>
-    public abstract class Credentials
-    {
-        static readonly Credentials InsecureInstance = new InsecureCredentialsImpl();
-
-        /// <summary>
-        /// Returns instance of credential that provides no security and 
-        /// will result in creating an unsecure channel with no encryption whatsoever.
-        /// </summary>
-        public static Credentials Insecure
-        {
-            get
-            {
-                return InsecureInstance;
-            }
-        }
-
-        /// <summary>
-        /// Creates native object for the credentials. May return null if insecure channel
-        /// should be created.
-        /// </summary>
-        /// <returns>The native credentials.</returns>
-        internal abstract CredentialsSafeHandle ToNativeCredentials();
-
-        private sealed class InsecureCredentialsImpl : Credentials
-        {
-            internal override CredentialsSafeHandle ToNativeCredentials()
-            {
-                return null;
-            }
-        }
-    }
-
-    /// <summary>
-    /// Client-side SSL credentials.
-    /// </summary>
-    public sealed class SslCredentials : Credentials
-    {
-        readonly string rootCertificates;
-        readonly KeyCertificatePair keyCertificatePair;
-
-        /// <summary>
-        /// Creates client-side SSL credentials loaded from
-        /// disk file pointed to by the GRPC_DEFAULT_SSL_ROOTS_FILE_PATH environment variable.
-        /// If that fails, gets the roots certificates from a well known place on disk.
-        /// </summary>
-        public SslCredentials() : this(null, null)
-        {
-        }
-
-        /// <summary>
-        /// Creates client-side SSL credentials from
-        /// a string containing PEM encoded root certificates.
-        /// </summary>
-        public SslCredentials(string rootCertificates) : this(rootCertificates, null)
-        {
-        }
-            
-        /// <summary>
-        /// Creates client-side SSL credentials.
-        /// </summary>
-        /// <param name="rootCertificates">string containing PEM encoded server root certificates.</param>
-        /// <param name="keyCertificatePair">a key certificate pair.</param>
-        public SslCredentials(string rootCertificates, KeyCertificatePair keyCertificatePair)
-        {
-            this.rootCertificates = rootCertificates;
-            this.keyCertificatePair = keyCertificatePair;
-        }
-
-        /// <summary>
-        /// PEM encoding of the server root certificates.
-        /// </summary>
-        public string RootCertificates
-        {
-            get
-            {
-                return this.rootCertificates;
-            }
-        }
-
-        /// <summary>
-        /// Client side key and certificate pair.
-        /// If null, client will not use key and certificate pair.
-        /// </summary>
-        public KeyCertificatePair KeyCertificatePair
-        {
-            get
-            {
-                return this.keyCertificatePair;
-            }
-        }
-
-        internal override CredentialsSafeHandle ToNativeCredentials()
-        {
-            return CredentialsSafeHandle.CreateSslCredentials(rootCertificates, keyCertificatePair);
-        }
-    }
-}
diff --git a/src/csharp/Grpc.Core/Grpc.Core.csproj b/src/csharp/Grpc.Core/Grpc.Core.csproj
index ad2af17..92d4e19 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 06de55c..67a04af 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 e3b0078..800462c 100644
--- a/src/csharp/Grpc.Core/Internal/AsyncCall.cs
+++ b/src/csharp/Grpc.Core/Internal/AsyncCall.cs
@@ -344,9 +344,13 @@
 
             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 c3611a7..0be7a4d 100644
--- a/src/csharp/Grpc.Core/Internal/CallSafeHandle.cs
+++ b/src/csharp/Grpc.Core/Internal/CallSafeHandle.cs
@@ -99,6 +99,9 @@
             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);
 
         [DllImport("grpc_csharp_ext.dll")]
@@ -113,6 +116,11 @@
             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 7a1c6e3..d270d77 100644
--- a/src/csharp/Grpc.Core/Internal/ChannelSafeHandle.cs
+++ b/src/csharp/Grpc.Core/Internal/ChannelSafeHandle.cs
@@ -82,9 +82,13 @@
             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 feed335..bab4510 100644
--- a/src/csharp/Grpc.Core/Internal/CredentialsSafeHandle.cs
+++ b/src/csharp/Grpc.Core/Internal/CredentialsSafeHandle.cs
@@ -44,6 +44,9 @@
         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);
 
         private CredentialsSafeHandle()
@@ -69,6 +72,11 @@
             }
         }
 
+        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 0000000..f76492c
--- /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 01e4a80..64e429e 100644
--- a/src/csharp/Grpc.Examples.MathClient/MathClient.cs
+++ b/src/csharp/Grpc.Examples.MathClient/MathClient.cs
@@ -39,7 +39,7 @@
     {
         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 e2975b5..290d428 100644
--- a/src/csharp/Grpc.Examples.Tests/MathClientServerTests.cs
+++ b/src/csharp/Grpc.Examples.Tests/MathClientServerTests.cs
@@ -61,7 +61,7 @@
                 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 6c3a53b..d90f21c 100644
--- a/src/csharp/Grpc.HealthCheck.Tests/HealthClientServerTest.cs
+++ b/src/csharp/Grpc.HealthCheck.Tests/HealthClientServerTest.cs
@@ -63,7 +63,7 @@
                 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 2c38c96..8bc2082 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 0000000..7a02c95
--- /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 949ad61..1eadbeb 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 0000000..7a02c95
--- /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 28c28c9..9bf2b8f 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 @@
       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 a0bcf43..2b75305 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 504d798..cb50b44 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 @@
             [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 @@
 
         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 @@
             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.ToGrpcCredentials());
+            }
+
+            if (options.TestCase == "compute_engine_creds")
+            {
+                var googleCredential = await GoogleCredential.GetApplicationDefaultAsync();
+                Assert.IsFalse(googleCredential.IsCreateScopedRequired);
+                credentials = ChannelCredentials.Create(credentials, googleCredential.ToGrpcCredentials());
+            }
+            return credentials;
+        }
+
         private async Task RunTestCaseAsync(TestService.TestServiceClient client, ClientOptions options)
         {
             switch (options.TestCase)
@@ -155,16 +178,16 @@
                     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 @@
             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 @@
                 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 @@
             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 @@
                 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 = GrpcCredentials.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 = GrpcCredentials.Create(googleCredential);
             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 @@
         {
             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 513f872..29f842b 100644
--- a/src/csharp/Grpc.IntegrationTesting/InteropServer.cs
+++ b/src/csharp/Grpc.IntegrationTesting/InteropServer.cs
@@ -54,8 +54,9 @@
             [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 @@
 
             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 a3cbb7d..51a56f0 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 @@
     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 @@
     RANDOM = 2,
   }
 
+  public enum CompressionType {
+    NONE = 0,
+    GZIP = 1,
+    DEFLATE = 2,
+  }
+
   #endregion
 
   #region Messages
@@ -196,12 +213,140 @@
   }
 
   [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 @@
       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 @@
       }
     }
 
+    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 @@
       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 @@
       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 @@
         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 @@
       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 @@
       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 @@
             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 @@
     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 @@
     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 @@
     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 @@
     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 @@
     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 @@
       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 @@
       }
     }
 
+    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 @@
       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 @@
       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 @@
         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 @@
       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 @@
         }
         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 @@
             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 @@
     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 @@
 
   }
 
+  [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 0000000..5325b2f
--- /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)),
+                new MetadataCredentials(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 466ec57..cf47707 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 @@
     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 f63e148..8c884b7 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 @@
     }
 
   }
+  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 6d0eb93..0000000
--- 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 7df85e3..0000000
--- 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 5496f72..0000000
--- 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 a3505b1..b864a95 100644
--- a/src/csharp/build_packages.bat
+++ b/src/csharp/build_packages.bat
@@ -20,9 +20,9 @@
 
 @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 51e0728..679ca43 100644
--- a/src/csharp/ext/grpc_csharp_ext.c
+++ b/src/csharp/ext/grpc_csharp_ext.c
@@ -68,7 +68,7 @@
 /*
  * 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 @@
 }
 
 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 @@
                                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 @@
   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 a17f45b..f879e07 100755
--- a/src/csharp/generate_proto_csharp.sh
+++ b/src/csharp/generate_proto_csharp.sh
@@ -42,7 +42,7 @@
     -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 0209b57..0000000
--- 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 7719d08..5d89e22 100644
--- a/src/node/README.md
+++ b/src/node/README.md
@@ -5,51 +5,19 @@
 
 ## 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 @@
 ```
 
 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 2f856e4..0000000
--- 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 c7f2460..0000000
--- 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 247719e..0000000
--- 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 c92c450..0000000
--- 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 811e08b..0000000
--- 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 9f90191..0000000
--- 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.proto b/src/node/examples/stock.proto
deleted file mode 100644
index 5ee2bcb..0000000
--- a/src/node/examples/stock.proto
+++ /dev/null
@@ -1,62 +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 examples;
-
-// Protocol type definitions
-message StockRequest {
-  string symbol = 1;
-  int32 num_trades_to_watch = 2;
-}
-
-message StockReply {
-  float price = 1;
-  string symbol = 2;
-}
-
-
-// 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) {
-  }
-
-}
diff --git a/src/node/examples/stock_client.js b/src/node/examples/stock_client.js
deleted file mode 100644
index ab9b050..0000000
--- a/src/node/examples/stock_client.js
+++ /dev/null
@@ -1,47 +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('..');
-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;
diff --git a/src/node/examples/stock_server.js b/src/node/examples/stock_server.js
deleted file mode 100644
index 12e5479..0000000
--- 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 f98fe24..b63e294 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;
@@ -502,6 +504,7 @@
   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);
@@ -725,5 +728,26 @@
   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 2f8e1f1..dd6c38e 100644
--- a/src/node/ext/call.h
+++ b/src/node/ext/call.h
@@ -73,6 +73,10 @@
   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 @@
   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 0000000..839bb56
--- /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/credentials.h b/src/node/ext/call_credentials.h
similarity index 70%
copy from src/node/ext/credentials.h
copy to src/node/ext/call_credentials.h
index 1b21117..618292d 100644
--- a/src/node/ext/credentials.h
+++ b/src/node/ext/call_credentials.h
@@ -31,19 +31,17 @@
  *
  */
 
-#ifndef NET_GRPC_NODE_CREDENTIALS_H_
-#define NET_GRPC_NODE_CREDENTIALS_H_
+#ifndef GRPC_NODE_CALL_CREDENTIALS_H_
+#define GRPC_NODE_CALL_CREDENTIALS_H_
 
 #include <node.h>
 #include <nan.h>
-#include "grpc/grpc.h"
 #include "grpc/grpc_security.h"
 
 namespace grpc {
 namespace node {
 
-/* Wrapper class for grpc_credentials structs */
-class Credentials : public Nan::ObjectWrap {
+class CallCredentials : public Nan::ObjectWrap {
  public:
   static void Init(v8::Local<v8::Object> exports);
   static bool HasInstance(v8::Local<v8::Value> val);
@@ -54,21 +52,18 @@
   grpc_credentials *GetWrappedCredentials();
 
  private:
-  explicit Credentials(grpc_credentials *credentials);
-  ~Credentials();
+  explicit CallCredentials(grpc_credentials *credentials);
+  ~CallCredentials();
 
   // Prevent copying
-  Credentials(const Credentials &);
-  Credentials &operator=(const Credentials &);
+  CallCredentials(const CallCredentials &);
+  CallCredentials &operator=(const CallCredentials &);
 
   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(CreateFromPlugin);
+
+  static NAN_METHOD(Compose);
   static Nan::Callback *constructor;
   // Used for typechecking instances of this javascript class
   static Nan::Persistent<v8::FunctionTemplate> fun_tpl;
@@ -76,7 +71,30 @@
   grpc_credentials *wrapped_credentials;
 };
 
-}  // namespace node
-}  // namespace grpc
+/* Auth metadata plugin functionality */
 
-#endif  // NET_GRPC_NODE_CREDENTIALS_H_
+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 6eb1e77..a328c01 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 @@
     // 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 4f41c92..3d47ff2 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::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 @@
   }
 }
 
-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::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,21 +170,25 @@
   }
 }
 
-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);
+      self->wrapped_credentials, other->GetWrappedCredentials(), NULL);
   if (creds == NULL) {
     info.GetReturnValue().SetNull();
   } else {
@@ -210,35 +196,7 @@
   }
 }
 
-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);
-  if (creds == NULL) {
-    info.GetReturnValue().SetNull();
-  } else {
-    info.GetReturnValue().Set(WrapStruct(creds));
-  }
-}
-
-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 1b21117..31ea098 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 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 @@
   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 @@
 }  // 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 caca0fc..5b5f3c1 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 @@
   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 02b73f6..591d9dd 100644
--- a/src/node/index.js
+++ b/src/node/index.js
@@ -43,7 +43,7 @@
 
 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,37 +90,10 @@
     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
  */
 exports.Server = server.Server;
@@ -153,7 +126,7 @@
 /**
  * Credentials factories
  */
-exports.Credentials = grpc.Credentials;
+exports.credentials = require('./src/credentials.js');
 
 /**
  * ServerCredentials factories
diff --git a/src/node/interop/empty.proto b/src/node/interop/empty.proto
deleted file mode 100644
index 6d0eb93..0000000
--- a/src/node/interop/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/node/interop/interop_client.js b/src/node/interop/interop_client.js
index df67be8..14cc6c0 100644
--- a/src/node/interop/interop_client.js
+++ b/src/node/interop/interop_client.js
@@ -37,7 +37,9 @@
 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');
@@ -352,33 +354,26 @@
  *     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.strictEqual(resp.oauth_scope, AUTH_SCOPE_RESPONSE);
     }
-    client.$updateMetadata = grpc.getGoogleAuthDelegate(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);
-      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);
-      }
-      if (done) {
-        done();
-      }
-    });
+    if (done) {
+      done();
+    }
   });
 }
 
@@ -417,25 +412,86 @@
   });
 }
 
+function perRpcAuthTest(expected_user, scope, per_rpc, client, done) {
+  (new GoogleAuth()).getApplicationDefault(function(err, credential) {
+    assert.ifError(err);
+    var arg = {
+      fill_username: true,
+      fill_oauth_scope: true
+    };
+    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.username, expected_user);
+      assert.strictEqual(resp.oauth_scope, AUTH_SCOPE_RESPONSE);
+      if (done) {
+        done();
+      }
+    }, null, {credentials: creds});
+  });
+}
+
+function getApplicationCreds(scope, callback) {
+  (new GoogleAuth()).getApplicationDefault(function(err, credential) {
+    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) {
+      if (err) {
+        callback(err);
+        return;
+      }
+      var updateMd = function(service_url, callback) {
+        var metadata = new grpc.Metadata();
+        metadata.add('authorization', 'Bearer ' + token);
+        callback(null, metadata);
+      };
+      callback(null, grpc.credentials.createFromMetadataGenerator(updateMd));
+    });
+  });
+}
+
 /**
  * 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,
-  custom_metadata: customMetadata,
-  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},
+  large_unary: {run: largeUnary},
+  client_streaming: {run: clientStreaming},
+  server_streaming: {run: serverStreaming},
+  ping_pong: {run: pingPong},
+  empty_stream: {run: emptyStream},
+  cancel_after_begin: {run: cancelAfterBegin},
+  cancel_after_first_response: {run: cancelAfterFirstResponse},
+  timeout_on_sleeping_server: {run: timeoutOnSleepingServer},
+  custom_metadata: {run: customMetadata},
+  compute_engine_creds: {run: _.partial(authTest, COMPUTE_ENGINE_USER, null),
+                         getCreds: _.partial(getApplicationCreds, null)},
+  service_account_creds: {run: _.partial(authTest, AUTH_USER, AUTH_SCOPE),
+                          getCreds: _.partial(getApplicationCreds, AUTH_SCOPE)},
+  jwt_token_creds: {run: _.partial(authTest, AUTH_USER, null),
+                    getCreds: _.partial(getApplicationCreds, null)},
+  oauth2_auth_token: {run: _.partial(oauth2Test, AUTH_USER, AUTH_SCOPE, false),
+                      getCreds: _.partial(getOauth2Creds, AUTH_SCOPE)},
+  per_rpc_creds: {run: _.partial(perRpcAuthTest, AUTH_USER, AUTH_SCOPE, true)}
 };
 
 /**
@@ -461,17 +517,30 @@
       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];
 
-  test_cases[test_case](client, done);
+  var execute = function(err, creds) {
+    assert.ifError(err);
+    var client = new testProto.TestService(address, creds, options);
+    test.run(client, done);
+  };
+
+  if (test.getCreds) {
+    test.getCreds(function(err, new_creds) {
+      execute(err, grpc.credentials.combineChannelCredentials(
+          creds, new_creds));
+    });
+  } else {
+    execute(null, creds);
+  }
 }
 
 if (require.main === module) {
diff --git a/src/node/interop/interop_server.js b/src/node/interop/interop_server.js
index 762e670..3e83304 100644
--- a/src/node/interop/interop_server.js
+++ b/src/node/interop/interop_server.js
@@ -37,7 +37,9 @@
 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';
diff --git a/src/node/interop/messages.proto b/src/node/interop/messages.proto
deleted file mode 100644
index 7df85e3..0000000
--- 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 24e6749..0000000
--- 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 ba8fbf8..fe51e4a 100644
--- a/src/node/examples/perf_test.js
+++ b/src/node/performance/perf_test.js
@@ -42,7 +42,7 @@
   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 ec968b8..491f473 100644
--- a/src/node/examples/qps_test.js
+++ b/src/node/performance/qps_test.js
@@ -62,7 +62,7 @@
   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 7f51023..909376e 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 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 @@
   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 @@
     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'
-              };
-            }
+    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);
-        } else {
-          callback(null, deserialized);
-        }
-        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 @@
       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'
-              };
-            }
+        } 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);
-        }
-        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 @@
       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.
+          // 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;
   }
@@ -540,45 +525,38 @@
       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 @@
    * @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 @@
     /* 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 0000000..009ff63
--- /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/server.js b/src/node/src/server.js
index 70b4a9d..87b5b7a 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');
 
diff --git a/src/node/test/async_test.js b/src/node/test/async_test.js
index e81de62..ce3ce50 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 @@
 /**
  * Server to test against
  */
-var getServer = require('../examples/math_server.js');
+var getServer = require('./math/math_server.js');
 
 var server = getServer();
 
diff --git a/src/node/test/call_test.js b/src/node/test/call_test.js
index e7f071b..c316fe7 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 @@
   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 d81df2a..b86f89b 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 @@
     }
   };
 }
-var insecureCreds = grpc.Credentials.createInsecure();
+var insecureCreds = grpc.ChannelCredentials.createInsecure();
 
 describe('channel', function() {
   describe('constructor', function() {
@@ -149,12 +149,13 @@
     afterEach(function() {
       channel.close();
     });
-    it('should time out if called alone', function(done) {
+    it.only('should time out if called alone', function(done) {
       var old_state = channel.getConnectivityState();
       var deadline = new Date();
       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 fa06ad4..b17cd33 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 0000000..8eb91ee
--- /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.combineCredentials(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.combineCredentials(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: updater_creds});
+      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 4b8da3b..0f6c594 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 @@
   };
 }
 
-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 9267bff..a4dc24c 100644
--- a/src/node/test/health_test.js
+++ b/src/node/test/health_test.js
@@ -54,7 +54,7 @@
                                      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/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 98%
rename from src/node/examples/math_server.js
rename to src/node/test/math/math_server.js
index a4b237a..9d06596 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 6a6607e..6361d97 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 @@
 /**
  * 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 @@
                                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 1e69d52..999a183 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 989fe5f..395ea88 100644
--- a/src/node/test/surface_test.js
+++ b/src/node/test/surface_test.js
@@ -41,7 +41,7 @@
 
 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 @@
     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 @@
     });
     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 @@
       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 @@
     });
     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 @@
     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 @@
     });
     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 @@
       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) {
@@ -711,7 +711,7 @@
     });
     var 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() {
@@ -748,7 +748,7 @@
       var proxy_port = proxy.bind('localhost:0', server_insecure_creds);
       proxy.start();
       var proxy_client = new Client('localhost:' + proxy_port,
-                                    grpc.Credentials.createInsecure());
+                                    grpc.credentials.createInsecure());
       var call = proxy_client.unary({}, function(err, value) {
         done();
       });
@@ -771,7 +771,7 @@
       var proxy_port = proxy.bind('localhost:0', server_insecure_creds);
       proxy.start();
       var proxy_client = new Client('localhost:' + proxy_port,
-                                    grpc.Credentials.createInsecure());
+                                    grpc.credentials.createInsecure());
       var call = proxy_client.clientStream(function(err, value) {
         done();
       });
@@ -792,7 +792,7 @@
       var proxy_port = proxy.bind('localhost:0', server_insecure_creds);
       proxy.start();
       var proxy_client = new Client('localhost:' + proxy_port,
-                                    grpc.Credentials.createInsecure());
+                                    grpc.credentials.createInsecure());
       var call = proxy_client.serverStream({});
       call.on('error', function(err) {
         done();
@@ -813,7 +813,7 @@
       var proxy_port = proxy.bind('localhost:0', server_insecure_creds);
       proxy.start();
       var proxy_client = new Client('localhost:' + proxy_port,
-                                    grpc.Credentials.createInsecure());
+                                    grpc.credentials.createInsecure());
       var call = proxy_client.bidiStream();
       call.on('error', function(err) {
         done();
@@ -842,7 +842,7 @@
       var proxy_port = proxy.bind('localhost:0', server_insecure_creds);
       proxy.start();
       var proxy_client = new Client('localhost:' + proxy_port,
-                                    grpc.Credentials.createInsecure());
+                                    grpc.credentials.createInsecure());
       var deadline = new Date();
       deadline.setSeconds(deadline.getSeconds() + 1);
       proxy_client.clientStream(function(err, value) {
@@ -865,7 +865,7 @@
       var proxy_port = proxy.bind('localhost:0', server_insecure_creds);
       proxy.start();
       var proxy_client = new Client('localhost:' + proxy_port,
-                                    grpc.Credentials.createInsecure());
+                                    grpc.credentials.createInsecure());
       var deadline = new Date();
       deadline.setSeconds(deadline.getSeconds() + 1);
       var call = proxy_client.bidiStream(null, {deadline: deadline});
@@ -888,7 +888,7 @@
     });
     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 6c27657..a861a9f 100644
--- a/src/objective-c/README.md
+++ b/src/objective-c/README.md
@@ -17,7 +17,7 @@
 <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 @@
 <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 @@
 
 [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 019fcbd..fee33f5 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 f41902f..921cfc6 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 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 0f730ea..fcd94a6 100644
--- a/src/php/ext/grpc/php_grpc.c
+++ b/src/php/ext/grpc/php_grpc.c
@@ -109,91 +109,125 @@
   */
   /* 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/ruby/lib/grpc/generic/client_stub.rb b/src/ruby/lib/grpc/generic/client_stub.rb
index 8c92384..b8e33ad 100644
--- a/src/ruby/lib/grpc/generic/client_stub.rb
+++ b/src/ruby/lib/grpc/generic/client_stub.rb
@@ -176,8 +176,7 @@
                           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 @@
                           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 @@
                           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 @@
                           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 @@
 
     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 a05433d..c5173ae 100644
--- a/src/ruby/spec/generic/client_stub_spec.rb
+++ b/src/ruby/spec/generic/client_stub_spec.rb
@@ -159,6 +159,20 @@
         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/grpc.gyp.template
index 8736062..9a7637d 100644
--- a/templates/grpc.gyp.template
+++ b/templates/grpc.gyp.template
@@ -80,12 +80,17 @@
         '-ldl',
         '-lpthread',
         '-lz'
-      ]
+      ],
+      'direct_dependent_settings': {
+        'include_dirs': [
+          '.',
+          'include'
+        ],
+      }
     },
     '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 +108,5 @@
       },
       % 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
-        ],
-        'sources': [
-          % for source in tgt.src:
-          '${source}',
-          % endfor
-        ]
-      },
-      % endif
-      % endfor
     ]
   }
diff --git a/test/core/iomgr/udp_server_test.c b/test/core/iomgr/udp_server_test.c
index fc0026d..86e8767 100644
--- a/test/core/iomgr/udp_server_test.c
+++ b/test/core/iomgr/udp_server_test.c
@@ -49,7 +49,8 @@
 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/cpp/interop/client.cc b/test/cpp/interop/client.cc
index dbe2939..cb9b396 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 cbad21e..61b46d2 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 @@
     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 @@
     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/tools/gce_setup/grpc_docker.sh b/tools/gce_setup/grpc_docker.sh
index fdb7736..e50706e 100755
--- a/tools/gce_setup/grpc_docker.sh
+++ b/tools/gce_setup/grpc_docker.sh
@@ -1477,7 +1477,7 @@
 #   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 @@
 #   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 @@
 #   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 @@
 #   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 @@
 #   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 0000000..21688f0
--- /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 0000000..6c6b5cb
--- /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 0000000..12689e9
--- /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 0000000..78fe420
--- /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 0000000..f1bca7f
--- /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 0000000..3b687c0
--- /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 0000000..6011eed
--- /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 0000000..5a2b1ad
--- /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 0000000..0450e7e
--- /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 2c562e9..8b7809f 100755
--- a/tools/jenkins/build_docker_and_run_tests.sh
+++ b/tools/jenkins/build_docker_and_run_tests.sh
@@ -37,8 +37,13 @@
 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
 
@@ -57,9 +62,11 @@
   -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/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 \
diff --git a/tools/jenkins/docker_run_tests.sh b/tools/jenkins/docker_run_tests.sh
index 2e39bc6..8bafeea 100755
--- a/tools/jenkins/docker_run_tests.sh
+++ b/tools/jenkins/docker_run_tests.sh
@@ -36,6 +36,10 @@
 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_jenkins_slave/Dockerfile b/tools/jenkins/grpc_jenkins_slave/Dockerfile
index 4f5387e..5f2b425 100644
--- a/tools/jenkins/grpc_jenkins_slave/Dockerfile
+++ b/tools/jenkins/grpc_jenkins_slave/Dockerfile
@@ -126,10 +126,11 @@
 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
diff --git a/tools/jenkins/run_jenkins.sh b/tools/jenkins/run_jenkins.sh
index f79e739..0e1af2a 100755
--- a/tools/jenkins/run_jenkins.sh
+++ b/tools/jenkins/run_jenkins.sh
@@ -63,10 +63,6 @@
   # 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 @@
   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/run_tests/build_csharp.sh b/tools/run_tests/build_csharp.sh
index eae7bd5..6737d88 100755
--- a/tools/run_tests/build_csharp.sh
+++ b/tools/run_tests/build_csharp.sh
@@ -37,14 +37,6 @@
   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 95ffb94..faa7b62 100755
--- a/tools/run_tests/build_node.sh
+++ b/tools/run_tests/build_node.sh
@@ -36,9 +36,4 @@
 # 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 2efc2c7..24cf6ba 100755
--- a/tools/run_tests/build_python.sh
+++ b/tools/run_tests/build_python.sh
@@ -39,6 +39,33 @@
 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 @@
     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 259f336..6d23c31 100755
--- a/tools/run_tests/build_ruby.sh
+++ b/tools/run_tests/build_ruby.sh
@@ -37,6 +37,4 @@
 cd $(dirname $0)/../../src/ruby
 
 rm -rf ./tmp
-
-bundle install
 rake compile:grpc
diff --git a/tools/run_tests/port_server.py b/tools/run_tests/port_server.py
index 48b6214..b953df9 100755
--- a/tools/run_tests/port_server.py
+++ b/tools/run_tests/port_server.py
@@ -38,6 +38,18 @@
 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 = 2
+
+
+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)
 args = argp.parse_args()
@@ -47,9 +59,6 @@
 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"""
@@ -113,7 +122,7 @@
       del in_use[p]
       pool.append(p)
       self.log_message('drop port %d' % p)
-    elif self.path == '/version':
+    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 +137,7 @@
       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
diff --git a/tools/run_tests/pre_build_c.bat b/tools/run_tests/pre_build_c.bat
new file mode 100644
index 0000000..f0449f3
--- /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 0000000..853a8f4
--- /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 0000000..42ff60b
--- /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 0000000..569a1d0
--- /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 48c34f6..f328f46 100755
--- a/tools/run_tests/run_interop_tests.py
+++ b/tools/run_tests/run_interop_tests.py
@@ -62,7 +62,6 @@
 _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
 
 
@@ -75,11 +74,11 @@
 
   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 {}
@@ -100,17 +99,17 @@
 
   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'
@@ -312,6 +311,10 @@
   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]
 
diff --git a/tools/run_tests/run_node.sh b/tools/run_tests/run_node.sh
index e322ab1..7809690 100755
--- a/tools/run_tests/run_node.sh
+++ b/tools/run_tests/run_node.sh
@@ -37,19 +37,15 @@
 
 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
 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_tests.py b/tools/run_tests/run_tests.py
index e938520..a3bed4e 100755
--- a/tools/run_tests/run_tests.py
+++ b/tools/run_tests/run_tests.py
@@ -167,7 +167,10 @@
     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 []
@@ -181,45 +184,6 @@
   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):
@@ -230,7 +194,7 @@
     return []
 
   def make_targets(self):
-    return ['static_c', 'shared_c']
+    return []
 
   def build_steps(self):
     return [['tools/run_tests/build_node.sh']]
@@ -323,7 +287,7 @@
                             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']
@@ -360,7 +324,10 @@
             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,
@@ -483,7 +450,6 @@
 _LANGUAGES = {
     'c++': CLanguage('cxx', 'c++'),
     'c': CLanguage('c', 'c'),
-    'gyp': GYPCLanguage(),
     'node': NodeLanguage(),
     'php': PhpLanguage(),
     'python': PythonLanguage(),
@@ -624,7 +590,9 @@
   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 +618,7 @@
       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,7 +626,7 @@
   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()))
@@ -713,21 +681,24 @@
   # 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')
@@ -766,14 +737,14 @@
     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
diff --git a/vsprojects/nuget_package/README.md b/vsprojects/nuget_package/README.md
index 00bb400..9fcbb5f 100644
--- a/vsprojects/nuget_package/README.md
+++ b/vsprojects/nuget_package/README.md
@@ -16,7 +16,7 @@
 ```
 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 39791a5..50b56e9 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