Merge pull request #12169 from muxi/improve-objc-test-info

Improve objc test info
diff --git a/BUILD b/BUILD
index 49c340d..5c400d4 100644
--- a/BUILD
+++ b/BUILD
@@ -34,11 +34,11 @@
 )
 
 # This should be updated along with build.yaml
-g_stands_for = "gregarious"
+g_stands_for = "gambit"
 
 core_version = "4.0.0-dev"
 
-version = "1.5.0-dev"
+version = "1.7.0-dev"
 
 GPR_PUBLIC_HDRS = [
     "include/grpc/support/alloc.h",
@@ -593,9 +593,9 @@
         "src/core/lib/iomgr/ev_windows.c",
         "src/core/lib/iomgr/exec_ctx.c",
         "src/core/lib/iomgr/executor.c",
+        "src/core/lib/iomgr/gethostname_fallback.c",
         "src/core/lib/iomgr/gethostname_host_name_max.c",
         "src/core/lib/iomgr/gethostname_sysconf.c",
-        "src/core/lib/iomgr/gethostname_fallback.c",
         "src/core/lib/iomgr/iocp_windows.c",
         "src/core/lib/iomgr/iomgr.c",
         "src/core/lib/iomgr/iomgr_posix.c",
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8dc4758..0b593a9 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -24,7 +24,7 @@
 cmake_minimum_required(VERSION 2.8)
 
 set(PACKAGE_NAME      "grpc")
-set(PACKAGE_VERSION   "1.5.0-dev")
+set(PACKAGE_VERSION   "1.7.0-dev")
 set(PACKAGE_STRING    "${PACKAGE_NAME} ${PACKAGE_VERSION}")
 set(PACKAGE_TARNAME   "${PACKAGE_NAME}-${PACKAGE_VERSION}")
 set(PACKAGE_BUGREPORT "https://github.com/grpc/grpc/issues/")
diff --git a/Makefile b/Makefile
index 74f05f5..392c8f3 100644
--- a/Makefile
+++ b/Makefile
@@ -411,8 +411,8 @@
 endif
 
 CORE_VERSION = 4.0.0-dev
-CPP_VERSION = 1.5.0-dev
-CSHARP_VERSION = 1.5.0-dev
+CPP_VERSION = 1.7.0-dev
+CSHARP_VERSION = 1.7.0-dev
 
 CPPFLAGS_NO_ARCH += $(addprefix -I, $(INCLUDES)) $(addprefix -D, $(DEFINES))
 CPPFLAGS += $(CPPFLAGS_NO_ARCH) $(ARCH_FLAGS)
diff --git a/build.yaml b/build.yaml
index a459b9d..d70bbe3 100644
--- a/build.yaml
+++ b/build.yaml
@@ -13,8 +13,8 @@
   '#09': Per-language overrides are possible with (eg) ruby_version tag here
   '#10': See the expand_version.py for all the quirks here
   core_version: 4.0.0-dev
-  g_stands_for: gregarious
-  version: 1.5.0-dev
+  g_stands_for: gambit
+  version: 1.7.0-dev
 filegroups:
 - name: census
   public_headers:
diff --git a/doc/g_stands_for.md b/doc/g_stands_for.md
index 2078bb3..9a161d6 100644
--- a/doc/g_stands_for.md
+++ b/doc/g_stands_for.md
@@ -9,3 +9,5 @@
 - 1.2 'g' stands for 'green'
 - 1.3 'g' stands for 'gentle'
 - 1.4 'g' stands for 'gregarious'
+- 1.6 'g' stands for 'garcia'
+- 1.7 'g' stands for 'gambit'
diff --git a/examples/csharp/helloworld-from-cli/global.json b/examples/csharp/helloworld-from-cli/global.json
new file mode 100644
index 0000000..e4b797e
--- /dev/null
+++ b/examples/csharp/helloworld-from-cli/global.json
@@ -0,0 +1,5 @@
+{
+  "sdk": {
+    "version": "1.0.0"
+  }
+}
diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec
index 4b1a8f3..82cb4bc 100644
--- a/gRPC-Core.podspec
+++ b/gRPC-Core.podspec
@@ -22,7 +22,7 @@
 
 Pod::Spec.new do |s|
   s.name     = 'gRPC-Core'
-  version = '1.5.0-dev'
+  version = '1.7.0-dev'
   s.version  = version
   s.summary  = 'Core cross-platform gRPC library, written in C'
   s.homepage = 'https://grpc.io'
@@ -994,4 +994,9 @@
                       'test/core/util/port.c',
                       'test/core/util/port_server_client.{c,h}'
   end
+
+  # TODO (mxyan): Instead of this hack, add include path "third_party" to C core's include path?
+  s.prepare_command = <<-END_OF_COMMAND
+    find src/core/ -type f -exec sed -E -i '.back' 's;#include "third_party/nanopb/(.*)";#include <nanopb/\\1>;g' {} \\\;
+  END_OF_COMMAND
 end
diff --git a/gRPC-ProtoRPC.podspec b/gRPC-ProtoRPC.podspec
index 2317aac..cb40330 100644
--- a/gRPC-ProtoRPC.podspec
+++ b/gRPC-ProtoRPC.podspec
@@ -21,7 +21,7 @@
 
 Pod::Spec.new do |s|
   s.name     = 'gRPC-ProtoRPC'
-  version = '1.5.0-dev'
+  version = '1.7.0-dev'
   s.version  = version
   s.summary  = 'RPC library for Protocol Buffers, based on gRPC'
   s.homepage = 'https://grpc.io'
diff --git a/gRPC-RxLibrary.podspec b/gRPC-RxLibrary.podspec
index 4a03c3f..52bd8ed 100644
--- a/gRPC-RxLibrary.podspec
+++ b/gRPC-RxLibrary.podspec
@@ -21,7 +21,7 @@
 
 Pod::Spec.new do |s|
   s.name     = 'gRPC-RxLibrary'
-  version = '1.5.0-dev'
+  version = '1.7.0-dev'
   s.version  = version
   s.summary  = 'Reactive Extensions library for iOS/OSX.'
   s.homepage = 'https://grpc.io'
diff --git a/gRPC.podspec b/gRPC.podspec
index 4c83ccc..ba90149 100644
--- a/gRPC.podspec
+++ b/gRPC.podspec
@@ -20,7 +20,7 @@
 
 Pod::Spec.new do |s|
   s.name     = 'gRPC'
-  version = '1.5.0-dev'
+  version = '1.7.0-dev'
   s.version  = version
   s.summary  = 'gRPC client library for iOS/OSX'
   s.homepage = 'https://grpc.io'
diff --git a/grpc.gyp b/grpc.gyp
new file mode 100644
index 0000000..78b0364
--- /dev/null
+++ b/grpc.gyp
@@ -0,0 +1,2473 @@
+# GRPC GYP build file
+
+# This file has been automatically generated from a template file.
+# Please look at the templates directory instead.
+# This file can be regenerated from the template by running
+# tools/buildgen/generate_projects.sh
+
+# Copyright 2015 gRPC authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+{
+  'variables': {
+   # The openssl and zlib dependencies must be passed in as variables
+   # defined in an included gypi file, usually common.gypi.
+   'openssl_gyp_target%': 'Please Define openssl_gyp_target variable',
+   'zlib_gyp_target%': 'Please Define zlib_gyp_target variable',
+
+   'grpc_gcov%': 'false',
+   'grpc_alpine%': 'false',
+  },
+  'target_defaults': {
+    'configurations': {
+      'Release': {
+        'cflags': [
+          '-O2',
+        ],
+        'defines': [
+          'NDEBUG',
+        ],
+      },
+      'Debug': {
+        'cflags': [
+          '-O0',
+        ],
+        'defines': [
+          '_DEBUG',
+          'DEBUG',
+        ],
+      },
+    },
+    'cflags': [
+      '-g',
+      '-Wall',
+      '-Wextra',
+      '-Werror',
+      '-Wno-long-long',
+      '-Wno-unused-parameter',
+      '-DOSATOMIC_USE_INLINED=1',
+    ],
+    'ldflags': [
+      '-g',
+    ],
+    'cflags_c': [
+      '-Werror',
+      '-std=c99'
+    ],
+    'cflags_cc': [
+      '-Werror',
+      '-std=c++11'
+    ],
+    'include_dirs': [
+      '.',
+      '../..',
+      'include',
+    ],
+    'defines': [
+      'GRPC_ARES=0',
+    ],
+    'dependencies': [
+      '<(openssl_gyp_target)',
+      '<(zlib_gyp_target)',
+    ],
+    'conditions': [
+      ['grpc_gcov=="true"', {
+        'cflags': [
+          '-O0',
+          '-fprofile-arcs',
+          '-ftest-coverage',
+          '-Wno-return-type',
+        ],
+        'defines': [
+          '_DEBUG',
+          'DEBUG',
+          'GPR_GCOV',
+        ],
+        'ldflags': [
+          '-fprofile-arcs',
+          '-ftest-coverage',
+          '-rdynamic',
+        ],
+      }],
+      ['grpc_alpine=="true"', {
+        'defines': [
+          'GPR_MUSL_LIBC_COMPAT'
+        ]
+      }],
+      ['OS == "win"', {
+        'defines': [
+          '_WIN32_WINNT=0x0600',
+          'WIN32_LEAN_AND_MEAN',
+          '_HAS_EXCEPTIONS=0',
+          'UNICODE',
+          '_UNICODE',
+          'NOMINMAX',
+        ],
+        'msvs_settings': {
+          'VCCLCompilerTool': {
+            'RuntimeLibrary': 1, # static debug
+          }
+        },
+        "libraries": [
+          "ws2_32"
+        ]
+      }],
+      ['OS == "mac"', {
+        'xcode_settings': {
+          'OTHER_CFLAGS': [
+            '-g',
+            '-Wall',
+            '-Wextra',
+            '-Werror',
+            '-Wno-long-long',
+            '-Wno-unused-parameter',
+            '-DOSATOMIC_USE_INLINED=1',
+          ],
+          'OTHER_CPLUSPLUSFLAGS': [
+            '-g',
+            '-Wall',
+            '-Wextra',
+            '-Werror',
+            '-Wno-long-long',
+            '-Wno-unused-parameter',
+            '-DOSATOMIC_USE_INLINED=1',
+            '-stdlib=libc++',
+            '-std=c++11',
+            '-Wno-error=deprecated-declarations'
+          ],
+        },
+      }]
+    ]
+  },
+  'targets': [
+    {
+      'target_name': 'gpr',
+      'type': 'static_library',
+      'dependencies': [
+      ],
+      'sources': [
+        'src/core/lib/profiling/basic_timers.c',
+        'src/core/lib/profiling/stap_timers.c',
+        'src/core/lib/support/alloc.c',
+        'src/core/lib/support/arena.c',
+        'src/core/lib/support/atm.c',
+        'src/core/lib/support/avl.c',
+        'src/core/lib/support/backoff.c',
+        'src/core/lib/support/cmdline.c',
+        'src/core/lib/support/cpu_iphone.c',
+        'src/core/lib/support/cpu_linux.c',
+        'src/core/lib/support/cpu_posix.c',
+        'src/core/lib/support/cpu_windows.c',
+        'src/core/lib/support/env_linux.c',
+        'src/core/lib/support/env_posix.c',
+        'src/core/lib/support/env_windows.c',
+        'src/core/lib/support/histogram.c',
+        'src/core/lib/support/host_port.c',
+        'src/core/lib/support/log.c',
+        'src/core/lib/support/log_android.c',
+        'src/core/lib/support/log_linux.c',
+        'src/core/lib/support/log_posix.c',
+        'src/core/lib/support/log_windows.c',
+        'src/core/lib/support/mpscq.c',
+        'src/core/lib/support/murmur_hash.c',
+        'src/core/lib/support/stack_lockfree.c',
+        'src/core/lib/support/string.c',
+        'src/core/lib/support/string_posix.c',
+        'src/core/lib/support/string_util_windows.c',
+        'src/core/lib/support/string_windows.c',
+        'src/core/lib/support/subprocess_posix.c',
+        'src/core/lib/support/subprocess_windows.c',
+        'src/core/lib/support/sync.c',
+        'src/core/lib/support/sync_posix.c',
+        'src/core/lib/support/sync_windows.c',
+        'src/core/lib/support/thd.c',
+        'src/core/lib/support/thd_posix.c',
+        'src/core/lib/support/thd_windows.c',
+        'src/core/lib/support/time.c',
+        'src/core/lib/support/time_posix.c',
+        'src/core/lib/support/time_precise.c',
+        'src/core/lib/support/time_windows.c',
+        'src/core/lib/support/tls_pthread.c',
+        'src/core/lib/support/tmpfile_msys.c',
+        'src/core/lib/support/tmpfile_posix.c',
+        'src/core/lib/support/tmpfile_windows.c',
+        'src/core/lib/support/wrap_memcpy.c',
+      ],
+    },
+    {
+      'target_name': 'gpr_test_util',
+      'type': 'static_library',
+      'dependencies': [
+        'gpr',
+      ],
+      'sources': [
+        'test/core/util/test_config.c',
+      ],
+    },
+    {
+      'target_name': 'grpc',
+      'type': 'static_library',
+      'dependencies': [
+        'gpr',
+      ],
+      'sources': [
+        'src/core/lib/surface/init.c',
+        'src/core/lib/channel/channel_args.c',
+        'src/core/lib/channel/channel_stack.c',
+        'src/core/lib/channel/channel_stack_builder.c',
+        'src/core/lib/channel/connected_channel.c',
+        'src/core/lib/channel/handshaker.c',
+        'src/core/lib/channel/handshaker_factory.c',
+        'src/core/lib/channel/handshaker_registry.c',
+        'src/core/lib/compression/compression.c',
+        'src/core/lib/compression/message_compress.c',
+        'src/core/lib/compression/stream_compression.c',
+        'src/core/lib/http/format_request.c',
+        'src/core/lib/http/httpcli.c',
+        'src/core/lib/http/parser.c',
+        'src/core/lib/iomgr/closure.c',
+        'src/core/lib/iomgr/combiner.c',
+        'src/core/lib/iomgr/endpoint.c',
+        'src/core/lib/iomgr/endpoint_pair_posix.c',
+        'src/core/lib/iomgr/endpoint_pair_uv.c',
+        'src/core/lib/iomgr/endpoint_pair_windows.c',
+        'src/core/lib/iomgr/error.c',
+        'src/core/lib/iomgr/ev_epoll1_linux.c',
+        'src/core/lib/iomgr/ev_epoll_limited_pollers_linux.c',
+        'src/core/lib/iomgr/ev_epoll_thread_pool_linux.c',
+        'src/core/lib/iomgr/ev_epollex_linux.c',
+        'src/core/lib/iomgr/ev_epollsig_linux.c',
+        'src/core/lib/iomgr/ev_poll_posix.c',
+        'src/core/lib/iomgr/ev_posix.c',
+        'src/core/lib/iomgr/ev_windows.c',
+        'src/core/lib/iomgr/exec_ctx.c',
+        'src/core/lib/iomgr/executor.c',
+        'src/core/lib/iomgr/gethostname_fallback.c',
+        'src/core/lib/iomgr/gethostname_host_name_max.c',
+        'src/core/lib/iomgr/gethostname_sysconf.c',
+        'src/core/lib/iomgr/iocp_windows.c',
+        'src/core/lib/iomgr/iomgr.c',
+        'src/core/lib/iomgr/iomgr_posix.c',
+        'src/core/lib/iomgr/iomgr_uv.c',
+        'src/core/lib/iomgr/iomgr_windows.c',
+        'src/core/lib/iomgr/is_epollexclusive_available.c',
+        'src/core/lib/iomgr/load_file.c',
+        'src/core/lib/iomgr/lockfree_event.c',
+        'src/core/lib/iomgr/network_status_tracker.c',
+        'src/core/lib/iomgr/polling_entity.c',
+        'src/core/lib/iomgr/pollset_set_uv.c',
+        'src/core/lib/iomgr/pollset_set_windows.c',
+        'src/core/lib/iomgr/pollset_uv.c',
+        'src/core/lib/iomgr/pollset_windows.c',
+        'src/core/lib/iomgr/resolve_address_posix.c',
+        'src/core/lib/iomgr/resolve_address_uv.c',
+        'src/core/lib/iomgr/resolve_address_windows.c',
+        'src/core/lib/iomgr/resource_quota.c',
+        'src/core/lib/iomgr/sockaddr_utils.c',
+        'src/core/lib/iomgr/socket_factory_posix.c',
+        'src/core/lib/iomgr/socket_mutator.c',
+        'src/core/lib/iomgr/socket_utils_common_posix.c',
+        'src/core/lib/iomgr/socket_utils_linux.c',
+        'src/core/lib/iomgr/socket_utils_posix.c',
+        'src/core/lib/iomgr/socket_utils_uv.c',
+        'src/core/lib/iomgr/socket_utils_windows.c',
+        'src/core/lib/iomgr/socket_windows.c',
+        'src/core/lib/iomgr/tcp_client_posix.c',
+        'src/core/lib/iomgr/tcp_client_uv.c',
+        'src/core/lib/iomgr/tcp_client_windows.c',
+        'src/core/lib/iomgr/tcp_posix.c',
+        'src/core/lib/iomgr/tcp_server_posix.c',
+        'src/core/lib/iomgr/tcp_server_utils_posix_common.c',
+        'src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c',
+        'src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c',
+        'src/core/lib/iomgr/tcp_server_uv.c',
+        'src/core/lib/iomgr/tcp_server_windows.c',
+        'src/core/lib/iomgr/tcp_uv.c',
+        'src/core/lib/iomgr/tcp_windows.c',
+        'src/core/lib/iomgr/time_averaged_stats.c',
+        'src/core/lib/iomgr/timer_generic.c',
+        'src/core/lib/iomgr/timer_heap.c',
+        'src/core/lib/iomgr/timer_manager.c',
+        'src/core/lib/iomgr/timer_uv.c',
+        'src/core/lib/iomgr/udp_server.c',
+        'src/core/lib/iomgr/unix_sockets_posix.c',
+        'src/core/lib/iomgr/unix_sockets_posix_noop.c',
+        'src/core/lib/iomgr/wakeup_fd_cv.c',
+        'src/core/lib/iomgr/wakeup_fd_eventfd.c',
+        'src/core/lib/iomgr/wakeup_fd_nospecial.c',
+        'src/core/lib/iomgr/wakeup_fd_pipe.c',
+        'src/core/lib/iomgr/wakeup_fd_posix.c',
+        'src/core/lib/json/json.c',
+        'src/core/lib/json/json_reader.c',
+        'src/core/lib/json/json_string.c',
+        'src/core/lib/json/json_writer.c',
+        'src/core/lib/slice/b64.c',
+        'src/core/lib/slice/percent_encoding.c',
+        'src/core/lib/slice/slice.c',
+        'src/core/lib/slice/slice_buffer.c',
+        'src/core/lib/slice/slice_hash_table.c',
+        'src/core/lib/slice/slice_intern.c',
+        'src/core/lib/slice/slice_string_helpers.c',
+        'src/core/lib/surface/alarm.c',
+        'src/core/lib/surface/api_trace.c',
+        'src/core/lib/surface/byte_buffer.c',
+        'src/core/lib/surface/byte_buffer_reader.c',
+        'src/core/lib/surface/call.c',
+        'src/core/lib/surface/call_details.c',
+        'src/core/lib/surface/call_log_batch.c',
+        'src/core/lib/surface/channel.c',
+        'src/core/lib/surface/channel_init.c',
+        'src/core/lib/surface/channel_ping.c',
+        'src/core/lib/surface/channel_stack_type.c',
+        'src/core/lib/surface/completion_queue.c',
+        'src/core/lib/surface/completion_queue_factory.c',
+        'src/core/lib/surface/event_string.c',
+        'src/core/lib/surface/lame_client.cc',
+        'src/core/lib/surface/metadata_array.c',
+        'src/core/lib/surface/server.c',
+        'src/core/lib/surface/validate_metadata.c',
+        'src/core/lib/surface/version.c',
+        'src/core/lib/transport/bdp_estimator.c',
+        'src/core/lib/transport/byte_stream.c',
+        'src/core/lib/transport/connectivity_state.c',
+        'src/core/lib/transport/error_utils.c',
+        'src/core/lib/transport/metadata.c',
+        'src/core/lib/transport/metadata_batch.c',
+        'src/core/lib/transport/pid_controller.c',
+        'src/core/lib/transport/service_config.c',
+        'src/core/lib/transport/static_metadata.c',
+        'src/core/lib/transport/status_conversion.c',
+        'src/core/lib/transport/timeout_encoding.c',
+        'src/core/lib/transport/transport.c',
+        'src/core/lib/transport/transport_op_string.c',
+        'src/core/lib/debug/trace.c',
+        'src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.c',
+        'src/core/ext/transport/chttp2/transport/bin_decoder.c',
+        'src/core/ext/transport/chttp2/transport/bin_encoder.c',
+        'src/core/ext/transport/chttp2/transport/chttp2_plugin.c',
+        'src/core/ext/transport/chttp2/transport/chttp2_transport.c',
+        'src/core/ext/transport/chttp2/transport/flow_control.c',
+        'src/core/ext/transport/chttp2/transport/frame_data.c',
+        'src/core/ext/transport/chttp2/transport/frame_goaway.c',
+        'src/core/ext/transport/chttp2/transport/frame_ping.c',
+        'src/core/ext/transport/chttp2/transport/frame_rst_stream.c',
+        'src/core/ext/transport/chttp2/transport/frame_settings.c',
+        'src/core/ext/transport/chttp2/transport/frame_window_update.c',
+        'src/core/ext/transport/chttp2/transport/hpack_encoder.c',
+        'src/core/ext/transport/chttp2/transport/hpack_parser.c',
+        'src/core/ext/transport/chttp2/transport/hpack_table.c',
+        'src/core/ext/transport/chttp2/transport/http2_settings.c',
+        'src/core/ext/transport/chttp2/transport/huffsyms.c',
+        'src/core/ext/transport/chttp2/transport/incoming_metadata.c',
+        'src/core/ext/transport/chttp2/transport/parsing.c',
+        'src/core/ext/transport/chttp2/transport/stream_lists.c',
+        'src/core/ext/transport/chttp2/transport/stream_map.c',
+        'src/core/ext/transport/chttp2/transport/varint.c',
+        'src/core/ext/transport/chttp2/transport/writing.c',
+        'src/core/ext/transport/chttp2/alpn/alpn.c',
+        'src/core/ext/filters/http/client/http_client_filter.c',
+        'src/core/ext/filters/http/http_filters_plugin.c',
+        'src/core/ext/filters/http/message_compress/message_compress_filter.c',
+        'src/core/ext/filters/http/server/http_server_filter.c',
+        'src/core/lib/http/httpcli_security_connector.c',
+        'src/core/lib/security/context/security_context.c',
+        'src/core/lib/security/credentials/composite/composite_credentials.c',
+        'src/core/lib/security/credentials/credentials.c',
+        'src/core/lib/security/credentials/credentials_metadata.c',
+        'src/core/lib/security/credentials/fake/fake_credentials.c',
+        'src/core/lib/security/credentials/google_default/credentials_generic.c',
+        'src/core/lib/security/credentials/google_default/google_default_credentials.c',
+        'src/core/lib/security/credentials/iam/iam_credentials.c',
+        'src/core/lib/security/credentials/jwt/json_token.c',
+        'src/core/lib/security/credentials/jwt/jwt_credentials.c',
+        'src/core/lib/security/credentials/jwt/jwt_verifier.c',
+        'src/core/lib/security/credentials/oauth2/oauth2_credentials.c',
+        'src/core/lib/security/credentials/plugin/plugin_credentials.c',
+        'src/core/lib/security/credentials/ssl/ssl_credentials.c',
+        'src/core/lib/security/transport/client_auth_filter.c',
+        'src/core/lib/security/transport/lb_targets_info.c',
+        'src/core/lib/security/transport/secure_endpoint.c',
+        'src/core/lib/security/transport/security_connector.c',
+        'src/core/lib/security/transport/security_handshaker.c',
+        'src/core/lib/security/transport/server_auth_filter.c',
+        'src/core/lib/security/transport/tsi_error.c',
+        'src/core/lib/security/util/json_util.c',
+        'src/core/lib/surface/init_secure.c',
+        'src/core/tsi/fake_transport_security.c',
+        'src/core/tsi/gts_transport_security.c',
+        'src/core/tsi/ssl_transport_security.c',
+        'src/core/tsi/transport_security_grpc.c',
+        'src/core/tsi/transport_security.c',
+        'src/core/tsi/transport_security_adapter.c',
+        'src/core/ext/transport/chttp2/server/chttp2_server.c',
+        'src/core/ext/transport/chttp2/client/secure/secure_channel_create.c',
+        'src/core/ext/filters/client_channel/channel_connectivity.c',
+        'src/core/ext/filters/client_channel/client_channel.c',
+        'src/core/ext/filters/client_channel/client_channel_factory.c',
+        'src/core/ext/filters/client_channel/client_channel_plugin.c',
+        'src/core/ext/filters/client_channel/connector.c',
+        'src/core/ext/filters/client_channel/http_connect_handshaker.c',
+        'src/core/ext/filters/client_channel/http_proxy.c',
+        'src/core/ext/filters/client_channel/lb_policy.c',
+        'src/core/ext/filters/client_channel/lb_policy_factory.c',
+        'src/core/ext/filters/client_channel/lb_policy_registry.c',
+        'src/core/ext/filters/client_channel/parse_address.c',
+        'src/core/ext/filters/client_channel/proxy_mapper.c',
+        'src/core/ext/filters/client_channel/proxy_mapper_registry.c',
+        'src/core/ext/filters/client_channel/resolver.c',
+        'src/core/ext/filters/client_channel/resolver_factory.c',
+        'src/core/ext/filters/client_channel/resolver_registry.c',
+        'src/core/ext/filters/client_channel/retry_throttle.c',
+        'src/core/ext/filters/client_channel/subchannel.c',
+        'src/core/ext/filters/client_channel/subchannel_index.c',
+        'src/core/ext/filters/client_channel/uri_parser.c',
+        'src/core/ext/filters/deadline/deadline_filter.c',
+        'src/core/ext/transport/chttp2/client/chttp2_connector.c',
+        'src/core/ext/transport/chttp2/server/insecure/server_chttp2.c',
+        'src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.c',
+        'src/core/ext/transport/chttp2/client/insecure/channel_create.c',
+        'src/core/ext/transport/chttp2/client/insecure/channel_create_posix.c',
+        'src/core/ext/transport/inproc/inproc_plugin.c',
+        'src/core/ext/transport/inproc/inproc_transport.c',
+        'src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.c',
+        'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.c',
+        'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.c',
+        'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.c',
+        'src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.c',
+        'src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c',
+        'third_party/nanopb/pb_common.c',
+        'third_party/nanopb/pb_decode.c',
+        'third_party/nanopb/pb_encode.c',
+        'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.c',
+        'src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.c',
+        'src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.c',
+        'src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.c',
+        'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.c',
+        'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.c',
+        'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.c',
+        'src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.c',
+        'src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.c',
+        'src/core/ext/filters/load_reporting/load_reporting.c',
+        'src/core/ext/filters/load_reporting/load_reporting_filter.c',
+        'src/core/ext/census/base_resources.c',
+        'src/core/ext/census/context.c',
+        'src/core/ext/census/gen/census.pb.c',
+        'src/core/ext/census/gen/trace_context.pb.c',
+        'src/core/ext/census/grpc_context.c',
+        'src/core/ext/census/grpc_filter.c',
+        'src/core/ext/census/grpc_plugin.c',
+        'src/core/ext/census/initialize.c',
+        'src/core/ext/census/intrusive_hash_map.c',
+        'src/core/ext/census/mlog.c',
+        'src/core/ext/census/operation.c',
+        'src/core/ext/census/placeholders.c',
+        'src/core/ext/census/resource.c',
+        'src/core/ext/census/trace_context.c',
+        'src/core/ext/census/tracing.c',
+        'src/core/ext/filters/max_age/max_age_filter.c',
+        'src/core/ext/filters/message_size/message_size_filter.c',
+        'src/core/ext/filters/workarounds/workaround_cronet_compression_filter.c',
+        'src/core/ext/filters/workarounds/workaround_utils.c',
+        'src/core/plugin_registry/grpc_plugin_registry.c',
+      ],
+    },
+    {
+      'target_name': 'grpc_dll',
+      'type': 'static_library',
+      'dependencies': [
+        'gpr',
+        'grpc',
+      ],
+      'sources': [
+      ],
+    },
+    {
+      'target_name': 'grpc_test_util',
+      'type': 'static_library',
+      'dependencies': [
+        'gpr_test_util',
+        'gpr',
+        'grpc',
+      ],
+      'sources': [
+        'test/core/end2end/data/client_certs.c',
+        'test/core/end2end/data/server1_cert.c',
+        'test/core/end2end/data/server1_key.c',
+        'test/core/end2end/data/test_root_cert.c',
+        'test/core/security/oauth2_utils.c',
+        'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.c',
+        'test/core/end2end/cq_verifier.c',
+        'test/core/end2end/fixtures/http_proxy_fixture.c',
+        'test/core/end2end/fixtures/proxy.c',
+        'test/core/iomgr/endpoint_tests.c',
+        'test/core/util/debugger_macros.c',
+        'test/core/util/grpc_profiler.c',
+        'test/core/util/memory_counters.c',
+        'test/core/util/mock_endpoint.c',
+        'test/core/util/parse_hexstring.c',
+        'test/core/util/passthru_endpoint.c',
+        'test/core/util/port.c',
+        'test/core/util/port_server_client.c',
+        'test/core/util/slice_splitter.c',
+        'test/core/util/trickle_endpoint.c',
+        'src/core/lib/channel/channel_args.c',
+        'src/core/lib/channel/channel_stack.c',
+        'src/core/lib/channel/channel_stack_builder.c',
+        'src/core/lib/channel/connected_channel.c',
+        'src/core/lib/channel/handshaker.c',
+        'src/core/lib/channel/handshaker_factory.c',
+        'src/core/lib/channel/handshaker_registry.c',
+        'src/core/lib/compression/compression.c',
+        'src/core/lib/compression/message_compress.c',
+        'src/core/lib/compression/stream_compression.c',
+        'src/core/lib/http/format_request.c',
+        'src/core/lib/http/httpcli.c',
+        'src/core/lib/http/parser.c',
+        'src/core/lib/iomgr/closure.c',
+        'src/core/lib/iomgr/combiner.c',
+        'src/core/lib/iomgr/endpoint.c',
+        'src/core/lib/iomgr/endpoint_pair_posix.c',
+        'src/core/lib/iomgr/endpoint_pair_uv.c',
+        'src/core/lib/iomgr/endpoint_pair_windows.c',
+        'src/core/lib/iomgr/error.c',
+        'src/core/lib/iomgr/ev_epoll1_linux.c',
+        'src/core/lib/iomgr/ev_epoll_limited_pollers_linux.c',
+        'src/core/lib/iomgr/ev_epoll_thread_pool_linux.c',
+        'src/core/lib/iomgr/ev_epollex_linux.c',
+        'src/core/lib/iomgr/ev_epollsig_linux.c',
+        'src/core/lib/iomgr/ev_poll_posix.c',
+        'src/core/lib/iomgr/ev_posix.c',
+        'src/core/lib/iomgr/ev_windows.c',
+        'src/core/lib/iomgr/exec_ctx.c',
+        'src/core/lib/iomgr/executor.c',
+        'src/core/lib/iomgr/gethostname_fallback.c',
+        'src/core/lib/iomgr/gethostname_host_name_max.c',
+        'src/core/lib/iomgr/gethostname_sysconf.c',
+        'src/core/lib/iomgr/iocp_windows.c',
+        'src/core/lib/iomgr/iomgr.c',
+        'src/core/lib/iomgr/iomgr_posix.c',
+        'src/core/lib/iomgr/iomgr_uv.c',
+        'src/core/lib/iomgr/iomgr_windows.c',
+        'src/core/lib/iomgr/is_epollexclusive_available.c',
+        'src/core/lib/iomgr/load_file.c',
+        'src/core/lib/iomgr/lockfree_event.c',
+        'src/core/lib/iomgr/network_status_tracker.c',
+        'src/core/lib/iomgr/polling_entity.c',
+        'src/core/lib/iomgr/pollset_set_uv.c',
+        'src/core/lib/iomgr/pollset_set_windows.c',
+        'src/core/lib/iomgr/pollset_uv.c',
+        'src/core/lib/iomgr/pollset_windows.c',
+        'src/core/lib/iomgr/resolve_address_posix.c',
+        'src/core/lib/iomgr/resolve_address_uv.c',
+        'src/core/lib/iomgr/resolve_address_windows.c',
+        'src/core/lib/iomgr/resource_quota.c',
+        'src/core/lib/iomgr/sockaddr_utils.c',
+        'src/core/lib/iomgr/socket_factory_posix.c',
+        'src/core/lib/iomgr/socket_mutator.c',
+        'src/core/lib/iomgr/socket_utils_common_posix.c',
+        'src/core/lib/iomgr/socket_utils_linux.c',
+        'src/core/lib/iomgr/socket_utils_posix.c',
+        'src/core/lib/iomgr/socket_utils_uv.c',
+        'src/core/lib/iomgr/socket_utils_windows.c',
+        'src/core/lib/iomgr/socket_windows.c',
+        'src/core/lib/iomgr/tcp_client_posix.c',
+        'src/core/lib/iomgr/tcp_client_uv.c',
+        'src/core/lib/iomgr/tcp_client_windows.c',
+        'src/core/lib/iomgr/tcp_posix.c',
+        'src/core/lib/iomgr/tcp_server_posix.c',
+        'src/core/lib/iomgr/tcp_server_utils_posix_common.c',
+        'src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c',
+        'src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c',
+        'src/core/lib/iomgr/tcp_server_uv.c',
+        'src/core/lib/iomgr/tcp_server_windows.c',
+        'src/core/lib/iomgr/tcp_uv.c',
+        'src/core/lib/iomgr/tcp_windows.c',
+        'src/core/lib/iomgr/time_averaged_stats.c',
+        'src/core/lib/iomgr/timer_generic.c',
+        'src/core/lib/iomgr/timer_heap.c',
+        'src/core/lib/iomgr/timer_manager.c',
+        'src/core/lib/iomgr/timer_uv.c',
+        'src/core/lib/iomgr/udp_server.c',
+        'src/core/lib/iomgr/unix_sockets_posix.c',
+        'src/core/lib/iomgr/unix_sockets_posix_noop.c',
+        'src/core/lib/iomgr/wakeup_fd_cv.c',
+        'src/core/lib/iomgr/wakeup_fd_eventfd.c',
+        'src/core/lib/iomgr/wakeup_fd_nospecial.c',
+        'src/core/lib/iomgr/wakeup_fd_pipe.c',
+        'src/core/lib/iomgr/wakeup_fd_posix.c',
+        'src/core/lib/json/json.c',
+        'src/core/lib/json/json_reader.c',
+        'src/core/lib/json/json_string.c',
+        'src/core/lib/json/json_writer.c',
+        'src/core/lib/slice/b64.c',
+        'src/core/lib/slice/percent_encoding.c',
+        'src/core/lib/slice/slice.c',
+        'src/core/lib/slice/slice_buffer.c',
+        'src/core/lib/slice/slice_hash_table.c',
+        'src/core/lib/slice/slice_intern.c',
+        'src/core/lib/slice/slice_string_helpers.c',
+        'src/core/lib/surface/alarm.c',
+        'src/core/lib/surface/api_trace.c',
+        'src/core/lib/surface/byte_buffer.c',
+        'src/core/lib/surface/byte_buffer_reader.c',
+        'src/core/lib/surface/call.c',
+        'src/core/lib/surface/call_details.c',
+        'src/core/lib/surface/call_log_batch.c',
+        'src/core/lib/surface/channel.c',
+        'src/core/lib/surface/channel_init.c',
+        'src/core/lib/surface/channel_ping.c',
+        'src/core/lib/surface/channel_stack_type.c',
+        'src/core/lib/surface/completion_queue.c',
+        'src/core/lib/surface/completion_queue_factory.c',
+        'src/core/lib/surface/event_string.c',
+        'src/core/lib/surface/lame_client.cc',
+        'src/core/lib/surface/metadata_array.c',
+        'src/core/lib/surface/server.c',
+        'src/core/lib/surface/validate_metadata.c',
+        'src/core/lib/surface/version.c',
+        'src/core/lib/transport/bdp_estimator.c',
+        'src/core/lib/transport/byte_stream.c',
+        'src/core/lib/transport/connectivity_state.c',
+        'src/core/lib/transport/error_utils.c',
+        'src/core/lib/transport/metadata.c',
+        'src/core/lib/transport/metadata_batch.c',
+        'src/core/lib/transport/pid_controller.c',
+        'src/core/lib/transport/service_config.c',
+        'src/core/lib/transport/static_metadata.c',
+        'src/core/lib/transport/status_conversion.c',
+        'src/core/lib/transport/timeout_encoding.c',
+        'src/core/lib/transport/transport.c',
+        'src/core/lib/transport/transport_op_string.c',
+        'src/core/lib/debug/trace.c',
+        'src/core/ext/filters/client_channel/channel_connectivity.c',
+        'src/core/ext/filters/client_channel/client_channel.c',
+        'src/core/ext/filters/client_channel/client_channel_factory.c',
+        'src/core/ext/filters/client_channel/client_channel_plugin.c',
+        'src/core/ext/filters/client_channel/connector.c',
+        'src/core/ext/filters/client_channel/http_connect_handshaker.c',
+        'src/core/ext/filters/client_channel/http_proxy.c',
+        'src/core/ext/filters/client_channel/lb_policy.c',
+        'src/core/ext/filters/client_channel/lb_policy_factory.c',
+        'src/core/ext/filters/client_channel/lb_policy_registry.c',
+        'src/core/ext/filters/client_channel/parse_address.c',
+        'src/core/ext/filters/client_channel/proxy_mapper.c',
+        'src/core/ext/filters/client_channel/proxy_mapper_registry.c',
+        'src/core/ext/filters/client_channel/resolver.c',
+        'src/core/ext/filters/client_channel/resolver_factory.c',
+        'src/core/ext/filters/client_channel/resolver_registry.c',
+        'src/core/ext/filters/client_channel/retry_throttle.c',
+        'src/core/ext/filters/client_channel/subchannel.c',
+        'src/core/ext/filters/client_channel/subchannel_index.c',
+        'src/core/ext/filters/client_channel/uri_parser.c',
+        'src/core/ext/filters/deadline/deadline_filter.c',
+        'src/core/ext/transport/chttp2/transport/bin_decoder.c',
+        'src/core/ext/transport/chttp2/transport/bin_encoder.c',
+        'src/core/ext/transport/chttp2/transport/chttp2_plugin.c',
+        'src/core/ext/transport/chttp2/transport/chttp2_transport.c',
+        'src/core/ext/transport/chttp2/transport/flow_control.c',
+        'src/core/ext/transport/chttp2/transport/frame_data.c',
+        'src/core/ext/transport/chttp2/transport/frame_goaway.c',
+        'src/core/ext/transport/chttp2/transport/frame_ping.c',
+        'src/core/ext/transport/chttp2/transport/frame_rst_stream.c',
+        'src/core/ext/transport/chttp2/transport/frame_settings.c',
+        'src/core/ext/transport/chttp2/transport/frame_window_update.c',
+        'src/core/ext/transport/chttp2/transport/hpack_encoder.c',
+        'src/core/ext/transport/chttp2/transport/hpack_parser.c',
+        'src/core/ext/transport/chttp2/transport/hpack_table.c',
+        'src/core/ext/transport/chttp2/transport/http2_settings.c',
+        'src/core/ext/transport/chttp2/transport/huffsyms.c',
+        'src/core/ext/transport/chttp2/transport/incoming_metadata.c',
+        'src/core/ext/transport/chttp2/transport/parsing.c',
+        'src/core/ext/transport/chttp2/transport/stream_lists.c',
+        'src/core/ext/transport/chttp2/transport/stream_map.c',
+        'src/core/ext/transport/chttp2/transport/varint.c',
+        'src/core/ext/transport/chttp2/transport/writing.c',
+        'src/core/ext/transport/chttp2/alpn/alpn.c',
+        'src/core/ext/filters/http/client/http_client_filter.c',
+        'src/core/ext/filters/http/http_filters_plugin.c',
+        'src/core/ext/filters/http/message_compress/message_compress_filter.c',
+        'src/core/ext/filters/http/server/http_server_filter.c',
+      ],
+    },
+    {
+      'target_name': 'grpc_test_util_unsecure',
+      'type': 'static_library',
+      'dependencies': [
+        'gpr',
+        'gpr_test_util',
+        'grpc_unsecure',
+      ],
+      'sources': [
+        'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.c',
+        'test/core/end2end/cq_verifier.c',
+        'test/core/end2end/fixtures/http_proxy_fixture.c',
+        'test/core/end2end/fixtures/proxy.c',
+        'test/core/iomgr/endpoint_tests.c',
+        'test/core/util/debugger_macros.c',
+        'test/core/util/grpc_profiler.c',
+        'test/core/util/memory_counters.c',
+        'test/core/util/mock_endpoint.c',
+        'test/core/util/parse_hexstring.c',
+        'test/core/util/passthru_endpoint.c',
+        'test/core/util/port.c',
+        'test/core/util/port_server_client.c',
+        'test/core/util/slice_splitter.c',
+        'test/core/util/trickle_endpoint.c',
+        'src/core/lib/channel/channel_args.c',
+        'src/core/lib/channel/channel_stack.c',
+        'src/core/lib/channel/channel_stack_builder.c',
+        'src/core/lib/channel/connected_channel.c',
+        'src/core/lib/channel/handshaker.c',
+        'src/core/lib/channel/handshaker_factory.c',
+        'src/core/lib/channel/handshaker_registry.c',
+        'src/core/lib/compression/compression.c',
+        'src/core/lib/compression/message_compress.c',
+        'src/core/lib/compression/stream_compression.c',
+        'src/core/lib/http/format_request.c',
+        'src/core/lib/http/httpcli.c',
+        'src/core/lib/http/parser.c',
+        'src/core/lib/iomgr/closure.c',
+        'src/core/lib/iomgr/combiner.c',
+        'src/core/lib/iomgr/endpoint.c',
+        'src/core/lib/iomgr/endpoint_pair_posix.c',
+        'src/core/lib/iomgr/endpoint_pair_uv.c',
+        'src/core/lib/iomgr/endpoint_pair_windows.c',
+        'src/core/lib/iomgr/error.c',
+        'src/core/lib/iomgr/ev_epoll1_linux.c',
+        'src/core/lib/iomgr/ev_epoll_limited_pollers_linux.c',
+        'src/core/lib/iomgr/ev_epoll_thread_pool_linux.c',
+        'src/core/lib/iomgr/ev_epollex_linux.c',
+        'src/core/lib/iomgr/ev_epollsig_linux.c',
+        'src/core/lib/iomgr/ev_poll_posix.c',
+        'src/core/lib/iomgr/ev_posix.c',
+        'src/core/lib/iomgr/ev_windows.c',
+        'src/core/lib/iomgr/exec_ctx.c',
+        'src/core/lib/iomgr/executor.c',
+        'src/core/lib/iomgr/gethostname_fallback.c',
+        'src/core/lib/iomgr/gethostname_host_name_max.c',
+        'src/core/lib/iomgr/gethostname_sysconf.c',
+        'src/core/lib/iomgr/iocp_windows.c',
+        'src/core/lib/iomgr/iomgr.c',
+        'src/core/lib/iomgr/iomgr_posix.c',
+        'src/core/lib/iomgr/iomgr_uv.c',
+        'src/core/lib/iomgr/iomgr_windows.c',
+        'src/core/lib/iomgr/is_epollexclusive_available.c',
+        'src/core/lib/iomgr/load_file.c',
+        'src/core/lib/iomgr/lockfree_event.c',
+        'src/core/lib/iomgr/network_status_tracker.c',
+        'src/core/lib/iomgr/polling_entity.c',
+        'src/core/lib/iomgr/pollset_set_uv.c',
+        'src/core/lib/iomgr/pollset_set_windows.c',
+        'src/core/lib/iomgr/pollset_uv.c',
+        'src/core/lib/iomgr/pollset_windows.c',
+        'src/core/lib/iomgr/resolve_address_posix.c',
+        'src/core/lib/iomgr/resolve_address_uv.c',
+        'src/core/lib/iomgr/resolve_address_windows.c',
+        'src/core/lib/iomgr/resource_quota.c',
+        'src/core/lib/iomgr/sockaddr_utils.c',
+        'src/core/lib/iomgr/socket_factory_posix.c',
+        'src/core/lib/iomgr/socket_mutator.c',
+        'src/core/lib/iomgr/socket_utils_common_posix.c',
+        'src/core/lib/iomgr/socket_utils_linux.c',
+        'src/core/lib/iomgr/socket_utils_posix.c',
+        'src/core/lib/iomgr/socket_utils_uv.c',
+        'src/core/lib/iomgr/socket_utils_windows.c',
+        'src/core/lib/iomgr/socket_windows.c',
+        'src/core/lib/iomgr/tcp_client_posix.c',
+        'src/core/lib/iomgr/tcp_client_uv.c',
+        'src/core/lib/iomgr/tcp_client_windows.c',
+        'src/core/lib/iomgr/tcp_posix.c',
+        'src/core/lib/iomgr/tcp_server_posix.c',
+        'src/core/lib/iomgr/tcp_server_utils_posix_common.c',
+        'src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c',
+        'src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c',
+        'src/core/lib/iomgr/tcp_server_uv.c',
+        'src/core/lib/iomgr/tcp_server_windows.c',
+        'src/core/lib/iomgr/tcp_uv.c',
+        'src/core/lib/iomgr/tcp_windows.c',
+        'src/core/lib/iomgr/time_averaged_stats.c',
+        'src/core/lib/iomgr/timer_generic.c',
+        'src/core/lib/iomgr/timer_heap.c',
+        'src/core/lib/iomgr/timer_manager.c',
+        'src/core/lib/iomgr/timer_uv.c',
+        'src/core/lib/iomgr/udp_server.c',
+        'src/core/lib/iomgr/unix_sockets_posix.c',
+        'src/core/lib/iomgr/unix_sockets_posix_noop.c',
+        'src/core/lib/iomgr/wakeup_fd_cv.c',
+        'src/core/lib/iomgr/wakeup_fd_eventfd.c',
+        'src/core/lib/iomgr/wakeup_fd_nospecial.c',
+        'src/core/lib/iomgr/wakeup_fd_pipe.c',
+        'src/core/lib/iomgr/wakeup_fd_posix.c',
+        'src/core/lib/json/json.c',
+        'src/core/lib/json/json_reader.c',
+        'src/core/lib/json/json_string.c',
+        'src/core/lib/json/json_writer.c',
+        'src/core/lib/slice/b64.c',
+        'src/core/lib/slice/percent_encoding.c',
+        'src/core/lib/slice/slice.c',
+        'src/core/lib/slice/slice_buffer.c',
+        'src/core/lib/slice/slice_hash_table.c',
+        'src/core/lib/slice/slice_intern.c',
+        'src/core/lib/slice/slice_string_helpers.c',
+        'src/core/lib/surface/alarm.c',
+        'src/core/lib/surface/api_trace.c',
+        'src/core/lib/surface/byte_buffer.c',
+        'src/core/lib/surface/byte_buffer_reader.c',
+        'src/core/lib/surface/call.c',
+        'src/core/lib/surface/call_details.c',
+        'src/core/lib/surface/call_log_batch.c',
+        'src/core/lib/surface/channel.c',
+        'src/core/lib/surface/channel_init.c',
+        'src/core/lib/surface/channel_ping.c',
+        'src/core/lib/surface/channel_stack_type.c',
+        'src/core/lib/surface/completion_queue.c',
+        'src/core/lib/surface/completion_queue_factory.c',
+        'src/core/lib/surface/event_string.c',
+        'src/core/lib/surface/lame_client.cc',
+        'src/core/lib/surface/metadata_array.c',
+        'src/core/lib/surface/server.c',
+        'src/core/lib/surface/validate_metadata.c',
+        'src/core/lib/surface/version.c',
+        'src/core/lib/transport/bdp_estimator.c',
+        'src/core/lib/transport/byte_stream.c',
+        'src/core/lib/transport/connectivity_state.c',
+        'src/core/lib/transport/error_utils.c',
+        'src/core/lib/transport/metadata.c',
+        'src/core/lib/transport/metadata_batch.c',
+        'src/core/lib/transport/pid_controller.c',
+        'src/core/lib/transport/service_config.c',
+        'src/core/lib/transport/static_metadata.c',
+        'src/core/lib/transport/status_conversion.c',
+        'src/core/lib/transport/timeout_encoding.c',
+        'src/core/lib/transport/transport.c',
+        'src/core/lib/transport/transport_op_string.c',
+        'src/core/lib/debug/trace.c',
+        'src/core/ext/filters/client_channel/channel_connectivity.c',
+        'src/core/ext/filters/client_channel/client_channel.c',
+        'src/core/ext/filters/client_channel/client_channel_factory.c',
+        'src/core/ext/filters/client_channel/client_channel_plugin.c',
+        'src/core/ext/filters/client_channel/connector.c',
+        'src/core/ext/filters/client_channel/http_connect_handshaker.c',
+        'src/core/ext/filters/client_channel/http_proxy.c',
+        'src/core/ext/filters/client_channel/lb_policy.c',
+        'src/core/ext/filters/client_channel/lb_policy_factory.c',
+        'src/core/ext/filters/client_channel/lb_policy_registry.c',
+        'src/core/ext/filters/client_channel/parse_address.c',
+        'src/core/ext/filters/client_channel/proxy_mapper.c',
+        'src/core/ext/filters/client_channel/proxy_mapper_registry.c',
+        'src/core/ext/filters/client_channel/resolver.c',
+        'src/core/ext/filters/client_channel/resolver_factory.c',
+        'src/core/ext/filters/client_channel/resolver_registry.c',
+        'src/core/ext/filters/client_channel/retry_throttle.c',
+        'src/core/ext/filters/client_channel/subchannel.c',
+        'src/core/ext/filters/client_channel/subchannel_index.c',
+        'src/core/ext/filters/client_channel/uri_parser.c',
+        'src/core/ext/filters/deadline/deadline_filter.c',
+        'src/core/ext/transport/chttp2/transport/bin_decoder.c',
+        'src/core/ext/transport/chttp2/transport/bin_encoder.c',
+        'src/core/ext/transport/chttp2/transport/chttp2_plugin.c',
+        'src/core/ext/transport/chttp2/transport/chttp2_transport.c',
+        'src/core/ext/transport/chttp2/transport/flow_control.c',
+        'src/core/ext/transport/chttp2/transport/frame_data.c',
+        'src/core/ext/transport/chttp2/transport/frame_goaway.c',
+        'src/core/ext/transport/chttp2/transport/frame_ping.c',
+        'src/core/ext/transport/chttp2/transport/frame_rst_stream.c',
+        'src/core/ext/transport/chttp2/transport/frame_settings.c',
+        'src/core/ext/transport/chttp2/transport/frame_window_update.c',
+        'src/core/ext/transport/chttp2/transport/hpack_encoder.c',
+        'src/core/ext/transport/chttp2/transport/hpack_parser.c',
+        'src/core/ext/transport/chttp2/transport/hpack_table.c',
+        'src/core/ext/transport/chttp2/transport/http2_settings.c',
+        'src/core/ext/transport/chttp2/transport/huffsyms.c',
+        'src/core/ext/transport/chttp2/transport/incoming_metadata.c',
+        'src/core/ext/transport/chttp2/transport/parsing.c',
+        'src/core/ext/transport/chttp2/transport/stream_lists.c',
+        'src/core/ext/transport/chttp2/transport/stream_map.c',
+        'src/core/ext/transport/chttp2/transport/varint.c',
+        'src/core/ext/transport/chttp2/transport/writing.c',
+        'src/core/ext/transport/chttp2/alpn/alpn.c',
+        'src/core/ext/filters/http/client/http_client_filter.c',
+        'src/core/ext/filters/http/http_filters_plugin.c',
+        'src/core/ext/filters/http/message_compress/message_compress_filter.c',
+        'src/core/ext/filters/http/server/http_server_filter.c',
+      ],
+    },
+    {
+      'target_name': 'grpc_unsecure',
+      'type': 'static_library',
+      'dependencies': [
+        'gpr',
+      ],
+      'sources': [
+        'src/core/lib/surface/init.c',
+        'src/core/lib/surface/init_unsecure.c',
+        'src/core/lib/channel/channel_args.c',
+        'src/core/lib/channel/channel_stack.c',
+        'src/core/lib/channel/channel_stack_builder.c',
+        'src/core/lib/channel/connected_channel.c',
+        'src/core/lib/channel/handshaker.c',
+        'src/core/lib/channel/handshaker_factory.c',
+        'src/core/lib/channel/handshaker_registry.c',
+        'src/core/lib/compression/compression.c',
+        'src/core/lib/compression/message_compress.c',
+        'src/core/lib/compression/stream_compression.c',
+        'src/core/lib/http/format_request.c',
+        'src/core/lib/http/httpcli.c',
+        'src/core/lib/http/parser.c',
+        'src/core/lib/iomgr/closure.c',
+        'src/core/lib/iomgr/combiner.c',
+        'src/core/lib/iomgr/endpoint.c',
+        'src/core/lib/iomgr/endpoint_pair_posix.c',
+        'src/core/lib/iomgr/endpoint_pair_uv.c',
+        'src/core/lib/iomgr/endpoint_pair_windows.c',
+        'src/core/lib/iomgr/error.c',
+        'src/core/lib/iomgr/ev_epoll1_linux.c',
+        'src/core/lib/iomgr/ev_epoll_limited_pollers_linux.c',
+        'src/core/lib/iomgr/ev_epoll_thread_pool_linux.c',
+        'src/core/lib/iomgr/ev_epollex_linux.c',
+        'src/core/lib/iomgr/ev_epollsig_linux.c',
+        'src/core/lib/iomgr/ev_poll_posix.c',
+        'src/core/lib/iomgr/ev_posix.c',
+        'src/core/lib/iomgr/ev_windows.c',
+        'src/core/lib/iomgr/exec_ctx.c',
+        'src/core/lib/iomgr/executor.c',
+        'src/core/lib/iomgr/gethostname_fallback.c',
+        'src/core/lib/iomgr/gethostname_host_name_max.c',
+        'src/core/lib/iomgr/gethostname_sysconf.c',
+        'src/core/lib/iomgr/iocp_windows.c',
+        'src/core/lib/iomgr/iomgr.c',
+        'src/core/lib/iomgr/iomgr_posix.c',
+        'src/core/lib/iomgr/iomgr_uv.c',
+        'src/core/lib/iomgr/iomgr_windows.c',
+        'src/core/lib/iomgr/is_epollexclusive_available.c',
+        'src/core/lib/iomgr/load_file.c',
+        'src/core/lib/iomgr/lockfree_event.c',
+        'src/core/lib/iomgr/network_status_tracker.c',
+        'src/core/lib/iomgr/polling_entity.c',
+        'src/core/lib/iomgr/pollset_set_uv.c',
+        'src/core/lib/iomgr/pollset_set_windows.c',
+        'src/core/lib/iomgr/pollset_uv.c',
+        'src/core/lib/iomgr/pollset_windows.c',
+        'src/core/lib/iomgr/resolve_address_posix.c',
+        'src/core/lib/iomgr/resolve_address_uv.c',
+        'src/core/lib/iomgr/resolve_address_windows.c',
+        'src/core/lib/iomgr/resource_quota.c',
+        'src/core/lib/iomgr/sockaddr_utils.c',
+        'src/core/lib/iomgr/socket_factory_posix.c',
+        'src/core/lib/iomgr/socket_mutator.c',
+        'src/core/lib/iomgr/socket_utils_common_posix.c',
+        'src/core/lib/iomgr/socket_utils_linux.c',
+        'src/core/lib/iomgr/socket_utils_posix.c',
+        'src/core/lib/iomgr/socket_utils_uv.c',
+        'src/core/lib/iomgr/socket_utils_windows.c',
+        'src/core/lib/iomgr/socket_windows.c',
+        'src/core/lib/iomgr/tcp_client_posix.c',
+        'src/core/lib/iomgr/tcp_client_uv.c',
+        'src/core/lib/iomgr/tcp_client_windows.c',
+        'src/core/lib/iomgr/tcp_posix.c',
+        'src/core/lib/iomgr/tcp_server_posix.c',
+        'src/core/lib/iomgr/tcp_server_utils_posix_common.c',
+        'src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c',
+        'src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c',
+        'src/core/lib/iomgr/tcp_server_uv.c',
+        'src/core/lib/iomgr/tcp_server_windows.c',
+        'src/core/lib/iomgr/tcp_uv.c',
+        'src/core/lib/iomgr/tcp_windows.c',
+        'src/core/lib/iomgr/time_averaged_stats.c',
+        'src/core/lib/iomgr/timer_generic.c',
+        'src/core/lib/iomgr/timer_heap.c',
+        'src/core/lib/iomgr/timer_manager.c',
+        'src/core/lib/iomgr/timer_uv.c',
+        'src/core/lib/iomgr/udp_server.c',
+        'src/core/lib/iomgr/unix_sockets_posix.c',
+        'src/core/lib/iomgr/unix_sockets_posix_noop.c',
+        'src/core/lib/iomgr/wakeup_fd_cv.c',
+        'src/core/lib/iomgr/wakeup_fd_eventfd.c',
+        'src/core/lib/iomgr/wakeup_fd_nospecial.c',
+        'src/core/lib/iomgr/wakeup_fd_pipe.c',
+        'src/core/lib/iomgr/wakeup_fd_posix.c',
+        'src/core/lib/json/json.c',
+        'src/core/lib/json/json_reader.c',
+        'src/core/lib/json/json_string.c',
+        'src/core/lib/json/json_writer.c',
+        'src/core/lib/slice/b64.c',
+        'src/core/lib/slice/percent_encoding.c',
+        'src/core/lib/slice/slice.c',
+        'src/core/lib/slice/slice_buffer.c',
+        'src/core/lib/slice/slice_hash_table.c',
+        'src/core/lib/slice/slice_intern.c',
+        'src/core/lib/slice/slice_string_helpers.c',
+        'src/core/lib/surface/alarm.c',
+        'src/core/lib/surface/api_trace.c',
+        'src/core/lib/surface/byte_buffer.c',
+        'src/core/lib/surface/byte_buffer_reader.c',
+        'src/core/lib/surface/call.c',
+        'src/core/lib/surface/call_details.c',
+        'src/core/lib/surface/call_log_batch.c',
+        'src/core/lib/surface/channel.c',
+        'src/core/lib/surface/channel_init.c',
+        'src/core/lib/surface/channel_ping.c',
+        'src/core/lib/surface/channel_stack_type.c',
+        'src/core/lib/surface/completion_queue.c',
+        'src/core/lib/surface/completion_queue_factory.c',
+        'src/core/lib/surface/event_string.c',
+        'src/core/lib/surface/lame_client.cc',
+        'src/core/lib/surface/metadata_array.c',
+        'src/core/lib/surface/server.c',
+        'src/core/lib/surface/validate_metadata.c',
+        'src/core/lib/surface/version.c',
+        'src/core/lib/transport/bdp_estimator.c',
+        'src/core/lib/transport/byte_stream.c',
+        'src/core/lib/transport/connectivity_state.c',
+        'src/core/lib/transport/error_utils.c',
+        'src/core/lib/transport/metadata.c',
+        'src/core/lib/transport/metadata_batch.c',
+        'src/core/lib/transport/pid_controller.c',
+        'src/core/lib/transport/service_config.c',
+        'src/core/lib/transport/static_metadata.c',
+        'src/core/lib/transport/status_conversion.c',
+        'src/core/lib/transport/timeout_encoding.c',
+        'src/core/lib/transport/transport.c',
+        'src/core/lib/transport/transport_op_string.c',
+        'src/core/lib/debug/trace.c',
+        'src/core/ext/transport/chttp2/server/insecure/server_chttp2.c',
+        'src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.c',
+        'src/core/ext/transport/chttp2/transport/bin_decoder.c',
+        'src/core/ext/transport/chttp2/transport/bin_encoder.c',
+        'src/core/ext/transport/chttp2/transport/chttp2_plugin.c',
+        'src/core/ext/transport/chttp2/transport/chttp2_transport.c',
+        'src/core/ext/transport/chttp2/transport/flow_control.c',
+        'src/core/ext/transport/chttp2/transport/frame_data.c',
+        'src/core/ext/transport/chttp2/transport/frame_goaway.c',
+        'src/core/ext/transport/chttp2/transport/frame_ping.c',
+        'src/core/ext/transport/chttp2/transport/frame_rst_stream.c',
+        'src/core/ext/transport/chttp2/transport/frame_settings.c',
+        'src/core/ext/transport/chttp2/transport/frame_window_update.c',
+        'src/core/ext/transport/chttp2/transport/hpack_encoder.c',
+        'src/core/ext/transport/chttp2/transport/hpack_parser.c',
+        'src/core/ext/transport/chttp2/transport/hpack_table.c',
+        'src/core/ext/transport/chttp2/transport/http2_settings.c',
+        'src/core/ext/transport/chttp2/transport/huffsyms.c',
+        'src/core/ext/transport/chttp2/transport/incoming_metadata.c',
+        'src/core/ext/transport/chttp2/transport/parsing.c',
+        'src/core/ext/transport/chttp2/transport/stream_lists.c',
+        'src/core/ext/transport/chttp2/transport/stream_map.c',
+        'src/core/ext/transport/chttp2/transport/varint.c',
+        'src/core/ext/transport/chttp2/transport/writing.c',
+        'src/core/ext/transport/chttp2/alpn/alpn.c',
+        'src/core/ext/filters/http/client/http_client_filter.c',
+        'src/core/ext/filters/http/http_filters_plugin.c',
+        'src/core/ext/filters/http/message_compress/message_compress_filter.c',
+        'src/core/ext/filters/http/server/http_server_filter.c',
+        'src/core/ext/transport/chttp2/server/chttp2_server.c',
+        'src/core/ext/transport/chttp2/client/insecure/channel_create.c',
+        'src/core/ext/transport/chttp2/client/insecure/channel_create_posix.c',
+        'src/core/ext/transport/chttp2/client/chttp2_connector.c',
+        'src/core/ext/filters/client_channel/channel_connectivity.c',
+        'src/core/ext/filters/client_channel/client_channel.c',
+        'src/core/ext/filters/client_channel/client_channel_factory.c',
+        'src/core/ext/filters/client_channel/client_channel_plugin.c',
+        'src/core/ext/filters/client_channel/connector.c',
+        'src/core/ext/filters/client_channel/http_connect_handshaker.c',
+        'src/core/ext/filters/client_channel/http_proxy.c',
+        'src/core/ext/filters/client_channel/lb_policy.c',
+        'src/core/ext/filters/client_channel/lb_policy_factory.c',
+        'src/core/ext/filters/client_channel/lb_policy_registry.c',
+        'src/core/ext/filters/client_channel/parse_address.c',
+        'src/core/ext/filters/client_channel/proxy_mapper.c',
+        'src/core/ext/filters/client_channel/proxy_mapper_registry.c',
+        'src/core/ext/filters/client_channel/resolver.c',
+        'src/core/ext/filters/client_channel/resolver_factory.c',
+        'src/core/ext/filters/client_channel/resolver_registry.c',
+        'src/core/ext/filters/client_channel/retry_throttle.c',
+        'src/core/ext/filters/client_channel/subchannel.c',
+        'src/core/ext/filters/client_channel/subchannel_index.c',
+        'src/core/ext/filters/client_channel/uri_parser.c',
+        'src/core/ext/filters/deadline/deadline_filter.c',
+        'src/core/ext/transport/inproc/inproc_plugin.c',
+        'src/core/ext/transport/inproc/inproc_transport.c',
+        'src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.c',
+        'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.c',
+        'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.c',
+        'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.c',
+        'src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.c',
+        'src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.c',
+        'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.c',
+        'src/core/ext/filters/load_reporting/load_reporting.c',
+        'src/core/ext/filters/load_reporting/load_reporting_filter.c',
+        'src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.c',
+        'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.c',
+        'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.c',
+        'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.c',
+        'src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.c',
+        'src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c',
+        'third_party/nanopb/pb_common.c',
+        'third_party/nanopb/pb_decode.c',
+        'third_party/nanopb/pb_encode.c',
+        'src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.c',
+        'src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.c',
+        'src/core/ext/census/base_resources.c',
+        'src/core/ext/census/context.c',
+        'src/core/ext/census/gen/census.pb.c',
+        'src/core/ext/census/gen/trace_context.pb.c',
+        'src/core/ext/census/grpc_context.c',
+        'src/core/ext/census/grpc_filter.c',
+        'src/core/ext/census/grpc_plugin.c',
+        'src/core/ext/census/initialize.c',
+        'src/core/ext/census/intrusive_hash_map.c',
+        'src/core/ext/census/mlog.c',
+        'src/core/ext/census/operation.c',
+        'src/core/ext/census/placeholders.c',
+        'src/core/ext/census/resource.c',
+        'src/core/ext/census/trace_context.c',
+        'src/core/ext/census/tracing.c',
+        'src/core/ext/filters/max_age/max_age_filter.c',
+        'src/core/ext/filters/message_size/message_size_filter.c',
+        'src/core/ext/filters/workarounds/workaround_cronet_compression_filter.c',
+        'src/core/ext/filters/workarounds/workaround_utils.c',
+        'src/core/plugin_registry/grpc_unsecure_plugin_registry.c',
+      ],
+    },
+    {
+      'target_name': 'reconnect_server',
+      'type': 'static_library',
+      'dependencies': [
+        'test_tcp_server',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/util/reconnect_server.c',
+      ],
+    },
+    {
+      'target_name': 'test_tcp_server',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/util/test_tcp_server.c',
+      ],
+    },
+    {
+      'target_name': 'grpc++',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc',
+        'gpr',
+      ],
+      'sources': [
+        'src/cpp/client/insecure_credentials.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_channel_arguments.cc',
+        'src/cpp/common/secure_create_auth_context.cc',
+        'src/cpp/server/insecure_server_credentials.cc',
+        'src/cpp/server/secure_server_credentials.cc',
+        'src/cpp/client/channel_cc.cc',
+        'src/cpp/client/client_context.cc',
+        'src/cpp/client/create_channel.cc',
+        'src/cpp/client/create_channel_internal.cc',
+        'src/cpp/client/create_channel_posix.cc',
+        'src/cpp/client/credentials_cc.cc',
+        'src/cpp/client/generic_stub.cc',
+        'src/cpp/common/channel_arguments.cc',
+        'src/cpp/common/channel_filter.cc',
+        'src/cpp/common/completion_queue_cc.cc',
+        'src/cpp/common/core_codegen.cc',
+        'src/cpp/common/resource_quota_cc.cc',
+        'src/cpp/common/rpc_method.cc',
+        'src/cpp/common/version_cc.cc',
+        'src/cpp/server/async_generic_service.cc',
+        'src/cpp/server/channel_argument_option.cc',
+        'src/cpp/server/create_default_thread_pool.cc',
+        'src/cpp/server/dynamic_thread_pool.cc',
+        'src/cpp/server/health/default_health_check_service.cc',
+        'src/cpp/server/health/health.pb.c',
+        'src/cpp/server/health/health_check_service.cc',
+        'src/cpp/server/health/health_check_service_server_builder_option.cc',
+        'src/cpp/server/server_builder.cc',
+        'src/cpp/server/server_cc.cc',
+        'src/cpp/server/server_context.cc',
+        'src/cpp/server/server_credentials.cc',
+        'src/cpp/server/server_posix.cc',
+        'src/cpp/thread_manager/thread_manager.cc',
+        'src/cpp/util/byte_buffer_cc.cc',
+        'src/cpp/util/slice_cc.cc',
+        'src/cpp/util/status.cc',
+        'src/cpp/util/string_ref.cc',
+        'src/cpp/util/time_cc.cc',
+        'src/cpp/codegen/codegen_init.cc',
+      ],
+    },
+    {
+      'target_name': 'grpc++_error_details',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc++',
+      ],
+      'sources': [
+        'src/proto/grpc/status/status.proto',
+        'src/cpp/util/error_details.cc',
+      ],
+    },
+    {
+      'target_name': 'grpc++_proto_reflection_desc_db',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc++',
+        'grpc',
+      ],
+      'sources': [
+        'test/cpp/util/proto_reflection_descriptor_database.cc',
+        'src/proto/grpc/reflection/v1alpha/reflection.proto',
+      ],
+    },
+    {
+      'target_name': 'grpc++_reflection',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc++',
+        'grpc',
+      ],
+      'sources': [
+        'src/cpp/ext/proto_server_reflection.cc',
+        'src/cpp/ext/proto_server_reflection_plugin.cc',
+        'src/proto/grpc/reflection/v1alpha/reflection.proto',
+      ],
+    },
+    {
+      'target_name': 'grpc++_test_config',
+      'type': 'static_library',
+      'dependencies': [
+      ],
+      'sources': [
+        'test/cpp/util/test_config_cc.cc',
+      ],
+    },
+    {
+      'target_name': 'grpc++_test_util',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc++',
+        'grpc_test_util',
+        'grpc',
+      ],
+      'sources': [
+        'src/proto/grpc/health/v1/health.proto',
+        'src/proto/grpc/testing/echo_messages.proto',
+        'src/proto/grpc/testing/echo.proto',
+        'src/proto/grpc/testing/duplicate/echo_duplicate.proto',
+        'test/cpp/end2end/test_service_impl.cc',
+        'test/cpp/util/byte_buffer_proto_helper.cc',
+        'test/cpp/util/create_test_channel.cc',
+        'test/cpp/util/string_ref_helper.cc',
+        'test/cpp/util/subprocess.cc',
+        'test/cpp/util/test_credentials_provider.cc',
+        'src/cpp/codegen/codegen_init.cc',
+      ],
+    },
+    {
+      'target_name': 'grpc++_test_util_unsecure',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc++_unsecure',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+      ],
+      'sources': [
+        'src/proto/grpc/health/v1/health.proto',
+        'src/proto/grpc/testing/echo_messages.proto',
+        'src/proto/grpc/testing/echo.proto',
+        'src/proto/grpc/testing/duplicate/echo_duplicate.proto',
+        'test/cpp/end2end/test_service_impl.cc',
+        'test/cpp/util/byte_buffer_proto_helper.cc',
+        'test/cpp/util/string_ref_helper.cc',
+        'test/cpp/util/subprocess.cc',
+        'src/cpp/codegen/codegen_init.cc',
+      ],
+    },
+    {
+      'target_name': 'grpc++_unsecure',
+      'type': 'static_library',
+      'dependencies': [
+        'gpr',
+        'grpc_unsecure',
+      ],
+      'sources': [
+        'src/cpp/client/insecure_credentials.cc',
+        'src/cpp/common/insecure_create_auth_context.cc',
+        'src/cpp/server/insecure_server_credentials.cc',
+        'src/cpp/client/channel_cc.cc',
+        'src/cpp/client/client_context.cc',
+        'src/cpp/client/create_channel.cc',
+        'src/cpp/client/create_channel_internal.cc',
+        'src/cpp/client/create_channel_posix.cc',
+        'src/cpp/client/credentials_cc.cc',
+        'src/cpp/client/generic_stub.cc',
+        'src/cpp/common/channel_arguments.cc',
+        'src/cpp/common/channel_filter.cc',
+        'src/cpp/common/completion_queue_cc.cc',
+        'src/cpp/common/core_codegen.cc',
+        'src/cpp/common/resource_quota_cc.cc',
+        'src/cpp/common/rpc_method.cc',
+        'src/cpp/common/version_cc.cc',
+        'src/cpp/server/async_generic_service.cc',
+        'src/cpp/server/channel_argument_option.cc',
+        'src/cpp/server/create_default_thread_pool.cc',
+        'src/cpp/server/dynamic_thread_pool.cc',
+        'src/cpp/server/health/default_health_check_service.cc',
+        'src/cpp/server/health/health.pb.c',
+        'src/cpp/server/health/health_check_service.cc',
+        'src/cpp/server/health/health_check_service_server_builder_option.cc',
+        'src/cpp/server/server_builder.cc',
+        'src/cpp/server/server_cc.cc',
+        'src/cpp/server/server_context.cc',
+        'src/cpp/server/server_credentials.cc',
+        'src/cpp/server/server_posix.cc',
+        'src/cpp/thread_manager/thread_manager.cc',
+        'src/cpp/util/byte_buffer_cc.cc',
+        'src/cpp/util/slice_cc.cc',
+        'src/cpp/util/status.cc',
+        'src/cpp/util/string_ref.cc',
+        'src/cpp/util/time_cc.cc',
+        'src/cpp/codegen/codegen_init.cc',
+      ],
+    },
+    {
+      'target_name': 'grpc_benchmark',
+      'type': 'static_library',
+      'dependencies': [
+        'benchmark',
+        'grpc++_unsecure',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+      ],
+      'sources': [
+        'test/cpp/microbenchmarks/helpers.cc',
+      ],
+    },
+    {
+      'target_name': 'grpc_cli_libs',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc++_proto_reflection_desc_db',
+        'grpc++',
+        'grpc',
+      ],
+      'sources': [
+        'test/cpp/util/cli_call.cc',
+        'test/cpp/util/cli_credentials.cc',
+        'test/cpp/util/grpc_tool.cc',
+        'test/cpp/util/proto_file_parser.cc',
+        'test/cpp/util/service_describer.cc',
+        'src/proto/grpc/reflection/v1alpha/reflection.proto',
+      ],
+    },
+    {
+      'target_name': 'grpc_plugin_support',
+      'type': 'static_library',
+      'dependencies': [
+      ],
+      'sources': [
+        'src/compiler/cpp_generator.cc',
+        'src/compiler/csharp_generator.cc',
+        'src/compiler/node_generator.cc',
+        'src/compiler/objective_c_generator.cc',
+        'src/compiler/php_generator.cc',
+        'src/compiler/python_generator.cc',
+        'src/compiler/ruby_generator.cc',
+      ],
+    },
+    {
+      'target_name': 'http2_client_main',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc++_test_util',
+        'grpc_test_util',
+        'grpc++',
+        'grpc',
+        'grpc++_test_config',
+      ],
+      'sources': [
+        'src/proto/grpc/testing/empty.proto',
+        'src/proto/grpc/testing/messages.proto',
+        'src/proto/grpc/testing/test.proto',
+        'test/cpp/interop/http2_client.cc',
+      ],
+    },
+    {
+      'target_name': 'interop_client_helper',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc++_test_util',
+        'grpc_test_util',
+        'grpc++',
+        'grpc',
+        'gpr',
+      ],
+      'sources': [
+        'src/proto/grpc/testing/messages.proto',
+        'test/cpp/interop/client_helper.cc',
+      ],
+    },
+    {
+      'target_name': 'interop_client_main',
+      'type': 'static_library',
+      'dependencies': [
+        'interop_client_helper',
+        'grpc++_test_util',
+        'grpc_test_util',
+        'grpc++',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+        'grpc++_test_config',
+      ],
+      'sources': [
+        'src/proto/grpc/testing/empty.proto',
+        'src/proto/grpc/testing/messages.proto',
+        'src/proto/grpc/testing/test.proto',
+        'test/cpp/interop/client.cc',
+        'test/cpp/interop/interop_client.cc',
+      ],
+    },
+    {
+      'target_name': 'interop_server_helper',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc++_test_util',
+        'grpc_test_util',
+        'grpc++',
+        'grpc',
+        'gpr',
+      ],
+      'sources': [
+        'test/cpp/interop/server_helper.cc',
+      ],
+    },
+    {
+      'target_name': 'interop_server_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'interop_server_helper',
+        'grpc++_test_util',
+        'grpc_test_util',
+        'grpc++',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+        'grpc++_test_config',
+      ],
+      'sources': [
+        'src/proto/grpc/testing/empty.proto',
+        'src/proto/grpc/testing/messages.proto',
+        'src/proto/grpc/testing/test.proto',
+        'test/cpp/interop/interop_server.cc',
+      ],
+    },
+    {
+      'target_name': 'interop_server_main',
+      'type': 'static_library',
+      'dependencies': [
+        'interop_server_lib',
+      ],
+      'sources': [
+        'test/cpp/interop/interop_server_bootstrap.cc',
+      ],
+    },
+    {
+      'target_name': 'qps',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc++_test_util',
+        'grpc++',
+        'grpc',
+      ],
+      'sources': [
+        'src/proto/grpc/testing/messages.proto',
+        'src/proto/grpc/testing/payloads.proto',
+        'src/proto/grpc/testing/stats.proto',
+        'src/proto/grpc/testing/control.proto',
+        'src/proto/grpc/testing/services.proto',
+        'test/cpp/qps/benchmark_config.cc',
+        'test/cpp/qps/client_async.cc',
+        'test/cpp/qps/client_sync.cc',
+        'test/cpp/qps/driver.cc',
+        'test/cpp/qps/parse_json.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/usage_timer.cc',
+      ],
+    },
+    {
+      'target_name': 'grpc_csharp_ext',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc',
+        'gpr',
+      ],
+      'sources': [
+        'src/csharp/ext/grpc_csharp_ext.c',
+      ],
+    },
+    {
+      'target_name': 'boringssl',
+      'type': 'static_library',
+      'dependencies': [
+      ],
+      'sources': [
+        'src/boringssl/err_data.c',
+        'third_party/boringssl/crypto/aes/aes.c',
+        'third_party/boringssl/crypto/aes/key_wrap.c',
+        'third_party/boringssl/crypto/aes/mode_wrappers.c',
+        'third_party/boringssl/crypto/asn1/a_bitstr.c',
+        'third_party/boringssl/crypto/asn1/a_bool.c',
+        'third_party/boringssl/crypto/asn1/a_d2i_fp.c',
+        'third_party/boringssl/crypto/asn1/a_dup.c',
+        'third_party/boringssl/crypto/asn1/a_enum.c',
+        'third_party/boringssl/crypto/asn1/a_gentm.c',
+        'third_party/boringssl/crypto/asn1/a_i2d_fp.c',
+        'third_party/boringssl/crypto/asn1/a_int.c',
+        'third_party/boringssl/crypto/asn1/a_mbstr.c',
+        'third_party/boringssl/crypto/asn1/a_object.c',
+        'third_party/boringssl/crypto/asn1/a_octet.c',
+        'third_party/boringssl/crypto/asn1/a_print.c',
+        'third_party/boringssl/crypto/asn1/a_strnid.c',
+        'third_party/boringssl/crypto/asn1/a_time.c',
+        'third_party/boringssl/crypto/asn1/a_type.c',
+        'third_party/boringssl/crypto/asn1/a_utctm.c',
+        'third_party/boringssl/crypto/asn1/a_utf8.c',
+        'third_party/boringssl/crypto/asn1/asn1_lib.c',
+        'third_party/boringssl/crypto/asn1/asn1_par.c',
+        'third_party/boringssl/crypto/asn1/asn_pack.c',
+        'third_party/boringssl/crypto/asn1/f_enum.c',
+        'third_party/boringssl/crypto/asn1/f_int.c',
+        'third_party/boringssl/crypto/asn1/f_string.c',
+        'third_party/boringssl/crypto/asn1/t_bitst.c',
+        'third_party/boringssl/crypto/asn1/tasn_dec.c',
+        'third_party/boringssl/crypto/asn1/tasn_enc.c',
+        'third_party/boringssl/crypto/asn1/tasn_fre.c',
+        'third_party/boringssl/crypto/asn1/tasn_new.c',
+        'third_party/boringssl/crypto/asn1/tasn_typ.c',
+        'third_party/boringssl/crypto/asn1/tasn_utl.c',
+        'third_party/boringssl/crypto/asn1/time_support.c',
+        'third_party/boringssl/crypto/asn1/x_bignum.c',
+        'third_party/boringssl/crypto/asn1/x_long.c',
+        'third_party/boringssl/crypto/base64/base64.c',
+        'third_party/boringssl/crypto/bio/bio.c',
+        'third_party/boringssl/crypto/bio/bio_mem.c',
+        'third_party/boringssl/crypto/bio/connect.c',
+        'third_party/boringssl/crypto/bio/fd.c',
+        'third_party/boringssl/crypto/bio/file.c',
+        'third_party/boringssl/crypto/bio/hexdump.c',
+        'third_party/boringssl/crypto/bio/pair.c',
+        'third_party/boringssl/crypto/bio/printf.c',
+        'third_party/boringssl/crypto/bio/socket.c',
+        'third_party/boringssl/crypto/bio/socket_helper.c',
+        'third_party/boringssl/crypto/bn/add.c',
+        'third_party/boringssl/crypto/bn/asm/x86_64-gcc.c',
+        'third_party/boringssl/crypto/bn/bn.c',
+        'third_party/boringssl/crypto/bn/bn_asn1.c',
+        'third_party/boringssl/crypto/bn/cmp.c',
+        'third_party/boringssl/crypto/bn/convert.c',
+        'third_party/boringssl/crypto/bn/ctx.c',
+        'third_party/boringssl/crypto/bn/div.c',
+        'third_party/boringssl/crypto/bn/exponentiation.c',
+        'third_party/boringssl/crypto/bn/gcd.c',
+        'third_party/boringssl/crypto/bn/generic.c',
+        'third_party/boringssl/crypto/bn/kronecker.c',
+        'third_party/boringssl/crypto/bn/montgomery.c',
+        'third_party/boringssl/crypto/bn/montgomery_inv.c',
+        'third_party/boringssl/crypto/bn/mul.c',
+        'third_party/boringssl/crypto/bn/prime.c',
+        'third_party/boringssl/crypto/bn/random.c',
+        'third_party/boringssl/crypto/bn/rsaz_exp.c',
+        'third_party/boringssl/crypto/bn/shift.c',
+        'third_party/boringssl/crypto/bn/sqrt.c',
+        'third_party/boringssl/crypto/buf/buf.c',
+        'third_party/boringssl/crypto/bytestring/asn1_compat.c',
+        'third_party/boringssl/crypto/bytestring/ber.c',
+        'third_party/boringssl/crypto/bytestring/cbb.c',
+        'third_party/boringssl/crypto/bytestring/cbs.c',
+        'third_party/boringssl/crypto/chacha/chacha.c',
+        'third_party/boringssl/crypto/cipher/aead.c',
+        'third_party/boringssl/crypto/cipher/cipher.c',
+        'third_party/boringssl/crypto/cipher/derive_key.c',
+        'third_party/boringssl/crypto/cipher/e_aes.c',
+        'third_party/boringssl/crypto/cipher/e_chacha20poly1305.c',
+        'third_party/boringssl/crypto/cipher/e_des.c',
+        'third_party/boringssl/crypto/cipher/e_null.c',
+        'third_party/boringssl/crypto/cipher/e_rc2.c',
+        'third_party/boringssl/crypto/cipher/e_rc4.c',
+        'third_party/boringssl/crypto/cipher/e_ssl3.c',
+        'third_party/boringssl/crypto/cipher/e_tls.c',
+        'third_party/boringssl/crypto/cipher/tls_cbc.c',
+        'third_party/boringssl/crypto/cmac/cmac.c',
+        'third_party/boringssl/crypto/conf/conf.c',
+        'third_party/boringssl/crypto/cpu-aarch64-linux.c',
+        'third_party/boringssl/crypto/cpu-arm-linux.c',
+        'third_party/boringssl/crypto/cpu-arm.c',
+        'third_party/boringssl/crypto/cpu-intel.c',
+        'third_party/boringssl/crypto/cpu-ppc64le.c',
+        'third_party/boringssl/crypto/crypto.c',
+        'third_party/boringssl/crypto/curve25519/curve25519.c',
+        'third_party/boringssl/crypto/curve25519/spake25519.c',
+        'third_party/boringssl/crypto/curve25519/x25519-x86_64.c',
+        'third_party/boringssl/crypto/des/des.c',
+        'third_party/boringssl/crypto/dh/check.c',
+        'third_party/boringssl/crypto/dh/dh.c',
+        'third_party/boringssl/crypto/dh/dh_asn1.c',
+        'third_party/boringssl/crypto/dh/params.c',
+        'third_party/boringssl/crypto/digest/digest.c',
+        'third_party/boringssl/crypto/digest/digests.c',
+        'third_party/boringssl/crypto/dsa/dsa.c',
+        'third_party/boringssl/crypto/dsa/dsa_asn1.c',
+        'third_party/boringssl/crypto/ec/ec.c',
+        'third_party/boringssl/crypto/ec/ec_asn1.c',
+        'third_party/boringssl/crypto/ec/ec_key.c',
+        'third_party/boringssl/crypto/ec/ec_montgomery.c',
+        'third_party/boringssl/crypto/ec/oct.c',
+        'third_party/boringssl/crypto/ec/p224-64.c',
+        'third_party/boringssl/crypto/ec/p256-64.c',
+        'third_party/boringssl/crypto/ec/p256-x86_64.c',
+        'third_party/boringssl/crypto/ec/simple.c',
+        'third_party/boringssl/crypto/ec/util-64.c',
+        'third_party/boringssl/crypto/ec/wnaf.c',
+        'third_party/boringssl/crypto/ecdh/ecdh.c',
+        'third_party/boringssl/crypto/ecdsa/ecdsa.c',
+        'third_party/boringssl/crypto/ecdsa/ecdsa_asn1.c',
+        'third_party/boringssl/crypto/engine/engine.c',
+        'third_party/boringssl/crypto/err/err.c',
+        'third_party/boringssl/crypto/evp/digestsign.c',
+        'third_party/boringssl/crypto/evp/evp.c',
+        'third_party/boringssl/crypto/evp/evp_asn1.c',
+        'third_party/boringssl/crypto/evp/evp_ctx.c',
+        'third_party/boringssl/crypto/evp/p_dsa_asn1.c',
+        'third_party/boringssl/crypto/evp/p_ec.c',
+        'third_party/boringssl/crypto/evp/p_ec_asn1.c',
+        'third_party/boringssl/crypto/evp/p_rsa.c',
+        'third_party/boringssl/crypto/evp/p_rsa_asn1.c',
+        'third_party/boringssl/crypto/evp/pbkdf.c',
+        'third_party/boringssl/crypto/evp/print.c',
+        'third_party/boringssl/crypto/evp/sign.c',
+        'third_party/boringssl/crypto/ex_data.c',
+        'third_party/boringssl/crypto/hkdf/hkdf.c',
+        'third_party/boringssl/crypto/hmac/hmac.c',
+        'third_party/boringssl/crypto/lhash/lhash.c',
+        'third_party/boringssl/crypto/md4/md4.c',
+        'third_party/boringssl/crypto/md5/md5.c',
+        'third_party/boringssl/crypto/mem.c',
+        'third_party/boringssl/crypto/modes/cbc.c',
+        'third_party/boringssl/crypto/modes/cfb.c',
+        'third_party/boringssl/crypto/modes/ctr.c',
+        'third_party/boringssl/crypto/modes/gcm.c',
+        'third_party/boringssl/crypto/modes/ofb.c',
+        'third_party/boringssl/crypto/modes/polyval.c',
+        'third_party/boringssl/crypto/obj/obj.c',
+        'third_party/boringssl/crypto/obj/obj_xref.c',
+        'third_party/boringssl/crypto/pem/pem_all.c',
+        'third_party/boringssl/crypto/pem/pem_info.c',
+        'third_party/boringssl/crypto/pem/pem_lib.c',
+        'third_party/boringssl/crypto/pem/pem_oth.c',
+        'third_party/boringssl/crypto/pem/pem_pk8.c',
+        'third_party/boringssl/crypto/pem/pem_pkey.c',
+        'third_party/boringssl/crypto/pem/pem_x509.c',
+        'third_party/boringssl/crypto/pem/pem_xaux.c',
+        'third_party/boringssl/crypto/pkcs8/p5_pbev2.c',
+        'third_party/boringssl/crypto/pkcs8/p8_pkey.c',
+        'third_party/boringssl/crypto/pkcs8/pkcs8.c',
+        'third_party/boringssl/crypto/poly1305/poly1305.c',
+        'third_party/boringssl/crypto/poly1305/poly1305_arm.c',
+        'third_party/boringssl/crypto/poly1305/poly1305_vec.c',
+        'third_party/boringssl/crypto/pool/pool.c',
+        'third_party/boringssl/crypto/rand/deterministic.c',
+        'third_party/boringssl/crypto/rand/fuchsia.c',
+        'third_party/boringssl/crypto/rand/rand.c',
+        'third_party/boringssl/crypto/rand/urandom.c',
+        'third_party/boringssl/crypto/rand/windows.c',
+        'third_party/boringssl/crypto/rc4/rc4.c',
+        'third_party/boringssl/crypto/refcount_c11.c',
+        'third_party/boringssl/crypto/refcount_lock.c',
+        'third_party/boringssl/crypto/rsa/blinding.c',
+        'third_party/boringssl/crypto/rsa/padding.c',
+        'third_party/boringssl/crypto/rsa/rsa.c',
+        'third_party/boringssl/crypto/rsa/rsa_asn1.c',
+        'third_party/boringssl/crypto/rsa/rsa_impl.c',
+        'third_party/boringssl/crypto/sha/sha1-altivec.c',
+        'third_party/boringssl/crypto/sha/sha1.c',
+        'third_party/boringssl/crypto/sha/sha256.c',
+        'third_party/boringssl/crypto/sha/sha512.c',
+        'third_party/boringssl/crypto/stack/stack.c',
+        'third_party/boringssl/crypto/thread.c',
+        'third_party/boringssl/crypto/thread_none.c',
+        'third_party/boringssl/crypto/thread_pthread.c',
+        'third_party/boringssl/crypto/thread_win.c',
+        'third_party/boringssl/crypto/x509/a_digest.c',
+        'third_party/boringssl/crypto/x509/a_sign.c',
+        'third_party/boringssl/crypto/x509/a_strex.c',
+        'third_party/boringssl/crypto/x509/a_verify.c',
+        'third_party/boringssl/crypto/x509/algorithm.c',
+        'third_party/boringssl/crypto/x509/asn1_gen.c',
+        'third_party/boringssl/crypto/x509/by_dir.c',
+        'third_party/boringssl/crypto/x509/by_file.c',
+        'third_party/boringssl/crypto/x509/i2d_pr.c',
+        'third_party/boringssl/crypto/x509/pkcs7.c',
+        'third_party/boringssl/crypto/x509/rsa_pss.c',
+        'third_party/boringssl/crypto/x509/t_crl.c',
+        'third_party/boringssl/crypto/x509/t_req.c',
+        'third_party/boringssl/crypto/x509/t_x509.c',
+        'third_party/boringssl/crypto/x509/t_x509a.c',
+        'third_party/boringssl/crypto/x509/x509.c',
+        'third_party/boringssl/crypto/x509/x509_att.c',
+        'third_party/boringssl/crypto/x509/x509_cmp.c',
+        'third_party/boringssl/crypto/x509/x509_d2.c',
+        'third_party/boringssl/crypto/x509/x509_def.c',
+        'third_party/boringssl/crypto/x509/x509_ext.c',
+        'third_party/boringssl/crypto/x509/x509_lu.c',
+        'third_party/boringssl/crypto/x509/x509_obj.c',
+        'third_party/boringssl/crypto/x509/x509_r2x.c',
+        'third_party/boringssl/crypto/x509/x509_req.c',
+        'third_party/boringssl/crypto/x509/x509_set.c',
+        'third_party/boringssl/crypto/x509/x509_trs.c',
+        'third_party/boringssl/crypto/x509/x509_txt.c',
+        'third_party/boringssl/crypto/x509/x509_v3.c',
+        'third_party/boringssl/crypto/x509/x509_vfy.c',
+        'third_party/boringssl/crypto/x509/x509_vpm.c',
+        'third_party/boringssl/crypto/x509/x509cset.c',
+        'third_party/boringssl/crypto/x509/x509name.c',
+        'third_party/boringssl/crypto/x509/x509rset.c',
+        'third_party/boringssl/crypto/x509/x509spki.c',
+        'third_party/boringssl/crypto/x509/x509type.c',
+        'third_party/boringssl/crypto/x509/x_algor.c',
+        'third_party/boringssl/crypto/x509/x_all.c',
+        'third_party/boringssl/crypto/x509/x_attrib.c',
+        'third_party/boringssl/crypto/x509/x_crl.c',
+        'third_party/boringssl/crypto/x509/x_exten.c',
+        'third_party/boringssl/crypto/x509/x_info.c',
+        'third_party/boringssl/crypto/x509/x_name.c',
+        'third_party/boringssl/crypto/x509/x_pkey.c',
+        'third_party/boringssl/crypto/x509/x_pubkey.c',
+        'third_party/boringssl/crypto/x509/x_req.c',
+        'third_party/boringssl/crypto/x509/x_sig.c',
+        'third_party/boringssl/crypto/x509/x_spki.c',
+        'third_party/boringssl/crypto/x509/x_val.c',
+        'third_party/boringssl/crypto/x509/x_x509.c',
+        'third_party/boringssl/crypto/x509/x_x509a.c',
+        'third_party/boringssl/crypto/x509v3/pcy_cache.c',
+        'third_party/boringssl/crypto/x509v3/pcy_data.c',
+        'third_party/boringssl/crypto/x509v3/pcy_lib.c',
+        'third_party/boringssl/crypto/x509v3/pcy_map.c',
+        'third_party/boringssl/crypto/x509v3/pcy_node.c',
+        'third_party/boringssl/crypto/x509v3/pcy_tree.c',
+        'third_party/boringssl/crypto/x509v3/v3_akey.c',
+        'third_party/boringssl/crypto/x509v3/v3_akeya.c',
+        'third_party/boringssl/crypto/x509v3/v3_alt.c',
+        'third_party/boringssl/crypto/x509v3/v3_bcons.c',
+        'third_party/boringssl/crypto/x509v3/v3_bitst.c',
+        'third_party/boringssl/crypto/x509v3/v3_conf.c',
+        'third_party/boringssl/crypto/x509v3/v3_cpols.c',
+        'third_party/boringssl/crypto/x509v3/v3_crld.c',
+        'third_party/boringssl/crypto/x509v3/v3_enum.c',
+        'third_party/boringssl/crypto/x509v3/v3_extku.c',
+        'third_party/boringssl/crypto/x509v3/v3_genn.c',
+        'third_party/boringssl/crypto/x509v3/v3_ia5.c',
+        'third_party/boringssl/crypto/x509v3/v3_info.c',
+        'third_party/boringssl/crypto/x509v3/v3_int.c',
+        'third_party/boringssl/crypto/x509v3/v3_lib.c',
+        'third_party/boringssl/crypto/x509v3/v3_ncons.c',
+        'third_party/boringssl/crypto/x509v3/v3_pci.c',
+        'third_party/boringssl/crypto/x509v3/v3_pcia.c',
+        'third_party/boringssl/crypto/x509v3/v3_pcons.c',
+        'third_party/boringssl/crypto/x509v3/v3_pku.c',
+        'third_party/boringssl/crypto/x509v3/v3_pmaps.c',
+        'third_party/boringssl/crypto/x509v3/v3_prn.c',
+        'third_party/boringssl/crypto/x509v3/v3_purp.c',
+        'third_party/boringssl/crypto/x509v3/v3_skey.c',
+        'third_party/boringssl/crypto/x509v3/v3_sxnet.c',
+        'third_party/boringssl/crypto/x509v3/v3_utl.c',
+        'third_party/boringssl/ssl/bio_ssl.c',
+        'third_party/boringssl/ssl/custom_extensions.c',
+        'third_party/boringssl/ssl/d1_both.c',
+        'third_party/boringssl/ssl/d1_lib.c',
+        'third_party/boringssl/ssl/d1_pkt.c',
+        'third_party/boringssl/ssl/d1_srtp.c',
+        'third_party/boringssl/ssl/dtls_method.c',
+        'third_party/boringssl/ssl/dtls_record.c',
+        'third_party/boringssl/ssl/handshake_client.c',
+        'third_party/boringssl/ssl/handshake_server.c',
+        'third_party/boringssl/ssl/s3_both.c',
+        'third_party/boringssl/ssl/s3_lib.c',
+        'third_party/boringssl/ssl/s3_pkt.c',
+        'third_party/boringssl/ssl/ssl_aead_ctx.c',
+        'third_party/boringssl/ssl/ssl_asn1.c',
+        'third_party/boringssl/ssl/ssl_buffer.c',
+        'third_party/boringssl/ssl/ssl_cert.c',
+        'third_party/boringssl/ssl/ssl_cipher.c',
+        'third_party/boringssl/ssl/ssl_ecdh.c',
+        'third_party/boringssl/ssl/ssl_file.c',
+        'third_party/boringssl/ssl/ssl_lib.c',
+        'third_party/boringssl/ssl/ssl_privkey.c',
+        'third_party/boringssl/ssl/ssl_privkey_cc.cc',
+        'third_party/boringssl/ssl/ssl_session.c',
+        'third_party/boringssl/ssl/ssl_stat.c',
+        'third_party/boringssl/ssl/ssl_transcript.c',
+        'third_party/boringssl/ssl/ssl_x509.c',
+        'third_party/boringssl/ssl/t1_enc.c',
+        'third_party/boringssl/ssl/t1_lib.c',
+        'third_party/boringssl/ssl/tls13_both.c',
+        'third_party/boringssl/ssl/tls13_client.c',
+        'third_party/boringssl/ssl/tls13_enc.c',
+        'third_party/boringssl/ssl/tls13_server.c',
+        'third_party/boringssl/ssl/tls_method.c',
+        'third_party/boringssl/ssl/tls_record.c',
+      ],
+    },
+    {
+      'target_name': 'boringssl_test_util',
+      'type': 'static_library',
+      'dependencies': [
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/test/file_test.cc',
+        'third_party/boringssl/crypto/test/malloc.cc',
+        'third_party/boringssl/crypto/test/test_util.cc',
+      ],
+    },
+    {
+      'target_name': 'boringssl_aes_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/aes/aes_test.cc',
+      ],
+    },
+    {
+      'target_name': 'boringssl_asn1_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/asn1/asn1_test.cc',
+      ],
+    },
+    {
+      'target_name': 'boringssl_base64_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/base64/base64_test.cc',
+      ],
+    },
+    {
+      'target_name': 'boringssl_bio_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/bio/bio_test.cc',
+      ],
+    },
+    {
+      'target_name': 'boringssl_bn_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/bn/bn_test.cc',
+      ],
+    },
+    {
+      'target_name': 'boringssl_bytestring_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/bytestring/bytestring_test.cc',
+      ],
+    },
+    {
+      'target_name': 'boringssl_aead_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/cipher/aead_test.cc',
+      ],
+    },
+    {
+      'target_name': 'boringssl_cipher_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/cipher/cipher_test.cc',
+      ],
+    },
+    {
+      'target_name': 'boringssl_cmac_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/cmac/cmac_test.cc',
+      ],
+    },
+    {
+      'target_name': 'boringssl_constant_time_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/constant_time_test.cc',
+      ],
+    },
+    {
+      'target_name': 'boringssl_ed25519_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/curve25519/ed25519_test.cc',
+      ],
+    },
+    {
+      'target_name': 'boringssl_spake25519_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/curve25519/spake25519_test.cc',
+      ],
+    },
+    {
+      'target_name': 'boringssl_x25519_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/curve25519/x25519_test.cc',
+      ],
+    },
+    {
+      'target_name': 'boringssl_digest_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/digest/digest_test.cc',
+      ],
+    },
+    {
+      'target_name': 'boringssl_example_mul_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/ec/example_mul.c',
+      ],
+    },
+    {
+      'target_name': 'boringssl_p256-x86_64_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/ec/p256-x86_64_test.cc',
+      ],
+    },
+    {
+      'target_name': 'boringssl_ecdh_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/ecdh/ecdh_test.cc',
+      ],
+    },
+    {
+      'target_name': 'boringssl_ecdsa_sign_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/ecdsa/ecdsa_sign_test.cc',
+      ],
+    },
+    {
+      'target_name': 'boringssl_ecdsa_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/ecdsa/ecdsa_test.cc',
+      ],
+    },
+    {
+      'target_name': 'boringssl_ecdsa_verify_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/ecdsa/ecdsa_verify_test.cc',
+      ],
+    },
+    {
+      'target_name': 'boringssl_evp_extra_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/evp/evp_extra_test.cc',
+      ],
+    },
+    {
+      'target_name': 'boringssl_evp_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/evp/evp_test.cc',
+      ],
+    },
+    {
+      'target_name': 'boringssl_pbkdf_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/evp/pbkdf_test.cc',
+      ],
+    },
+    {
+      'target_name': 'boringssl_hkdf_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/hkdf/hkdf_test.cc',
+      ],
+    },
+    {
+      'target_name': 'boringssl_hmac_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/hmac/hmac_test.cc',
+      ],
+    },
+    {
+      'target_name': 'boringssl_lhash_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/lhash/lhash_test.cc',
+      ],
+    },
+    {
+      'target_name': 'boringssl_gcm_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/modes/gcm_test.cc',
+      ],
+    },
+    {
+      'target_name': 'boringssl_obj_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/obj/obj_test.cc',
+      ],
+    },
+    {
+      'target_name': 'boringssl_pkcs12_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/pkcs8/pkcs12_test.cc',
+      ],
+    },
+    {
+      'target_name': 'boringssl_pkcs8_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/pkcs8/pkcs8_test.cc',
+      ],
+    },
+    {
+      'target_name': 'boringssl_poly1305_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/poly1305/poly1305_test.cc',
+      ],
+    },
+    {
+      'target_name': 'boringssl_pool_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/pool/pool_test.cc',
+      ],
+    },
+    {
+      'target_name': 'boringssl_refcount_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/refcount_test.cc',
+      ],
+    },
+    {
+      'target_name': 'boringssl_thread_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/thread_test.c',
+      ],
+    },
+    {
+      'target_name': 'boringssl_pkcs7_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/x509/pkcs7_test.c',
+      ],
+    },
+    {
+      'target_name': 'boringssl_x509_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/x509/x509_test.cc',
+      ],
+    },
+    {
+      'target_name': 'boringssl_tab_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/x509v3/tab_test.c',
+      ],
+    },
+    {
+      'target_name': 'boringssl_v3name_test_lib',
+      'type': 'static_library',
+      'dependencies': [
+        'boringssl_test_util',
+        'boringssl',
+      ],
+      'sources': [
+        'third_party/boringssl/crypto/x509v3/v3name_test.c',
+      ],
+    },
+    {
+      'target_name': 'benchmark',
+      'type': 'static_library',
+      'dependencies': [
+      ],
+      'sources': [
+        'third_party/benchmark/src/benchmark.cc',
+        'third_party/benchmark/src/benchmark_register.cc',
+        'third_party/benchmark/src/colorprint.cc',
+        'third_party/benchmark/src/commandlineflags.cc',
+        'third_party/benchmark/src/complexity.cc',
+        'third_party/benchmark/src/console_reporter.cc',
+        'third_party/benchmark/src/csv_reporter.cc',
+        'third_party/benchmark/src/json_reporter.cc',
+        'third_party/benchmark/src/reporter.cc',
+        'third_party/benchmark/src/sleep.cc',
+        'third_party/benchmark/src/string_util.cc',
+        'third_party/benchmark/src/sysinfo.cc',
+        'third_party/benchmark/src/timers.cc',
+      ],
+    },
+    {
+      'target_name': 'z',
+      'type': 'static_library',
+      'dependencies': [
+      ],
+      'sources': [
+        'third_party/zlib/adler32.c',
+        'third_party/zlib/compress.c',
+        'third_party/zlib/crc32.c',
+        'third_party/zlib/deflate.c',
+        'third_party/zlib/gzclose.c',
+        'third_party/zlib/gzlib.c',
+        'third_party/zlib/gzread.c',
+        'third_party/zlib/gzwrite.c',
+        'third_party/zlib/infback.c',
+        'third_party/zlib/inffast.c',
+        'third_party/zlib/inflate.c',
+        'third_party/zlib/inftrees.c',
+        'third_party/zlib/trees.c',
+        'third_party/zlib/uncompr.c',
+        'third_party/zlib/zutil.c',
+      ],
+    },
+    {
+      'target_name': 'bad_client_test',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/bad_client/bad_client.c',
+      ],
+    },
+    {
+      'target_name': 'end2end_tests',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/end2end_tests.c',
+        'test/core/end2end/end2end_test_utils.c',
+        'test/core/end2end/tests/authority_not_supported.c',
+        'test/core/end2end/tests/bad_hostname.c',
+        'test/core/end2end/tests/bad_ping.c',
+        'test/core/end2end/tests/binary_metadata.c',
+        'test/core/end2end/tests/call_creds.c',
+        'test/core/end2end/tests/cancel_after_accept.c',
+        'test/core/end2end/tests/cancel_after_client_done.c',
+        'test/core/end2end/tests/cancel_after_invoke.c',
+        'test/core/end2end/tests/cancel_after_round_trip.c',
+        'test/core/end2end/tests/cancel_before_invoke.c',
+        'test/core/end2end/tests/cancel_in_a_vacuum.c',
+        'test/core/end2end/tests/cancel_with_status.c',
+        'test/core/end2end/tests/compressed_payload.c',
+        'test/core/end2end/tests/connectivity.c',
+        'test/core/end2end/tests/default_host.c',
+        'test/core/end2end/tests/disappearing_server.c',
+        'test/core/end2end/tests/empty_batch.c',
+        'test/core/end2end/tests/filter_call_init_fails.c',
+        'test/core/end2end/tests/filter_causes_close.c',
+        'test/core/end2end/tests/filter_latency.c',
+        'test/core/end2end/tests/graceful_server_shutdown.c',
+        'test/core/end2end/tests/high_initial_seqno.c',
+        'test/core/end2end/tests/hpack_size.c',
+        'test/core/end2end/tests/idempotent_request.c',
+        'test/core/end2end/tests/invoke_large_request.c',
+        'test/core/end2end/tests/keepalive_timeout.c',
+        'test/core/end2end/tests/large_metadata.c',
+        'test/core/end2end/tests/load_reporting_hook.c',
+        'test/core/end2end/tests/max_concurrent_streams.c',
+        'test/core/end2end/tests/max_connection_age.c',
+        'test/core/end2end/tests/max_connection_idle.c',
+        'test/core/end2end/tests/max_message_length.c',
+        'test/core/end2end/tests/negative_deadline.c',
+        'test/core/end2end/tests/network_status_change.c',
+        'test/core/end2end/tests/no_logging.c',
+        'test/core/end2end/tests/no_op.c',
+        'test/core/end2end/tests/payload.c',
+        'test/core/end2end/tests/ping.c',
+        'test/core/end2end/tests/ping_pong_streaming.c',
+        'test/core/end2end/tests/proxy_auth.c',
+        'test/core/end2end/tests/registered_call.c',
+        'test/core/end2end/tests/request_with_flags.c',
+        'test/core/end2end/tests/request_with_payload.c',
+        'test/core/end2end/tests/resource_quota_server.c',
+        'test/core/end2end/tests/server_finishes_request.c',
+        'test/core/end2end/tests/shutdown_finishes_calls.c',
+        'test/core/end2end/tests/shutdown_finishes_tags.c',
+        'test/core/end2end/tests/simple_cacheable_request.c',
+        'test/core/end2end/tests/simple_delayed_request.c',
+        'test/core/end2end/tests/simple_metadata.c',
+        'test/core/end2end/tests/simple_request.c',
+        'test/core/end2end/tests/streaming_error_response.c',
+        'test/core/end2end/tests/trailing_metadata.c',
+        'test/core/end2end/tests/workaround_cronet_compression.c',
+        'test/core/end2end/tests/write_buffering.c',
+        'test/core/end2end/tests/write_buffering_at_end.c',
+      ],
+    },
+    {
+      'target_name': 'end2end_nosec_tests',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/end2end_nosec_tests.c',
+        'test/core/end2end/end2end_test_utils.c',
+        'test/core/end2end/tests/authority_not_supported.c',
+        'test/core/end2end/tests/bad_hostname.c',
+        'test/core/end2end/tests/bad_ping.c',
+        'test/core/end2end/tests/binary_metadata.c',
+        'test/core/end2end/tests/cancel_after_accept.c',
+        'test/core/end2end/tests/cancel_after_client_done.c',
+        'test/core/end2end/tests/cancel_after_invoke.c',
+        'test/core/end2end/tests/cancel_after_round_trip.c',
+        'test/core/end2end/tests/cancel_before_invoke.c',
+        'test/core/end2end/tests/cancel_in_a_vacuum.c',
+        'test/core/end2end/tests/cancel_with_status.c',
+        'test/core/end2end/tests/compressed_payload.c',
+        'test/core/end2end/tests/connectivity.c',
+        'test/core/end2end/tests/default_host.c',
+        'test/core/end2end/tests/disappearing_server.c',
+        'test/core/end2end/tests/empty_batch.c',
+        'test/core/end2end/tests/filter_call_init_fails.c',
+        'test/core/end2end/tests/filter_causes_close.c',
+        'test/core/end2end/tests/filter_latency.c',
+        'test/core/end2end/tests/graceful_server_shutdown.c',
+        'test/core/end2end/tests/high_initial_seqno.c',
+        'test/core/end2end/tests/hpack_size.c',
+        'test/core/end2end/tests/idempotent_request.c',
+        'test/core/end2end/tests/invoke_large_request.c',
+        'test/core/end2end/tests/keepalive_timeout.c',
+        'test/core/end2end/tests/large_metadata.c',
+        'test/core/end2end/tests/load_reporting_hook.c',
+        'test/core/end2end/tests/max_concurrent_streams.c',
+        'test/core/end2end/tests/max_connection_age.c',
+        'test/core/end2end/tests/max_connection_idle.c',
+        'test/core/end2end/tests/max_message_length.c',
+        'test/core/end2end/tests/negative_deadline.c',
+        'test/core/end2end/tests/network_status_change.c',
+        'test/core/end2end/tests/no_logging.c',
+        'test/core/end2end/tests/no_op.c',
+        'test/core/end2end/tests/payload.c',
+        'test/core/end2end/tests/ping.c',
+        'test/core/end2end/tests/ping_pong_streaming.c',
+        'test/core/end2end/tests/proxy_auth.c',
+        'test/core/end2end/tests/registered_call.c',
+        'test/core/end2end/tests/request_with_flags.c',
+        'test/core/end2end/tests/request_with_payload.c',
+        'test/core/end2end/tests/resource_quota_server.c',
+        'test/core/end2end/tests/server_finishes_request.c',
+        'test/core/end2end/tests/shutdown_finishes_calls.c',
+        'test/core/end2end/tests/shutdown_finishes_tags.c',
+        'test/core/end2end/tests/simple_cacheable_request.c',
+        'test/core/end2end/tests/simple_delayed_request.c',
+        'test/core/end2end/tests/simple_metadata.c',
+        'test/core/end2end/tests/simple_request.c',
+        'test/core/end2end/tests/streaming_error_response.c',
+        'test/core/end2end/tests/trailing_metadata.c',
+        'test/core/end2end/tests/workaround_cronet_compression.c',
+        'test/core/end2end/tests/write_buffering.c',
+        'test/core/end2end/tests/write_buffering_at_end.c',
+      ],
+    },
+  ]
+}
diff --git a/include/grpc++/impl/codegen/async_unary_call.h b/include/grpc++/impl/codegen/async_unary_call.h
index 6da64f0..f0f9096 100644
--- a/include/grpc++/impl/codegen/async_unary_call.h
+++ b/include/grpc++/impl/codegen/async_unary_call.h
@@ -87,28 +87,6 @@
         ClientAsyncResponseReader(call, context, request);
   }
 
-  /// TODO(vjpai): Delete the below constructor
-  /// PLEASE DO NOT USE THIS CONSTRUCTOR IN NEW CODE
-  /// This code is only present as a short-term workaround
-  /// for users that bypassed the code-generator and directly
-  /// created this struct rather than properly using a stub.
-  /// This code will not remain a valid public constructor for long.
-  template <class W>
-  ClientAsyncResponseReader(ChannelInterface* channel, CompletionQueue* cq,
-                            const RpcMethod& method, ClientContext* context,
-                            const W& request)
-      : context_(context),
-        call_(channel->CreateCall(method, context, cq)),
-        collection_(std::make_shared<Ops>()) {
-    collection_->init_buf.SetCollection(collection_);
-    collection_->init_buf.SendInitialMetadata(
-        context->send_initial_metadata_, context->initial_metadata_flags());
-    // TODO(ctiller): don't assert
-    GPR_CODEGEN_ASSERT(collection_->init_buf.SendMessage(request).ok());
-    collection_->init_buf.ClientSendClose();
-    call_.PerformOps(&collection_->init_buf);
-  }
-
   // always allocated against a call arena, no memory free required
   static void operator delete(void* ptr, std::size_t size) {
     assert(size == sizeof(ClientAsyncResponseReader));
@@ -119,22 +97,13 @@
   ///
   /// Side effect:
   ///   - the \a ClientContext associated with this call is updated with
-  ///     possible initial and trailing metadata sent from the serve.
+  ///     possible initial and trailing metadata sent from the server.
   void ReadInitialMetadata(void* tag) {
     GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_);
 
-    Ops* o = &ops_;
-
-    // TODO(vjpai): Remove the collection_ specialization as soon
-    // as the public constructor is deleted
-    if (collection_) {
-      o = collection_.get();
-      collection_->meta_buf.SetCollection(collection_);
-    }
-
-    o->meta_buf.set_output_tag(tag);
-    o->meta_buf.RecvInitialMetadata(context_);
-    call_.PerformOps(&o->meta_buf);
+    meta_buf.set_output_tag(tag);
+    meta_buf.RecvInitialMetadata(context_);
+    call_.PerformOps(&meta_buf);
   }
 
   /// See \a ClientAysncResponseReaderInterface::Finish for semantics.
@@ -143,23 +112,14 @@
   ///   - the \a ClientContext associated with this call is updated with
   ///     possible initial and trailing metadata sent from the server.
   void Finish(R* msg, Status* status, void* tag) {
-    Ops* o = &ops_;
-
-    // TODO(vjpai): Remove the collection_ specialization as soon
-    // as the public constructor is deleted
-    if (collection_) {
-      o = collection_.get();
-      collection_->finish_buf.SetCollection(collection_);
-    }
-
-    o->finish_buf.set_output_tag(tag);
+    finish_buf.set_output_tag(tag);
     if (!context_->initial_metadata_received_) {
-      o->finish_buf.RecvInitialMetadata(context_);
+      finish_buf.RecvInitialMetadata(context_);
     }
-    o->finish_buf.RecvMessage(msg);
-    o->finish_buf.AllowNoMessage();
-    o->finish_buf.ClientRecvStatus(context_, status);
-    call_.PerformOps(&o->finish_buf);
+    finish_buf.RecvMessage(msg);
+    finish_buf.AllowNoMessage();
+    finish_buf.ClientRecvStatus(context_, status);
+    call_.PerformOps(&finish_buf);
   }
 
  private:
@@ -169,33 +129,25 @@
   template <class W>
   ClientAsyncResponseReader(Call call, ClientContext* context, const W& request)
       : context_(context), call_(call) {
-    ops_.init_buf.SendInitialMetadata(context->send_initial_metadata_,
-                                      context->initial_metadata_flags());
+    init_buf.SendInitialMetadata(context->send_initial_metadata_,
+                                 context->initial_metadata_flags());
     // TODO(ctiller): don't assert
-    GPR_CODEGEN_ASSERT(ops_.init_buf.SendMessage(request).ok());
-    ops_.init_buf.ClientSendClose();
-    call_.PerformOps(&ops_.init_buf);
+    GPR_CODEGEN_ASSERT(init_buf.SendMessage(request).ok());
+    init_buf.ClientSendClose();
+    call_.PerformOps(&init_buf);
   }
 
   // disable operator new
   static void* operator new(std::size_t size);
   static void* operator new(std::size_t size, void* p) { return p; }
 
-  // TODO(vjpai): Remove the reference to CallOpSetCollectionInterface
-  // as soon as the related workaround (public constructor) is deleted
-  struct Ops : public CallOpSetCollectionInterface {
-    SneakyCallOpSet<CallOpSendInitialMetadata, CallOpSendMessage,
-                    CallOpClientSendClose>
-        init_buf;
-    CallOpSet<CallOpRecvInitialMetadata> meta_buf;
-    CallOpSet<CallOpRecvInitialMetadata, CallOpRecvMessage<R>,
-              CallOpClientRecvStatus>
-        finish_buf;
-  } ops_;
-
-  // TODO(vjpai): Remove the collection_ as soon as the related workaround
-  // (public constructor) is deleted
-  std::shared_ptr<Ops> collection_;
+  SneakyCallOpSet<CallOpSendInitialMetadata, CallOpSendMessage,
+                  CallOpClientSendClose>
+      init_buf;
+  CallOpSet<CallOpRecvInitialMetadata> meta_buf;
+  CallOpSet<CallOpRecvInitialMetadata, CallOpRecvMessage<R>,
+            CallOpClientRecvStatus>
+      finish_buf;
 };
 
 /// Async server-side API for handling unary calls, where the single
diff --git a/include/grpc++/impl/codegen/call.h b/include/grpc++/impl/codegen/call.h
index 33d8f4c..f45ab23 100644
--- a/include/grpc++/impl/codegen/call.h
+++ b/include/grpc++/impl/codegen/call.h
@@ -567,14 +567,6 @@
   grpc_slice error_message_;
 };
 
-/// TODO(vjpai): Remove the existence of CallOpSetCollectionInterface
-/// and references to it. This code is deprecated-on-arrival and is
-/// only added for users that bypassed the code-generator.
-class CallOpSetCollectionInterface {
- public:
-  virtual ~CallOpSetCollectionInterface() {}
-};
-
 /// An abstract collection of call ops, used to generate the
 /// grpc_call_op structure to pass down to the lower layers,
 /// and as it is-a CompletionQueueTag, also massages the final
@@ -585,18 +577,6 @@
   /// Fills in grpc_op, starting from ops[*nops] and moving
   /// upwards.
   virtual void FillOps(grpc_call* call, grpc_op* ops, size_t* nops) = 0;
-
-  /// TODO(vjpai): Remove the SetCollection method and comment. This is only
-  /// a short-term workaround for users that bypassed the code generator
-  /// Mark this as belonging to a collection if needed
-  void SetCollection(std::shared_ptr<CallOpSetCollectionInterface> collection) {
-    collection_ = collection;
-  }
-
- protected:
-  /// TODO(vjpai): Remove the collection_ field once the idea of bypassing the
-  /// code generator is forbidden. This is already deprecated
-  std::shared_ptr<CallOpSetCollectionInterface> collection_;
 };
 
 /// Primary implementaiton of CallOpSetInterface.
@@ -637,13 +617,7 @@
     this->Op6::FinishOp(status);
     *tag = return_tag_;
 
-    // TODO(vjpai): Remove the reference to collection_ once the idea of
-    // bypassing the code generator is forbidden. It is already deprecated
-    grpc_call* call = call_;
-    collection_.reset();
-
-    g_core_codegen_interface->grpc_call_unref(call);
-
+    g_core_codegen_interface->grpc_call_unref(call_);
     return true;
   }
 
diff --git a/package.json b/package.json
index b4b1663..2e31275 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "grpc",
-  "version": "1.5.0-dev",
+  "version": "1.7.0-dev",
   "author": "Google Inc.",
   "description": "gRPC Library for Node",
   "homepage": "https://grpc.io/",
diff --git a/package.xml b/package.xml
index 4e288b3..6e50bad 100644
--- a/package.xml
+++ b/package.xml
@@ -13,8 +13,8 @@
  <date>2017-05-22</date>
  <time>16:06:07</time>
  <version>
-  <release>1.5.0dev</release>
-  <api>1.5.0dev</api>
+  <release>1.7.0dev</release>
+  <api>1.7.0dev</api>
  </version>
  <stability>
   <release>beta</release>
diff --git a/src/compiler/csharp_generator.cc b/src/compiler/csharp_generator.cc
index ab4a8a6..bc3b0f2 100644
--- a/src/compiler/csharp_generator.cc
+++ b/src/compiler/csharp_generator.cc
@@ -670,6 +670,7 @@
       out.Print(leading_comments.c_str());
     }
 
+    out.Print("#pragma warning disable 1591\n");
     out.Print("#region Designer generated code\n");
     out.Print("\n");
     out.Print("using System;\n");
diff --git a/src/core/ext/transport/chttp2/transport/chttp2_transport.c b/src/core/ext/transport/chttp2/transport/chttp2_transport.c
index 8976686..7bad188 100644
--- a/src/core/ext/transport/chttp2/transport/chttp2_transport.c
+++ b/src/core/ext/transport/chttp2/transport/chttp2_transport.c
@@ -304,10 +304,10 @@
                     keepalive_watchdog_fired_locked, t,
                     grpc_combiner_scheduler(t->combiner));
 
-  grpc_bdp_estimator_init(&t->bdp_estimator, t->peer_string);
-  t->last_pid_update = gpr_now(GPR_CLOCK_MONOTONIC);
+  grpc_bdp_estimator_init(&t->flow_control.bdp_estimator, t->peer_string);
+  t->flow_control.last_pid_update = gpr_now(GPR_CLOCK_MONOTONIC);
   grpc_pid_controller_init(
-      &t->pid_controller,
+      &t->flow_control.pid_controller,
       (grpc_pid_controller_args){.gain_p = 4,
                                  .gain_i = 8,
                                  .gain_d = 0,
@@ -340,7 +340,7 @@
   t->force_send_settings = 1 << GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE;
   t->sent_local_settings = 0;
   t->write_buffer_size = DEFAULT_WINDOW;
-  t->enable_bdp_probe = true;
+  t->flow_control.enable_bdp_probe = true;
 
   if (is_client) {
     grpc_slice_buffer_add(&t->outbuf, grpc_slice_from_copied_string(
@@ -457,7 +457,7 @@
             (grpc_integer_options){0, 0, MAX_WRITE_BUFFER_SIZE});
       } else if (0 ==
                  strcmp(channel_args->args[i].key, GRPC_ARG_HTTP2_BDP_PROBE)) {
-        t->enable_bdp_probe = grpc_channel_arg_get_integer(
+        t->flow_control.enable_bdp_probe = grpc_channel_arg_get_integer(
             &channel_args->args[i], (grpc_integer_options){1, 0, 1});
       } else if (0 == strcmp(channel_args->args[i].key,
                              GRPC_ARG_KEEPALIVE_TIME_MS)) {
@@ -2253,46 +2253,27 @@
     case GRPC_CHTTP2_FLOWCTL_QUEUE_UPDATE:
       break;
   }
-}
-
-static void update_bdp(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
-                       double bdp_dbl) {
-  // initial window size bounded [1,2^31-1], but we set the min to 128.
-  int32_t bdp = GPR_CLAMP((int32_t)bdp_dbl, 128, INT32_MAX);
-  int64_t delta =
-      (int64_t)bdp -
-      (int64_t)t->settings[GRPC_LOCAL_SETTINGS]
-                          [GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE];
-  if (delta == 0 || (delta > -bdp / 10 && delta < bdp / 10)) {
-    return;
+  if (action.send_setting_update != GRPC_CHTTP2_FLOWCTL_NO_ACTION_NEEDED) {
+    if (action.initial_window_size > 0) {
+      queue_setting_update(exec_ctx, t,
+                           GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE,
+                           (uint32_t)action.initial_window_size);
+    }
+    if (action.max_frame_size > 0) {
+      queue_setting_update(exec_ctx, t, GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE,
+                           (uint32_t)action.max_frame_size);
+    }
+    if (action.send_setting_update == GRPC_CHTTP2_FLOWCTL_UPDATE_IMMEDIATELY) {
+      grpc_chttp2_initiate_write(exec_ctx, t, "immediate setting update");
+    }
   }
-  if (GRPC_TRACER_ON(grpc_bdp_estimator_trace) ||
-      GRPC_TRACER_ON(grpc_flowctl_trace)) {
-    gpr_log(GPR_DEBUG, "%s | %p[%s] | update initial window size to %d",
-            t->peer_string, t, t->is_client ? "cli" : "svr", (int)bdp);
+  if (action.need_ping) {
+    GRPC_CHTTP2_REF_TRANSPORT(t, "bdp_ping");
+    grpc_bdp_estimator_schedule_ping(&t->flow_control.bdp_estimator);
+    send_ping_locked(exec_ctx, t,
+                     GRPC_CHTTP2_PING_BEFORE_TRANSPORT_WINDOW_UPDATE,
+                     &t->start_bdp_ping_locked, &t->finish_bdp_ping_locked);
   }
-  queue_setting_update(exec_ctx, t, GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE,
-                       (uint32_t)bdp);
-}
-
-static void update_frame(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
-                         double bw_dbl, double bdp_dbl) {
-  int32_t bdp = (int32_t)GPR_CLAMP(bdp_dbl, 128.0, INT32_MAX);
-  int32_t target = (int32_t)GPR_MAX(bw_dbl / 1000, bdp);
-  // frame size is bounded [2^14,2^24-1]
-  int32_t frame_size = GPR_CLAMP(target, 16384, 16777215);
-  int64_t delta = (int64_t)frame_size -
-                  (int64_t)t->settings[GRPC_LOCAL_SETTINGS]
-                                      [GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE];
-  if (delta == 0 || (delta > -frame_size / 10 && delta < frame_size / 10)) {
-    return;
-  }
-  if (GRPC_TRACER_ON(grpc_bdp_estimator_trace)) {
-    gpr_log(GPR_DEBUG, "%s: update max_frame size to %d", t->peer_string,
-            (int)frame_size);
-  }
-  queue_setting_update(exec_ctx, t, GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE,
-                       (uint32_t)frame_size);
 }
 
 static grpc_error *try_http_parsing(grpc_exec_ctx *exec_ctx,
@@ -2330,7 +2311,6 @@
   GPR_TIMER_BEGIN("reading_action_locked", 0);
 
   grpc_chttp2_transport *t = tp;
-  bool need_bdp_ping = false;
 
   GRPC_ERROR_REF(error);
 
@@ -2349,11 +2329,9 @@
     grpc_error *errors[3] = {GRPC_ERROR_REF(error), GRPC_ERROR_NONE,
                              GRPC_ERROR_NONE};
     for (; i < t->read_buffer.count && errors[1] == GRPC_ERROR_NONE; i++) {
-      if (grpc_bdp_estimator_add_incoming_bytes(
-              &t->bdp_estimator,
-              (int64_t)GRPC_SLICE_LENGTH(t->read_buffer.slices[i]))) {
-        need_bdp_ping = true;
-      }
+      grpc_bdp_estimator_add_incoming_bytes(
+          &t->flow_control.bdp_estimator,
+          (int64_t)GRPC_SLICE_LENGTH(t->read_buffer.slices[i]));
       errors[1] =
           grpc_chttp2_perform_read(exec_ctx, t, t->read_buffer.slices[i]);
     }
@@ -2400,45 +2378,9 @@
   if (keep_reading) {
     grpc_endpoint_read(exec_ctx, t->ep, &t->read_buffer,
                        &t->read_action_locked);
-
-    if (t->enable_bdp_probe) {
-      if (need_bdp_ping) {
-        GRPC_CHTTP2_REF_TRANSPORT(t, "bdp_ping");
-        grpc_bdp_estimator_schedule_ping(&t->bdp_estimator);
-        send_ping_locked(exec_ctx, t,
-                         GRPC_CHTTP2_PING_BEFORE_TRANSPORT_WINDOW_UPDATE,
-                         &t->start_bdp_ping_locked, &t->finish_bdp_ping_locked);
-      }
-
-      int64_t estimate = -1;
-      double bdp_guess = -1;
-      if (grpc_bdp_estimator_get_estimate(&t->bdp_estimator, &estimate)) {
-        double target = 1 + log2((double)estimate);
-        double memory_pressure = grpc_resource_quota_get_memory_pressure(
-            grpc_resource_user_quota(grpc_endpoint_get_resource_user(t->ep)));
-        if (memory_pressure > 0.8) {
-          target *= 1 - GPR_MIN(1, (memory_pressure - 0.8) / 0.1);
-        }
-        double bdp_error =
-            target - grpc_pid_controller_last(&t->pid_controller);
-        gpr_timespec now = gpr_now(GPR_CLOCK_MONOTONIC);
-        gpr_timespec dt_timespec = gpr_time_sub(now, t->last_pid_update);
-        double dt = (double)dt_timespec.tv_sec + dt_timespec.tv_nsec * 1e-9;
-        if (dt > 0.1) {
-          dt = 0.1;
-        }
-        double log2_bdp_guess =
-            grpc_pid_controller_update(&t->pid_controller, bdp_error, dt);
-        bdp_guess = pow(2, log2_bdp_guess);
-        update_bdp(exec_ctx, t, bdp_guess);
-        t->last_pid_update = now;
-      }
-
-      double bw = -1;
-      if (grpc_bdp_estimator_get_bw(&t->bdp_estimator, &bw)) {
-        update_frame(exec_ctx, t, bw, bdp_guess);
-      }
-    }
+    grpc_chttp2_act_on_flowctl_action(
+        exec_ctx, grpc_chttp2_flowctl_get_bdp_action(&t->flow_control), t,
+        NULL);
     GRPC_CHTTP2_UNREF_TRANSPORT(exec_ctx, t, "keep_reading");
   } else {
     GRPC_CHTTP2_UNREF_TRANSPORT(exec_ctx, t, "reading_action");
@@ -2461,7 +2403,7 @@
   if (t->keepalive_state == GRPC_CHTTP2_KEEPALIVE_STATE_WAITING) {
     grpc_timer_cancel(exec_ctx, &t->keepalive_ping_timer);
   }
-  grpc_bdp_estimator_start_ping(&t->bdp_estimator);
+  grpc_bdp_estimator_start_ping(&t->flow_control.bdp_estimator);
 }
 
 static void finish_bdp_ping_locked(grpc_exec_ctx *exec_ctx, void *tp,
@@ -2470,7 +2412,7 @@
   if (GRPC_TRACER_ON(grpc_http_trace)) {
     gpr_log(GPR_DEBUG, "%s: Complete BDP ping", t->peer_string);
   }
-  grpc_bdp_estimator_complete_ping(&t->bdp_estimator);
+  grpc_bdp_estimator_complete_ping(&t->flow_control.bdp_estimator);
 
   GRPC_CHTTP2_UNREF_TRANSPORT(exec_ctx, t, "bdp_ping");
 }
diff --git a/src/core/ext/transport/chttp2/transport/flow_control.c b/src/core/ext/transport/chttp2/transport/flow_control.c
index c9f7eab..8dbdd12 100644
--- a/src/core/ext/transport/chttp2/transport/flow_control.c
+++ b/src/core/ext/transport/chttp2/transport/flow_control.c
@@ -18,6 +18,7 @@
 
 #include "src/core/ext/transport/chttp2/transport/internal.h"
 
+#include <math.h>
 #include <string.h>
 
 #include <grpc/support/alloc.h>
@@ -39,6 +40,8 @@
   int64_t remote_window_delta;
   int64_t local_window_delta;
   int64_t announced_window_delta;
+  uint32_t local_init_window;
+  uint32_t local_max_frame;
 } shadow_flow_control;
 
 static void pretrace(shadow_flow_control* shadow_fc,
@@ -54,14 +57,28 @@
   }
 }
 
-static char* fmt_str(int64_t old, int64_t new) {
+#define TRACE_PADDING 30
+
+static char* fmt_int64_diff_str(int64_t old, int64_t new) {
   char* str;
   if (old != new) {
     gpr_asprintf(&str, "%" PRId64 " -> %" PRId64 "", old, new);
   } else {
     gpr_asprintf(&str, "%" PRId64 "", old);
   }
-  char* str_lp = gpr_leftpad(str, ' ', 30);
+  char* str_lp = gpr_leftpad(str, ' ', TRACE_PADDING);
+  gpr_free(str);
+  return str_lp;
+}
+
+static char* fmt_uint32_diff_str(uint32_t old, uint32_t new) {
+  char* str;
+  if (new > 0 && old != new) {
+    gpr_asprintf(&str, "%" PRIu32 " -> %" PRIu32 "", old, new);
+  } else {
+    gpr_asprintf(&str, "%" PRIu32 "", old);
+  }
+  char* str_lp = gpr_leftpad(str, ' ', TRACE_PADDING);
   gpr_free(str);
   return str_lp;
 }
@@ -75,24 +92,28 @@
   uint32_t remote_window =
       tfc->t->settings[GRPC_PEER_SETTINGS]
                       [GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE];
-  char* trw_str = fmt_str(shadow_fc->remote_window, tfc->remote_window);
-  char* tlw_str = fmt_str(shadow_fc->target_window,
-                          grpc_chttp2_target_announced_window(tfc));
-  char* taw_str = fmt_str(shadow_fc->announced_window, tfc->announced_window);
+  char* trw_str =
+      fmt_int64_diff_str(shadow_fc->remote_window, tfc->remote_window);
+  char* tlw_str = fmt_int64_diff_str(shadow_fc->target_window,
+                                     grpc_chttp2_target_announced_window(tfc));
+  char* taw_str =
+      fmt_int64_diff_str(shadow_fc->announced_window, tfc->announced_window);
   char* srw_str;
   char* slw_str;
   char* saw_str;
   if (sfc != NULL) {
-    srw_str = fmt_str(shadow_fc->remote_window_delta + remote_window,
-                      sfc->remote_window_delta + remote_window);
-    slw_str = fmt_str(shadow_fc->local_window_delta + acked_local_window,
-                      sfc->local_window_delta + acked_local_window);
-    saw_str = fmt_str(shadow_fc->announced_window_delta + acked_local_window,
-                      sfc->announced_window_delta + acked_local_window);
+    srw_str = fmt_int64_diff_str(shadow_fc->remote_window_delta + remote_window,
+                                 sfc->remote_window_delta + remote_window);
+    slw_str =
+        fmt_int64_diff_str(shadow_fc->local_window_delta + acked_local_window,
+                           sfc->local_window_delta + acked_local_window);
+    saw_str = fmt_int64_diff_str(
+        shadow_fc->announced_window_delta + acked_local_window,
+        sfc->announced_window_delta + acked_local_window);
   } else {
-    srw_str = gpr_leftpad("", ' ', 30);
-    slw_str = gpr_leftpad("", ' ', 30);
-    saw_str = gpr_leftpad("", ' ', 30);
+    srw_str = gpr_leftpad("", ' ', TRACE_PADDING);
+    slw_str = gpr_leftpad("", ' ', TRACE_PADDING);
+    saw_str = gpr_leftpad("", ' ', TRACE_PADDING);
   }
   gpr_log(GPR_DEBUG,
           "%p[%u][%s] | %s | trw:%s, ttw:%s, taw:%s, srw:%s, slw:%s, saw:%s",
@@ -120,10 +141,21 @@
   GPR_UNREACHABLE_CODE(return "unknown");
 }
 
-static void trace_action(grpc_chttp2_flowctl_action action) {
-  gpr_log(GPR_DEBUG, "transport: %s,  stream: %s",
+static void trace_action(grpc_chttp2_transport_flowctl* tfc,
+                         grpc_chttp2_flowctl_action action) {
+  char* iw_str = fmt_uint32_diff_str(
+      tfc->t->settings[GRPC_SENT_SETTINGS]
+                      [GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE],
+      action.initial_window_size);
+  char* mf_str = fmt_uint32_diff_str(
+      tfc->t->settings[GRPC_SENT_SETTINGS][GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE],
+      action.max_frame_size);
+  gpr_log(GPR_DEBUG, "t[%s],  s[%s], settings[%s] iw:%s mf:%s",
           urgency_to_string(action.send_transport_update),
-          urgency_to_string(action.send_stream_update));
+          urgency_to_string(action.send_stream_update),
+          urgency_to_string(action.send_setting_update), iw_str, mf_str);
+  gpr_free(iw_str);
+  gpr_free(mf_str);
 }
 
 #define PRETRACE(tfc, sfc)       \
@@ -131,11 +163,12 @@
   GRPC_FLOW_CONTROL_IF_TRACING(pretrace(&shadow_fc, tfc, sfc))
 #define POSTTRACE(tfc, sfc, reason) \
   GRPC_FLOW_CONTROL_IF_TRACING(posttrace(&shadow_fc, tfc, sfc, reason))
-#define TRACEACTION(action) GRPC_FLOW_CONTROL_IF_TRACING(trace_action(action))
+#define TRACEACTION(tfc, action) \
+  GRPC_FLOW_CONTROL_IF_TRACING(trace_action(tfc, action))
 #else
 #define PRETRACE(tfc, sfc)
 #define POSTTRACE(tfc, sfc, reason)
-#define TRACEACTION(action)
+#define TRACEACTION(tfc, action)
 #endif
 
 /* How many bytes of incoming flow control would we like to advertise */
@@ -342,15 +375,58 @@
   announced_window_delta_preupdate(tfc, sfc);
 }
 
+// Returns an urgency with which to make an update
+static grpc_chttp2_flowctl_urgency delta_is_significant(
+    const grpc_chttp2_transport_flowctl* tfc, int32_t value,
+    grpc_chttp2_setting_id setting_id) {
+  int64_t delta = (int64_t)value -
+                  (int64_t)tfc->t->settings[GRPC_LOCAL_SETTINGS][setting_id];
+  // TODO(ncteisen): tune this
+  if (delta != 0 && (delta <= -value / 5 || delta >= value / 5)) {
+    return GRPC_CHTTP2_FLOWCTL_QUEUE_UPDATE;
+  } else {
+    return GRPC_CHTTP2_FLOWCTL_NO_ACTION_NEEDED;
+  }
+}
+
+// Takes in a target and uses the pid controller to return a stabilized
+// guess at the new bdp.
+static double get_pid_controller_guess(grpc_chttp2_transport_flowctl* tfc,
+                                       double target) {
+  double bdp_error = target - grpc_pid_controller_last(&tfc->pid_controller);
+  gpr_timespec now = gpr_now(GPR_CLOCK_MONOTONIC);
+  gpr_timespec dt_timespec = gpr_time_sub(now, tfc->last_pid_update);
+  double dt = (double)dt_timespec.tv_sec + dt_timespec.tv_nsec * 1e-9;
+  if (dt > 0.1) {
+    dt = 0.1;
+  }
+  double log2_bdp_guess =
+      grpc_pid_controller_update(&tfc->pid_controller, bdp_error, dt);
+  tfc->last_pid_update = now;
+  return pow(2, log2_bdp_guess);
+}
+
+// Take in a target and modifies it based on the memory pressure of the system
+static double get_target_under_memory_pressure(
+    grpc_chttp2_transport_flowctl* tfc, double target) {
+  // do not increase window under heavy memory pressure.
+  double memory_pressure = grpc_resource_quota_get_memory_pressure(
+      grpc_resource_user_quota(grpc_endpoint_get_resource_user(tfc->t->ep)));
+  if (memory_pressure > 0.8) {
+    target *= 1 - GPR_MIN(1, (memory_pressure - 0.8) / 0.1);
+  }
+  return target;
+}
+
 grpc_chttp2_flowctl_action grpc_chttp2_flowctl_get_action(
-    const grpc_chttp2_transport_flowctl* tfc,
-    const grpc_chttp2_stream_flowctl* sfc) {
+    grpc_chttp2_transport_flowctl* tfc, grpc_chttp2_stream_flowctl* sfc) {
   grpc_chttp2_flowctl_action action;
   memset(&action, 0, sizeof(action));
   uint32_t target_announced_window = grpc_chttp2_target_announced_window(tfc);
   if (tfc->announced_window < target_announced_window / 2) {
     action.send_transport_update = GRPC_CHTTP2_FLOWCTL_UPDATE_IMMEDIATELY;
   }
+  // TODO(ncteisen): tune this
   if (sfc != NULL && !sfc->s->read_closed) {
     uint32_t sent_init_window =
         tfc->t->settings[GRPC_SENT_SETTINGS]
@@ -364,6 +440,61 @@
       action.send_stream_update = GRPC_CHTTP2_FLOWCTL_QUEUE_UPDATE;
     }
   }
-  TRACEACTION(action);
+  TRACEACTION(tfc, action);
+  return action;
+}
+
+grpc_chttp2_flowctl_action grpc_chttp2_flowctl_get_bdp_action(
+    grpc_chttp2_transport_flowctl* tfc) {
+  grpc_chttp2_flowctl_action action;
+  memset(&action, 0, sizeof(action));
+  if (tfc->enable_bdp_probe) {
+    action.need_ping = grpc_bdp_estimator_need_ping(&tfc->bdp_estimator);
+
+    // get bdp estimate and update initial_window accordingly.
+    int64_t estimate = -1;
+    int32_t bdp = -1;
+    if (grpc_bdp_estimator_get_estimate(&tfc->bdp_estimator, &estimate)) {
+      double target = 1 + log2((double)estimate);
+
+      // target might change based on how much memory pressure we are under
+      // TODO(ncteisen): experiment with setting target to be huge under low
+      // memory pressure.
+      target = get_target_under_memory_pressure(tfc, target);
+
+      // run our target through the pid controller to stabilize change.
+      // TODO(ncteisen): experiment with other controllers here.
+      double bdp_guess = get_pid_controller_guess(tfc, target);
+
+      // Though initial window 'could' drop to 0, we keep the floor at 128
+      bdp = GPR_MAX((int32_t)bdp_guess, 128);
+
+      grpc_chttp2_flowctl_urgency init_window_update_urgency =
+          delta_is_significant(tfc, bdp,
+                               GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE);
+      if (init_window_update_urgency != GRPC_CHTTP2_FLOWCTL_NO_ACTION_NEEDED) {
+        action.send_setting_update = init_window_update_urgency;
+        action.initial_window_size = (uint32_t)bdp;
+      }
+    }
+
+    // get bandwidth estimate and update max_frame accordingly.
+    double bw_dbl = -1;
+    if (grpc_bdp_estimator_get_bw(&tfc->bdp_estimator, &bw_dbl)) {
+      // we target the max of BDP or bandwidth in microseconds.
+      int32_t frame_size =
+          GPR_CLAMP(GPR_MAX((int32_t)bw_dbl / 1000, bdp), 16384, 16777215);
+      grpc_chttp2_flowctl_urgency frame_size_urgency = delta_is_significant(
+          tfc, frame_size, GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE);
+      if (frame_size_urgency != GRPC_CHTTP2_FLOWCTL_NO_ACTION_NEEDED) {
+        if (frame_size_urgency > action.send_setting_update) {
+          action.send_setting_update = frame_size_urgency;
+        }
+        action.max_frame_size = (uint32_t)frame_size;
+      }
+    }
+  }
+
+  TRACEACTION(tfc, action);
   return action;
 }
diff --git a/src/core/ext/transport/chttp2/transport/internal.h b/src/core/ext/transport/chttp2/transport/internal.h
index f26f14d..3c41a89 100644
--- a/src/core/ext/transport/chttp2/transport/internal.h
+++ b/src/core/ext/transport/chttp2/transport/internal.h
@@ -238,7 +238,17 @@
    * to send WINDOW_UPDATE frames. */
   int64_t announced_window;
 
-  // read only pointer back to transport for certain data
+  /** should we probe bdp? */
+  bool enable_bdp_probe;
+
+  /* bdp estimation */
+  grpc_bdp_estimator bdp_estimator;
+
+  /* pid controller */
+  grpc_pid_controller pid_controller;
+  gpr_timespec last_pid_update;
+
+  // pointer back to transport for tracing
   const grpc_chttp2_transport *t;
 } grpc_chttp2_transport_flowctl;
 
@@ -261,9 +271,6 @@
   /** is there a read request to the endpoint outstanding? */
   uint8_t endpoint_reading;
 
-  /** should we probe bdp? */
-  bool enable_bdp_probe;
-
   grpc_chttp2_optimization_target opt_target;
 
   /** various lists of streams */
@@ -358,13 +365,6 @@
 
   grpc_chttp2_transport_flowctl flow_control;
 
-  /* bdp estimation */
-  grpc_bdp_estimator bdp_estimator;
-
-  /* pid controller */
-  grpc_pid_controller pid_controller;
-  gpr_timespec last_pid_update;
-
   /* deframing */
   grpc_chttp2_deframe_transport_state deframe_state;
   uint8_t incoming_frame_type;
@@ -704,13 +704,19 @@
 typedef struct {
   grpc_chttp2_flowctl_urgency send_stream_update;
   grpc_chttp2_flowctl_urgency send_transport_update;
+  grpc_chttp2_flowctl_urgency send_setting_update;
+  uint32_t initial_window_size;
+  uint32_t max_frame_size;
+  bool need_ping;
 } grpc_chttp2_flowctl_action;
 
 // Reads the flow control data and returns and actionable struct that will tell
 // chttp2 exactly what it needs to do
 grpc_chttp2_flowctl_action grpc_chttp2_flowctl_get_action(
-    const grpc_chttp2_transport_flowctl *tfc,
-    const grpc_chttp2_stream_flowctl *sfc);
+    grpc_chttp2_transport_flowctl *tfc, grpc_chttp2_stream_flowctl *sfc);
+
+grpc_chttp2_flowctl_action grpc_chttp2_flowctl_get_bdp_action(
+    grpc_chttp2_transport_flowctl *tfc);
 
 // Takes in a flow control action and performs all the needed operations.
 void grpc_chttp2_act_on_flowctl_action(grpc_exec_ctx *exec_ctx,
diff --git a/src/core/lib/iomgr/ev_epoll1_linux.c b/src/core/lib/iomgr/ev_epoll1_linux.c
index 90e0ce3..6b034ca 100644
--- a/src/core/lib/iomgr/ev_epoll1_linux.c
+++ b/src/core/lib/iomgr/ev_epoll1_linux.c
@@ -406,7 +406,14 @@
   gpr_mu_init(&pollset->mu);
   *mu = &pollset->mu;
   pollset->neighbourhood = &g_neighbourhoods[choose_neighbourhood()];
+  pollset->reassigning_neighbourhood = false;
+  pollset->root_worker = NULL;
+  pollset->kicked_without_poller = false;
   pollset->seen_inactive = true;
+  pollset->shutting_down = false;
+  pollset->shutdown_closure = NULL;
+  pollset->begin_refs = 0;
+  pollset->next = pollset->prev = NULL;
 }
 
 static void pollset_destroy(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset) {
@@ -1043,8 +1050,6 @@
 /* It is possible that GLIBC has epoll but the underlying kernel doesn't.
  * Create a dummy epoll_fd to make sure epoll support is available */
 const grpc_event_engine_vtable *grpc_init_epoll1_linux(bool explicit_request) {
-  /* TODO(sreek): Temporarily disable this poller unless explicitly requested
-   * via GRPC_POLL_STRATEGY */
   if (!explicit_request) {
     return NULL;
   }
diff --git a/src/core/lib/security/credentials/jwt/jwt_verifier.c b/src/core/lib/security/credentials/jwt/jwt_verifier.c
index 6cd558d..a27284b 100644
--- a/src/core/lib/security/credentials/jwt/jwt_verifier.c
+++ b/src/core/lib/security/credentials/jwt/jwt_verifier.c
@@ -442,7 +442,7 @@
 
 end:
   BIO_free(bio);
-  if (x509 != NULL) X509_free(x509);
+  X509_free(x509);
   return result;
 }
 
@@ -496,6 +496,8 @@
   const grpc_json *key_prop;
   RSA *rsa = NULL;
   EVP_PKEY *result = NULL;
+  BIGNUM *tmp_n = NULL;
+  BIGNUM *tmp_e = NULL;
 
   GPR_ASSERT(kty != NULL && json != NULL);
   if (strcmp(kty, "RSA") != 0) {
@@ -507,8 +509,6 @@
     gpr_log(GPR_ERROR, "Could not create rsa key.");
     goto end;
   }
-  BIGNUM *tmp_n = NULL;
-  BIGNUM *tmp_e = NULL;
   for (key_prop = json->child; key_prop != NULL; key_prop = key_prop->next) {
     if (strcmp(key_prop->key, "n") == 0) {
       tmp_n =
@@ -528,11 +528,16 @@
     gpr_log(GPR_ERROR, "Cannot set RSA key from inputs.");
     goto end;
   }
+  /* RSA_set0_key takes ownership on success. */
+  tmp_n = NULL;
+  tmp_e = NULL;
   result = EVP_PKEY_new();
   EVP_PKEY_set1_RSA(result, rsa); /* uprefs rsa. */
 
 end:
-  if (rsa != NULL) RSA_free(rsa);
+  RSA_free(rsa);
+  BN_free(tmp_n);
+  BN_free(tmp_e);
   return result;
 }
 
@@ -618,7 +623,7 @@
   result = 1;
 
 end:
-  if (md_ctx != NULL) EVP_MD_CTX_destroy(md_ctx);
+  EVP_MD_CTX_destroy(md_ctx);
   return result;
 }
 
@@ -658,7 +663,7 @@
 
 end:
   if (json != NULL) grpc_json_destroy(json);
-  if (verification_key != NULL) EVP_PKEY_free(verification_key);
+  EVP_PKEY_free(verification_key);
   ctx->user_cb(exec_ctx, ctx->user_data, status, claims);
   verifier_cb_ctx_destroy(exec_ctx, ctx);
 }
diff --git a/src/core/lib/security/credentials/oauth2/oauth2_credentials.c b/src/core/lib/security/credentials/oauth2/oauth2_credentials.c
index c59e551..10b270c 100644
--- a/src/core/lib/security/credentials/oauth2/oauth2_credentials.c
+++ b/src/core/lib/security/credentials/oauth2/oauth2_credentials.c
@@ -296,10 +296,10 @@
   gpr_mu_unlock(&c->mu);
   if (start_fetch) {
     grpc_call_credentials_ref(creds);
-    c->fetch_func(exec_ctx, grpc_credentials_metadata_request_create(creds),
-                  &c->httpcli_context, &c->pollent,
-                  on_oauth2_token_fetcher_http_response,
-                  gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), refresh_threshold));
+    c->fetch_func(
+        exec_ctx, grpc_credentials_metadata_request_create(creds),
+        &c->httpcli_context, &c->pollent, on_oauth2_token_fetcher_http_response,
+        gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC), refresh_threshold));
   }
   return false;
 }
diff --git a/src/core/lib/surface/version.c b/src/core/lib/surface/version.c
index 8cef15d..96c1610 100644
--- a/src/core/lib/surface/version.c
+++ b/src/core/lib/surface/version.c
@@ -23,4 +23,4 @@
 
 const char *grpc_version_string(void) { return "4.0.0-dev"; }
 
-const char *grpc_g_stands_for(void) { return "gregarious"; }
+const char *grpc_g_stands_for(void) { return "gambit"; }
diff --git a/src/core/lib/transport/bdp_estimator.c b/src/core/lib/transport/bdp_estimator.c
index 311ae63..8b57693 100644
--- a/src/core/lib/transport/bdp_estimator.c
+++ b/src/core/lib/transport/bdp_estimator.c
@@ -33,20 +33,24 @@
   estimator->bw_est = 0;
 }
 
-bool grpc_bdp_estimator_get_estimate(grpc_bdp_estimator *estimator,
+bool grpc_bdp_estimator_get_estimate(const grpc_bdp_estimator *estimator,
                                      int64_t *estimate) {
   *estimate = estimator->estimate;
   return true;
 }
 
-bool grpc_bdp_estimator_get_bw(grpc_bdp_estimator *estimator, double *bw) {
+bool grpc_bdp_estimator_get_bw(const grpc_bdp_estimator *estimator,
+                               double *bw) {
   *bw = estimator->bw_est;
   return true;
 }
 
-bool grpc_bdp_estimator_add_incoming_bytes(grpc_bdp_estimator *estimator,
+void grpc_bdp_estimator_add_incoming_bytes(grpc_bdp_estimator *estimator,
                                            int64_t num_bytes) {
   estimator->accumulator += num_bytes;
+}
+
+bool grpc_bdp_estimator_need_ping(const grpc_bdp_estimator *estimator) {
   switch (estimator->ping_state) {
     case GRPC_BDP_PING_UNSCHEDULED:
       return true;
diff --git a/src/core/lib/transport/bdp_estimator.h b/src/core/lib/transport/bdp_estimator.h
index a232d1f..1ef0dc9 100644
--- a/src/core/lib/transport/bdp_estimator.h
+++ b/src/core/lib/transport/bdp_estimator.h
@@ -47,13 +47,15 @@
 void grpc_bdp_estimator_init(grpc_bdp_estimator *estimator, const char *name);
 
 // Returns true if a reasonable estimate could be obtained
-bool grpc_bdp_estimator_get_estimate(grpc_bdp_estimator *estimator,
+bool grpc_bdp_estimator_get_estimate(const grpc_bdp_estimator *estimator,
                                      int64_t *estimate);
-// Returns true if a reasonable estimate could be obtained
-bool grpc_bdp_estimator_get_bw(grpc_bdp_estimator *estimator, double *bw);
+// Tracks new bytes read.
+bool grpc_bdp_estimator_get_bw(const grpc_bdp_estimator *estimator, double *bw);
 // Returns true if the user should schedule a ping
-bool grpc_bdp_estimator_add_incoming_bytes(grpc_bdp_estimator *estimator,
+void grpc_bdp_estimator_add_incoming_bytes(grpc_bdp_estimator *estimator,
                                            int64_t num_bytes);
+// Returns true if the user should schedule a ping
+bool grpc_bdp_estimator_need_ping(const grpc_bdp_estimator *estimator);
 // Schedule a ping: call in response to receiving a true from
 // grpc_bdp_estimator_add_incoming_bytes once a ping has been scheduled by a
 // transport (but not necessarily started)
diff --git a/src/cpp/common/version_cc.cc b/src/cpp/common/version_cc.cc
index 34558ea..2e9a513 100644
--- a/src/cpp/common/version_cc.cc
+++ b/src/cpp/common/version_cc.cc
@@ -22,5 +22,5 @@
 #include <grpc++/grpc++.h>
 
 namespace grpc {
-grpc::string Version() { return "1.5.0-dev"; }
+grpc::string Version() { return "1.7.0-dev"; }
 }
diff --git a/src/csharp/Grpc.Auth/Grpc.Auth.csproj b/src/csharp/Grpc.Auth/Grpc.Auth.csproj
index 6030c70..abf3264 100755
--- a/src/csharp/Grpc.Auth/Grpc.Auth.csproj
+++ b/src/csharp/Grpc.Auth/Grpc.Auth.csproj
@@ -19,6 +19,7 @@
     <IncludeSymbols>true</IncludeSymbols>
     <IncludeSource>true</IncludeSource>
     <GenerateDocumentationFile>true</GenerateDocumentationFile>
+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/src/csharp/Grpc.Core.Testing/Grpc.Core.Testing.csproj b/src/csharp/Grpc.Core.Testing/Grpc.Core.Testing.csproj
index 4e186d1..9ad6fd0 100755
--- a/src/csharp/Grpc.Core.Testing/Grpc.Core.Testing.csproj
+++ b/src/csharp/Grpc.Core.Testing/Grpc.Core.Testing.csproj
@@ -19,6 +19,7 @@
     <IncludeSymbols>true</IncludeSymbols>
     <IncludeSource>true</IncludeSource>
     <GenerateDocumentationFile>true</GenerateDocumentationFile>
+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/src/csharp/Grpc.Core.Tests/ClientServerTest.cs b/src/csharp/Grpc.Core.Tests/ClientServerTest.cs
index 0cb9288..72d9035 100644
--- a/src/csharp/Grpc.Core.Tests/ClientServerTest.cs
+++ b/src/csharp/Grpc.Core.Tests/ClientServerTest.cs
@@ -57,9 +57,9 @@
         [Test]
         public async Task UnaryCall()
         {
-            helper.UnaryHandler = new UnaryServerMethod<string, string>(async (request, context) =>
+            helper.UnaryHandler = new UnaryServerMethod<string, string>((request, context) =>
             {
-                return request;
+                return Task.FromResult(request);
             });
 
             Assert.AreEqual("ABC", Calls.BlockingUnaryCall(helper.CreateUnaryCall(), "ABC"));
@@ -124,10 +124,10 @@
         [Test]
         public void UnaryCall_ServerHandlerSetsStatus()
         {
-            helper.UnaryHandler = new UnaryServerMethod<string, string>(async (request, context) =>
+            helper.UnaryHandler = new UnaryServerMethod<string, string>((request, context) =>
             {
                 context.Status = new Status(StatusCode.Unauthenticated, "");
-                return "";
+                return Task.FromResult("");
             });
 
             var ex = Assert.Throws<RpcException>(() => Calls.BlockingUnaryCall(helper.CreateUnaryCall(), "abc"));
@@ -142,11 +142,11 @@
         [Test]
         public void UnaryCall_ServerHandlerSetsStatusAndTrailers()
         {
-            helper.UnaryHandler = new UnaryServerMethod<string, string>(async (request, context) =>
+            helper.UnaryHandler = new UnaryServerMethod<string, string>((request, context) =>
             {
                 context.Status = new Status(StatusCode.Unauthenticated, "");
                 context.ResponseTrailers.Add("xyz", "xyz-value");
-                return "";
+                return Task.FromResult("");
             });
 
             var ex = Assert.Throws<RpcException>(() => Calls.BlockingUnaryCall(helper.CreateUnaryCall(), "abc"));
@@ -168,9 +168,10 @@
             helper.ClientStreamingHandler = new ClientStreamingServerMethod<string, string>(async (requestStream, context) =>
             {
                 string result = "";
-                await requestStream.ForEachAsync(async (request) =>
+                await requestStream.ForEachAsync((request) =>
                 {
                     result += request;
+                    return TaskUtils.CompletedTask;
                 });
                 await Task.Delay(100);
                 return result;
@@ -203,9 +204,7 @@
         [Test]
         public async Task ServerStreamingCall_EndOfStreamIsIdempotent()
         {
-            helper.ServerStreamingHandler = new ServerStreamingServerMethod<string, string>(async (request, responseStream, context) =>
-            {
-            });
+            helper.ServerStreamingHandler = new ServerStreamingServerMethod<string, string>((request, responseStream, context) => TaskUtils.CompletedTask);
 
             var call = Calls.AsyncServerStreamingCall(helper.CreateServerStreamingCall(), "");
 
@@ -214,11 +213,12 @@
         }
 
         [Test]
-        public async Task ServerStreamingCall_ErrorCanBeAwaitedTwice()
+        public void ServerStreamingCall_ErrorCanBeAwaitedTwice()
         {
-            helper.ServerStreamingHandler = new ServerStreamingServerMethod<string, string>(async (request, responseStream, context) =>
+            helper.ServerStreamingHandler = new ServerStreamingServerMethod<string, string>((request, responseStream, context) =>
             {
                 context.Status = new Status(StatusCode.InvalidArgument, "");
+                return TaskUtils.CompletedTask;
             });
 
             var call = Calls.AsyncServerStreamingCall(helper.CreateServerStreamingCall(), "");
@@ -232,9 +232,9 @@
         }
 
         [Test]
-        public async Task ServerStreamingCall_TrailersFromMultipleSourcesGetConcatenated()
+        public void ServerStreamingCall_TrailersFromMultipleSourcesGetConcatenated()
         {
-            helper.ServerStreamingHandler = new ServerStreamingServerMethod<string, string>(async (request, responseStream, context) =>
+            helper.ServerStreamingHandler = new ServerStreamingServerMethod<string, string>((request, responseStream, context) =>
             {
                 context.ResponseTrailers.Add("xyz", "xyz-value");
                 throw new RpcException(new Status(StatusCode.InvalidArgument, ""), new Metadata { {"abc", "abc-value"} });
@@ -343,7 +343,7 @@
         [Test]
         public async Task AsyncUnaryCall_EchoMetadata()
         {
-            helper.UnaryHandler = new UnaryServerMethod<string, string>(async (request, context) =>
+            helper.UnaryHandler = new UnaryServerMethod<string, string>((request, context) =>
             {
                 foreach (Metadata.Entry metadataEntry in context.RequestHeaders)
                 {
@@ -352,7 +352,7 @@
                         context.ResponseTrailers.Add(metadataEntry);
                     }
                 }
-                return "";
+                return Task.FromResult("");
             });
 
             var headers = new Metadata
@@ -395,10 +395,10 @@
         {
             // some japanese and chinese characters
             var nonAsciiString = "\u30a1\u30a2\u30a3 \u62b5\u6297\u662f\u5f92\u52b3\u7684";
-            helper.UnaryHandler = new UnaryServerMethod<string, string>(async (request, context) =>
+            helper.UnaryHandler = new UnaryServerMethod<string, string>((request, context) =>
             {
                 context.Status = new Status(StatusCode.Unknown, nonAsciiString);
-                return "";
+                return Task.FromResult("");
             });
 
             var ex = Assert.Throws<RpcException>(() => Calls.BlockingUnaryCall(helper.CreateUnaryCall(), "abc"));
@@ -409,9 +409,9 @@
         [Test]
         public void ServerCallContext_PeerInfoPresent()
         {
-            helper.UnaryHandler = new UnaryServerMethod<string, string>(async (request, context) =>
+            helper.UnaryHandler = new UnaryServerMethod<string, string>((request, context) =>
             {
-                return context.Peer;
+                return Task.FromResult(context.Peer);
             });
 
             string peer = Calls.BlockingUnaryCall(helper.CreateUnaryCall(), "abc");
@@ -421,11 +421,11 @@
         [Test]
         public void ServerCallContext_HostAndMethodPresent()
         {
-            helper.UnaryHandler = new UnaryServerMethod<string, string>(async (request, context) =>
+            helper.UnaryHandler = new UnaryServerMethod<string, string>((request, context) =>
             {
                 Assert.IsTrue(context.Host.Contains(Host));
                 Assert.AreEqual("/tests.Test/Unary", context.Method);
-                return "PASS";
+                return Task.FromResult("PASS");
             });
             Assert.AreEqual("PASS", Calls.BlockingUnaryCall(helper.CreateUnaryCall(), "abc"));
         }
@@ -433,11 +433,11 @@
         [Test]
         public void ServerCallContext_AuthContextNotPopulated()
         {
-            helper.UnaryHandler = new UnaryServerMethod<string, string>(async (request, context) =>
+            helper.UnaryHandler = new UnaryServerMethod<string, string>((request, context) =>
             {
                 Assert.IsFalse(context.AuthContext.IsPeerAuthenticated);
                 Assert.AreEqual(0, context.AuthContext.Properties.Count());
-                return "PASS";
+                return Task.FromResult("PASS");
             });
             Assert.AreEqual("PASS", Calls.BlockingUnaryCall(helper.CreateUnaryCall(), "abc"));
         }
@@ -445,9 +445,9 @@
         [Test]
         public async Task Channel_WaitForStateChangedAsync()
         {
-            helper.UnaryHandler = new UnaryServerMethod<string, string>(async (request, context) =>
+            helper.UnaryHandler = new UnaryServerMethod<string, string>((request, context) =>
             {
-                return request;
+                return Task.FromResult(request);
             });
 
             Assert.ThrowsAsync(typeof(TaskCanceledException), 
diff --git a/src/csharp/Grpc.Core.Tests/CompressionTest.cs b/src/csharp/Grpc.Core.Tests/CompressionTest.cs
index 0b28433..9254cb9 100644
--- a/src/csharp/Grpc.Core.Tests/CompressionTest.cs
+++ b/src/csharp/Grpc.Core.Tests/CompressionTest.cs
@@ -55,10 +55,10 @@
         [Test]
         public void WriteOptions_Unary()
         {
-            helper.UnaryHandler = new UnaryServerMethod<string, string>(async (request, context) =>
+            helper.UnaryHandler = new UnaryServerMethod<string, string>((request, context) =>
             {
                 context.WriteOptions = new WriteOptions(WriteFlags.NoCompress);
-                return request;
+                return Task.FromResult(request);
             });
 
             var callOptions = new CallOptions(writeOptions: new WriteOptions(WriteFlags.NoCompress));
diff --git a/src/csharp/Grpc.Core.Tests/ContextPropagationTest.cs b/src/csharp/Grpc.Core.Tests/ContextPropagationTest.cs
index 5a55ad1..c8bc372 100644
--- a/src/csharp/Grpc.Core.Tests/ContextPropagationTest.cs
+++ b/src/csharp/Grpc.Core.Tests/ContextPropagationTest.cs
@@ -106,11 +106,11 @@
         public async Task PropagateDeadline()
         {
             var deadline = DateTime.UtcNow.AddDays(7);
-            helper.UnaryHandler = new UnaryServerMethod<string, string>(async (request, context) =>
+            helper.UnaryHandler = new UnaryServerMethod<string, string>((request, context) =>
             {
                 Assert.IsTrue(context.Deadline < deadline.AddMinutes(1));
                 Assert.IsTrue(context.Deadline > deadline.AddMinutes(-1));
-                return "PASS";
+                return Task.FromResult("PASS");
             });
 
             helper.ClientStreamingHandler = new ClientStreamingServerMethod<string, string>(async (requestStream, context) =>
@@ -135,10 +135,10 @@
         [Test]
         public async Task SuppressDeadlinePropagation()
         {
-            helper.UnaryHandler = new UnaryServerMethod<string, string>(async (request, context) =>
+            helper.UnaryHandler = new UnaryServerMethod<string, string>((request, context) =>
             {
                 Assert.AreEqual(DateTime.MaxValue, context.Deadline);
-                return "PASS";
+                return Task.FromResult("PASS");
             });
 
             helper.ClientStreamingHandler = new ClientStreamingServerMethod<string, string>(async (requestStream, context) =>
diff --git a/src/csharp/Grpc.Core.Tests/Grpc.Core.Tests.csproj b/src/csharp/Grpc.Core.Tests/Grpc.Core.Tests.csproj
index 9be77c8..6df68fd 100755
--- a/src/csharp/Grpc.Core.Tests/Grpc.Core.Tests.csproj
+++ b/src/csharp/Grpc.Core.Tests/Grpc.Core.Tests.csproj
@@ -10,6 +10,7 @@
     <PackageId>Grpc.Core.Tests</PackageId>
     <PackageTargetFallback Condition=" '$(TargetFramework)' == 'netcoreapp1.0' ">$(PackageTargetFallback);portable-net45</PackageTargetFallback>
     <RuntimeFrameworkVersion Condition=" '$(TargetFramework)' == 'netcoreapp1.0' ">1.0.4</RuntimeFrameworkVersion>
+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/src/csharp/Grpc.Core.Tests/HalfcloseTest.cs b/src/csharp/Grpc.Core.Tests/HalfcloseTest.cs
index 02554dc..5fc8fb6 100644
--- a/src/csharp/Grpc.Core.Tests/HalfcloseTest.cs
+++ b/src/csharp/Grpc.Core.Tests/HalfcloseTest.cs
@@ -62,9 +62,9 @@
         [Test]
         public async Task HalfcloseAfterFullclose_ClientStreamingCall()
         {
-            helper.ClientStreamingHandler = new ClientStreamingServerMethod<string, string>(async (requestStream, context) =>
+            helper.ClientStreamingHandler = new ClientStreamingServerMethod<string, string>((requestStream, context) =>
             {
-                return "PASS";
+                return Task.FromResult("PASS");
             });
 
             var call = Calls.AsyncClientStreamingCall(helper.CreateClientStreamingCall());
diff --git a/src/csharp/Grpc.Core.Tests/Internal/CompletionQueueEventTest.cs b/src/csharp/Grpc.Core.Tests/Internal/CompletionQueueEventTest.cs
index 6dac2de..2595208 100644
--- a/src/csharp/Grpc.Core.Tests/Internal/CompletionQueueEventTest.cs
+++ b/src/csharp/Grpc.Core.Tests/Internal/CompletionQueueEventTest.cs
@@ -29,9 +29,12 @@
     public class CompletionQueueEventTest
     {
         [Test]
-        public void CreateAndDestroy()
+        public void CompletionQueueEventSizeIsNativeSize()
         {
+            #pragma warning disable 0618
+            // We need to use the obsolete non-generic version of Marshal.SizeOf because the generic version is not available in net45
             Assert.AreEqual(CompletionQueueEvent.NativeSize, Marshal.SizeOf(typeof(CompletionQueueEvent)));
+            #pragma warning restore 0618
         }
     }
 }
diff --git a/src/csharp/Grpc.Core.Tests/Internal/TimespecTest.cs b/src/csharp/Grpc.Core.Tests/Internal/TimespecTest.cs
index d368c79..be35f31 100644
--- a/src/csharp/Grpc.Core.Tests/Internal/TimespecTest.cs
+++ b/src/csharp/Grpc.Core.Tests/Internal/TimespecTest.cs
@@ -60,7 +60,10 @@
         [Test]
         public void TimespecSizeIsNativeSize()
         {
+            #pragma warning disable 0618
+            // We need to use the obsolete non-generic version of Marshal.SizeOf because the generic version is not available in net45
             Assert.AreEqual(Timespec.NativeSize, Marshal.SizeOf(typeof(Timespec)));
+            #pragma warning restore 0618
         }
 
         [Test]
diff --git a/src/csharp/Grpc.Core.Tests/MockServiceHelper.cs b/src/csharp/Grpc.Core.Tests/MockServiceHelper.cs
index 925fb20..7f4677d 100644
--- a/src/csharp/Grpc.Core.Tests/MockServiceHelper.cs
+++ b/src/csharp/Grpc.Core.Tests/MockServiceHelper.cs
@@ -96,26 +96,28 @@
 
             var defaultStatus = new Status(StatusCode.Unknown, "Default mock implementation. Please provide your own.");
 
-            unaryHandler = new UnaryServerMethod<string, string>(async (request, context) =>
+            unaryHandler = new UnaryServerMethod<string, string>((request, context) =>
             {
                 context.Status = defaultStatus;
-                return "";
+                return Task.FromResult("");
             });
 
-            clientStreamingHandler = new ClientStreamingServerMethod<string, string>(async (requestStream, context) =>
+            clientStreamingHandler = new ClientStreamingServerMethod<string, string>((requestStream, context) =>
             {
                 context.Status = defaultStatus;
-                return "";
+                return Task.FromResult("");
             });
 
-            serverStreamingHandler = new ServerStreamingServerMethod<string, string>(async (request, responseStream, context) =>
+            serverStreamingHandler = new ServerStreamingServerMethod<string, string>((request, responseStream, context) =>
             {
                 context.Status = defaultStatus;
+                return TaskUtils.CompletedTask;
             });
 
-            duplexStreamingHandler = new DuplexStreamingServerMethod<string, string>(async (requestStream, responseStream, context) =>
+            duplexStreamingHandler = new DuplexStreamingServerMethod<string, string>((requestStream, responseStream, context) =>
             {
                 context.Status = defaultStatus;
+                return TaskUtils.CompletedTask;
             });
         }
 
diff --git a/src/csharp/Grpc.Core.Tests/PerformanceTest.cs b/src/csharp/Grpc.Core.Tests/PerformanceTest.cs
index 2420b47..4b1d745 100644
--- a/src/csharp/Grpc.Core.Tests/PerformanceTest.cs
+++ b/src/csharp/Grpc.Core.Tests/PerformanceTest.cs
@@ -61,9 +61,9 @@
             var profiler = new BasicProfiler();
             Profilers.SetForCurrentThread(profiler);
 
-            helper.UnaryHandler = new UnaryServerMethod<string, string>(async (request, context) =>
+            helper.UnaryHandler = new UnaryServerMethod<string, string>((request, context) =>
             {
-                return request;
+                return Task.FromResult(request);
             });
 
             var callDetails = helper.CreateUnaryCall();
diff --git a/src/csharp/Grpc.Core.Tests/ResponseHeadersTest.cs b/src/csharp/Grpc.Core.Tests/ResponseHeadersTest.cs
index 67dbcf8..e318ee4 100644
--- a/src/csharp/Grpc.Core.Tests/ResponseHeadersTest.cs
+++ b/src/csharp/Grpc.Core.Tests/ResponseHeadersTest.cs
@@ -138,10 +138,10 @@
         [Test]
         public void WriteResponseHeaders_NullNotAllowed()
         {
-            helper.UnaryHandler = new UnaryServerMethod<string, string>(async (request, context) =>
+            helper.UnaryHandler = new UnaryServerMethod<string, string>((request, context) =>
             {
                 Assert.ThrowsAsync(typeof(ArgumentNullException), async () => await context.WriteResponseHeadersAsync(null));
-                return "PASS";
+                return Task.FromResult("PASS");
             });
 
             Assert.AreEqual("PASS", Calls.BlockingUnaryCall(helper.CreateUnaryCall(), ""));
@@ -158,7 +158,7 @@
                     await context.WriteResponseHeadersAsync(headers);
                     Assert.Fail();
                 }
-                catch (InvalidOperationException expected)
+                catch (InvalidOperationException)
                 {
                 }
                 return "PASS";
@@ -178,7 +178,7 @@
                     await context.WriteResponseHeadersAsync(headers);
                     Assert.Fail();
                 }
-                catch (InvalidOperationException expected)
+                catch (InvalidOperationException)
                 {
                 }
                 await responseStream.WriteAsync("B");
diff --git a/src/csharp/Grpc.Core.Tests/ThreadingModelTest.cs b/src/csharp/Grpc.Core.Tests/ThreadingModelTest.cs
index fb18198..9a828f3 100644
--- a/src/csharp/Grpc.Core.Tests/ThreadingModelTest.cs
+++ b/src/csharp/Grpc.Core.Tests/ThreadingModelTest.cs
@@ -50,13 +50,14 @@
         [Test]
         public void BlockingCallInServerHandlerDoesNotDeadlock()
         {
-            helper.UnaryHandler = new UnaryServerMethod<string, string>(async (request, context) =>
+            helper.UnaryHandler = new UnaryServerMethod<string, string>((request, context) =>
             {
                 int recursionDepth = int.Parse(request);
                 if (recursionDepth <= 0) {
-                    return "SUCCESS";
+                    return Task.FromResult("SUCCESS");
                 }
-                return Calls.BlockingUnaryCall(helper.CreateUnaryCall(), (recursionDepth - 1).ToString());
+                var response = Calls.BlockingUnaryCall(helper.CreateUnaryCall(), (recursionDepth - 1).ToString());
+                return Task.FromResult(response);
             });
 
             int maxRecursionDepth = Environment.ProcessorCount * 2;  // make sure we have more pending blocking calls than threads in GrpcThreadPool
@@ -66,12 +67,12 @@
         [Test]
         public void HandlerDoesNotRunOnGrpcThread()
         {
-            helper.UnaryHandler = new UnaryServerMethod<string, string>(async (request, context) =>
+            helper.UnaryHandler = new UnaryServerMethod<string, string>((request, context) =>
             {
                 if (IsRunningOnGrpcThreadPool()) {
-                    return "Server handler should not run on gRPC threadpool thread.";
+                    return Task.FromResult("Server handler should not run on gRPC threadpool thread.");
                 }
-                return request;
+                return Task.FromResult(request);
             });
 
             Assert.AreEqual("ABC", Calls.BlockingUnaryCall(helper.CreateUnaryCall(), "ABC"));
@@ -80,9 +81,9 @@
         [Test]
         public async Task ContinuationDoesNotRunOnGrpcThread()
         {
-            helper.UnaryHandler = new UnaryServerMethod<string, string>(async (request, context) =>
+            helper.UnaryHandler = new UnaryServerMethod<string, string>((request, context) =>
             {
-                return request;
+                return Task.FromResult(request);
             });
 
             await Calls.AsyncUnaryCall(helper.CreateUnaryCall(), "ABC");
diff --git a/src/csharp/Grpc.Core.Tests/TimeoutsTest.cs b/src/csharp/Grpc.Core.Tests/TimeoutsTest.cs
index 8f0d6b8..b89c1af 100644
--- a/src/csharp/Grpc.Core.Tests/TimeoutsTest.cs
+++ b/src/csharp/Grpc.Core.Tests/TimeoutsTest.cs
@@ -57,10 +57,10 @@
         [Test]
         public void InfiniteDeadline()
         {
-            helper.UnaryHandler = new UnaryServerMethod<string, string>(async (request, context) =>
+            helper.UnaryHandler = new UnaryServerMethod<string, string>((request, context) =>
             {
                 Assert.AreEqual(DateTime.MaxValue, context.Deadline);
-                return "PASS";
+                return Task.FromResult("PASS");
             });
 
             // no deadline specified, check server sees infinite deadline
@@ -75,13 +75,13 @@
         {
             var clientDeadline = DateTime.UtcNow + TimeSpan.FromDays(7);
 
-            helper.UnaryHandler = new UnaryServerMethod<string, string>(async (request, context) =>
+            helper.UnaryHandler = new UnaryServerMethod<string, string>((request, context) =>
             {
                 // A fairly relaxed check that the deadline set by client and deadline seen by server
                 // are in agreement. C core takes care of the work with transferring deadline over the wire,
                 // so we don't need an exact check here.
                 Assert.IsTrue(Math.Abs((clientDeadline - context.Deadline).TotalMilliseconds) < 5000);
-                return "PASS";
+                return Task.FromResult("PASS");
             });
             Calls.BlockingUnaryCall(helper.CreateUnaryCall(new CallOptions(deadline: clientDeadline)), "abc");
         }
diff --git a/src/csharp/Grpc.Core/Grpc.Core.csproj b/src/csharp/Grpc.Core/Grpc.Core.csproj
index e32711c..dde800a 100755
--- a/src/csharp/Grpc.Core/Grpc.Core.csproj
+++ b/src/csharp/Grpc.Core/Grpc.Core.csproj
@@ -18,6 +18,7 @@
     <IncludeSymbols>true</IncludeSymbols>
     <IncludeSource>true</IncludeSource>
     <GenerateDocumentationFile>true</GenerateDocumentationFile>
+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/src/csharp/Grpc.Core/Internal/AtomicCounter.cs b/src/csharp/Grpc.Core/Internal/AtomicCounter.cs
index 64e16e4..20e25f9 100644
--- a/src/csharp/Grpc.Core/Internal/AtomicCounter.cs
+++ b/src/csharp/Grpc.Core/Internal/AtomicCounter.cs
@@ -64,7 +64,7 @@
         {
             get
             {
-                return counter;
+                return Interlocked.Read(ref counter);
             }
         }
     }
diff --git a/src/csharp/Grpc.Core/Internal/AuthContextSafeHandle.cs b/src/csharp/Grpc.Core/Internal/AuthContextSafeHandle.cs
index 6c22bd5..e8e61eb 100644
--- a/src/csharp/Grpc.Core/Internal/AuthContextSafeHandle.cs
+++ b/src/csharp/Grpc.Core/Internal/AuthContextSafeHandle.cs
@@ -74,7 +74,10 @@
 
         private AuthProperty PtrToAuthProperty(IntPtr authPropertyPtr)
         {
+            #pragma warning disable 0618
+            // We need to use the obsolete non-generic version of Marshal.PtrToStructure, because the generic version is not available in net45
             var nativeAuthProperty = (NativeAuthProperty) Marshal.PtrToStructure(authPropertyPtr, typeof(NativeAuthProperty));
+            #pragma warning restore 0618
             var name = Marshal.PtrToStringAnsi(nativeAuthProperty.Name);
             var valueBytes = new byte[(int) nativeAuthProperty.ValueLength];
             Marshal.Copy(nativeAuthProperty.Value, valueBytes, 0, (int)nativeAuthProperty.ValueLength);
diff --git a/src/csharp/Grpc.Core/Internal/GrpcThreadPool.cs b/src/csharp/Grpc.Core/Internal/GrpcThreadPool.cs
index 19b44c2..3c94b60 100644
--- a/src/csharp/Grpc.Core/Internal/GrpcThreadPool.cs
+++ b/src/csharp/Grpc.Core/Internal/GrpcThreadPool.cs
@@ -33,8 +33,8 @@
     internal class GrpcThreadPool
     {
         static readonly ILogger Logger = GrpcEnvironment.Logger.ForType<GrpcThreadPool>();
-        static readonly WaitCallback RunCompletionQueueEventCallbackSuccess = new WaitCallback((callback) => RunCompletionQueueEventCallback((OpCompletionDelegate) callback, true));
-        static readonly WaitCallback RunCompletionQueueEventCallbackFailure = new WaitCallback((callback) => RunCompletionQueueEventCallback((OpCompletionDelegate) callback, false));
+        const int FinishContinuationsSleepMillis = 10;
+        const int MaxFinishContinuationsSleepTotalMillis = 10000;
 
         readonly GrpcEnvironment environment;
         readonly object myLock = new object();
@@ -42,6 +42,9 @@
         readonly int poolSize;
         readonly int completionQueueCount;
         readonly bool inlineHandlers;
+        readonly WaitCallback runCompletionQueueEventCallbackSuccess;
+        readonly WaitCallback runCompletionQueueEventCallbackFailure;
+        readonly AtomicCounter queuedContinuationCounter = new AtomicCounter();
 
         readonly List<BasicProfiler> threadProfilers = new List<BasicProfiler>();  // profilers assigned to threadpool threads
 
@@ -64,6 +67,9 @@
             this.inlineHandlers = inlineHandlers;
             GrpcPreconditions.CheckArgument(poolSize >= completionQueueCount,
                 "Thread pool size cannot be smaller than the number of completion queues used.");
+
+            this.runCompletionQueueEventCallbackSuccess = new WaitCallback((callback) => RunCompletionQueueEventCallback((OpCompletionDelegate) callback, true));
+            this.runCompletionQueueEventCallbackFailure = new WaitCallback((callback) => RunCompletionQueueEventCallback((OpCompletionDelegate) callback, false));
         }
 
         public void Start()
@@ -173,7 +179,8 @@
                         // Use cached delegates to avoid unnecessary allocations
                         if (!inlineHandlers)
                         {
-                            ThreadPool.QueueUserWorkItem(success ? RunCompletionQueueEventCallbackSuccess : RunCompletionQueueEventCallbackFailure, callback);
+                            queuedContinuationCounter.Increment();
+                            ThreadPool.QueueUserWorkItem(success ? runCompletionQueueEventCallbackSuccess : runCompletionQueueEventCallbackFailure, callback);
                         }
                         else
                         {
@@ -187,6 +194,24 @@
                 }
             }
             while (ev.type != CompletionQueueEvent.CompletionType.Shutdown);
+
+            // Continuations are running on default threadpool that consists of background threads.
+            // GrpcThreadPool thread (a foreground thread) will not exit unless all queued work had
+            // been finished to prevent terminating the continuations queued prematurely.
+            int sleepIterations = 0;
+            while (queuedContinuationCounter.Count != 0)
+            {
+                // Only happens on shutdown and having pending continuations shouldn't very common,
+                // so sleeping here for a little bit is fine.
+                if (sleepIterations >= MaxFinishContinuationsSleepTotalMillis / FinishContinuationsSleepMillis)
+                {
+                    Logger.Warning("Shutting down gRPC thread [{0}] with unfinished callbacks (Timed out waiting for callbacks to finish).",
+                        Thread.CurrentThread.Name);
+                    break;
+                }
+                Thread.Sleep(FinishContinuationsSleepMillis);
+                sleepIterations ++;
+            }
         }
 
         private static IReadOnlyCollection<CompletionQueueSafeHandle> CreateCompletionQueueList(GrpcEnvironment environment, int completionQueueCount)
@@ -200,7 +225,7 @@
             return list.AsReadOnly();
         }
 
-        private static void RunCompletionQueueEventCallback(OpCompletionDelegate callback, bool success)
+        private void RunCompletionQueueEventCallback(OpCompletionDelegate callback, bool success)
         {
             try
             {
@@ -210,6 +235,10 @@
             {
                 Logger.Error(e, "Exception occured while invoking completion delegate");
             }
+            finally
+            {
+                queuedContinuationCounter.Decrement();
+            }
         }
     }
 }
diff --git a/src/csharp/Grpc.Core/Version.csproj.include b/src/csharp/Grpc.Core/Version.csproj.include
index 8115645..124ecab 100755
--- a/src/csharp/Grpc.Core/Version.csproj.include
+++ b/src/csharp/Grpc.Core/Version.csproj.include
@@ -1,7 +1,7 @@
 <!-- This file is generated -->
 <Project>
   <PropertyGroup>
-    <GrpcCsharpVersion>1.5.0-dev</GrpcCsharpVersion>
+    <GrpcCsharpVersion>1.7.0-dev</GrpcCsharpVersion>
     <GoogleProtobufVersion>3.3.0</GoogleProtobufVersion>
   </PropertyGroup>
 </Project>
diff --git a/src/csharp/Grpc.Core/VersionInfo.cs b/src/csharp/Grpc.Core/VersionInfo.cs
index 92aa0e5..588cc84 100644
--- a/src/csharp/Grpc.Core/VersionInfo.cs
+++ b/src/csharp/Grpc.Core/VersionInfo.cs
@@ -33,11 +33,11 @@
         /// <summary>
         /// Current <c>AssemblyFileVersion</c> of gRPC C# assemblies
         /// </summary>
-        public const string CurrentAssemblyFileVersion = "1.5.0.0";
+        public const string CurrentAssemblyFileVersion = "1.7.0.0";
 
         /// <summary>
         /// Current version of gRPC C#
         /// </summary>
-        public const string CurrentVersion = "1.5.0-dev";
+        public const string CurrentVersion = "1.7.0-dev";
     }
 }
diff --git a/src/csharp/Grpc.Examples.MathClient/Grpc.Examples.MathClient.csproj b/src/csharp/Grpc.Examples.MathClient/Grpc.Examples.MathClient.csproj
index 08df026..74deed6 100755
--- a/src/csharp/Grpc.Examples.MathClient/Grpc.Examples.MathClient.csproj
+++ b/src/csharp/Grpc.Examples.MathClient/Grpc.Examples.MathClient.csproj
@@ -9,6 +9,7 @@
     <OutputType>Exe</OutputType>
     <PackageId>Grpc.Examples.MathClient</PackageId>
     <RuntimeFrameworkVersion Condition=" '$(TargetFramework)' == 'netcoreapp1.0' ">1.0.4</RuntimeFrameworkVersion>
+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/src/csharp/Grpc.Examples.MathServer/Grpc.Examples.MathServer.csproj b/src/csharp/Grpc.Examples.MathServer/Grpc.Examples.MathServer.csproj
index a029374..1abf261 100755
--- a/src/csharp/Grpc.Examples.MathServer/Grpc.Examples.MathServer.csproj
+++ b/src/csharp/Grpc.Examples.MathServer/Grpc.Examples.MathServer.csproj
@@ -9,6 +9,7 @@
     <OutputType>Exe</OutputType>
     <PackageId>Grpc.Examples.MathServer</PackageId>
     <RuntimeFrameworkVersion Condition=" '$(TargetFramework)' == 'netcoreapp1.0' ">1.0.4</RuntimeFrameworkVersion>
+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/src/csharp/Grpc.Examples.Tests/Grpc.Examples.Tests.csproj b/src/csharp/Grpc.Examples.Tests/Grpc.Examples.Tests.csproj
index 9a8e62c..d2a13ed 100755
--- a/src/csharp/Grpc.Examples.Tests/Grpc.Examples.Tests.csproj
+++ b/src/csharp/Grpc.Examples.Tests/Grpc.Examples.Tests.csproj
@@ -10,6 +10,7 @@
     <PackageId>Grpc.Examples.Tests</PackageId>
     <PackageTargetFallback Condition=" '$(TargetFramework)' == 'netcoreapp1.0' ">$(PackageTargetFallback);portable-net45</PackageTargetFallback>
     <RuntimeFrameworkVersion Condition=" '$(TargetFramework)' == 'netcoreapp1.0' ">1.0.4</RuntimeFrameworkVersion>
+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/src/csharp/Grpc.Examples.Tests/MathClientServerTests.cs b/src/csharp/Grpc.Examples.Tests/MathClientServerTests.cs
index 8e6d685..ded80ff 100644
--- a/src/csharp/Grpc.Examples.Tests/MathClientServerTests.cs
+++ b/src/csharp/Grpc.Examples.Tests/MathClientServerTests.cs
@@ -37,7 +37,7 @@
         Channel channel;
         Math.MathClient client;
 
-        [TestFixtureSetUp]
+        [OneTimeSetUp]
         public void Init()
         {
             // Disable SO_REUSEPORT to prevent https://github.com/grpc/grpc/issues/10755
@@ -51,7 +51,7 @@
             client = new Math.MathClient(channel);
         }
 
-        [TestFixtureTearDown]
+        [OneTimeTearDown]
         public void Cleanup()
         {
             channel.ShutdownAsync().Wait();
@@ -130,7 +130,7 @@
         }
 
         [Test]
-        public async Task FibWithDeadline()
+        public void FibWithDeadline()
         {
             using (var call = client.Fib(new FibArgs { Limit = 0 }, 
                 deadline: DateTime.UtcNow.AddMilliseconds(500)))
diff --git a/src/csharp/Grpc.Examples/Grpc.Examples.csproj b/src/csharp/Grpc.Examples/Grpc.Examples.csproj
index 625c172..491d313 100755
--- a/src/csharp/Grpc.Examples/Grpc.Examples.csproj
+++ b/src/csharp/Grpc.Examples/Grpc.Examples.csproj
@@ -8,6 +8,7 @@
     <AssemblyName>Grpc.Examples</AssemblyName>
     <PackageId>Grpc.Examples</PackageId>
     <RuntimeFrameworkVersion Condition=" '$(TargetFramework)' == 'netcoreapp1.0' ">1.0.4</RuntimeFrameworkVersion>
+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/src/csharp/Grpc.Examples/MathGrpc.cs b/src/csharp/Grpc.Examples/MathGrpc.cs
index 317eeb5..4ed4144 100644
--- a/src/csharp/Grpc.Examples/MathGrpc.cs
+++ b/src/csharp/Grpc.Examples/MathGrpc.cs
@@ -15,6 +15,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 //
+#pragma warning disable 1591
 #region Designer generated code
 
 using System;
diff --git a/src/csharp/Grpc.Examples/MathServiceImpl.cs b/src/csharp/Grpc.Examples/MathServiceImpl.cs
index 85b5e2d..0cc1b79 100644
--- a/src/csharp/Grpc.Examples/MathServiceImpl.cs
+++ b/src/csharp/Grpc.Examples/MathServiceImpl.cs
@@ -52,9 +52,10 @@
         public override async Task<Num> Sum(IAsyncStreamReader<Num> requestStream, ServerCallContext context)
         {
             long sum = 0;
-            await requestStream.ForEachAsync(async num =>
+            await requestStream.ForEachAsync(num =>
             {
                 sum += num.Num_;
+                return TaskUtils.CompletedTask;
             });
             return new Num { Num_ = sum };
         }
diff --git a/src/csharp/Grpc.HealthCheck.Tests/Grpc.HealthCheck.Tests.csproj b/src/csharp/Grpc.HealthCheck.Tests/Grpc.HealthCheck.Tests.csproj
index b0e2716..2ccf46b 100755
--- a/src/csharp/Grpc.HealthCheck.Tests/Grpc.HealthCheck.Tests.csproj
+++ b/src/csharp/Grpc.HealthCheck.Tests/Grpc.HealthCheck.Tests.csproj
@@ -10,6 +10,7 @@
     <PackageId>Grpc.HealthCheck.Tests</PackageId>
     <PackageTargetFallback Condition=" '$(TargetFramework)' == 'netcoreapp1.0' ">$(PackageTargetFallback);portable-net45</PackageTargetFallback>
     <RuntimeFrameworkVersion Condition=" '$(TargetFramework)' == 'netcoreapp1.0' ">1.0.4</RuntimeFrameworkVersion>
+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/src/csharp/Grpc.HealthCheck.Tests/HealthClientServerTest.cs b/src/csharp/Grpc.HealthCheck.Tests/HealthClientServerTest.cs
index 7dadba7..45e8ad9 100644
--- a/src/csharp/Grpc.HealthCheck.Tests/HealthClientServerTest.cs
+++ b/src/csharp/Grpc.HealthCheck.Tests/HealthClientServerTest.cs
@@ -37,7 +37,7 @@
         Grpc.Health.V1.Health.HealthClient client;
         Grpc.HealthCheck.HealthServiceImpl serviceImpl;
 
-        [TestFixtureSetUp]
+        [OneTimeSetUp]
         public void Init()
         {
             serviceImpl = new HealthServiceImpl();
@@ -54,7 +54,7 @@
             client = new Grpc.Health.V1.Health.HealthClient(channel);
         }
 
-        [TestFixtureTearDown]
+        [OneTimeTearDown]
         public void Cleanup()
         {
             channel.ShutdownAsync().Wait();
diff --git a/src/csharp/Grpc.HealthCheck/Grpc.HealthCheck.csproj b/src/csharp/Grpc.HealthCheck/Grpc.HealthCheck.csproj
index b54311b..3eb9043 100755
--- a/src/csharp/Grpc.HealthCheck/Grpc.HealthCheck.csproj
+++ b/src/csharp/Grpc.HealthCheck/Grpc.HealthCheck.csproj
@@ -18,6 +18,7 @@
     <IncludeSymbols>true</IncludeSymbols>
     <IncludeSource>true</IncludeSource>
     <GenerateDocumentationFile>true</GenerateDocumentationFile>
+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/src/csharp/Grpc.HealthCheck/HealthGrpc.cs b/src/csharp/Grpc.HealthCheck/HealthGrpc.cs
index 8c747aa..3e8eb34 100644
--- a/src/csharp/Grpc.HealthCheck/HealthGrpc.cs
+++ b/src/csharp/Grpc.HealthCheck/HealthGrpc.cs
@@ -15,6 +15,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 //
+#pragma warning disable 1591
 #region Designer generated code
 
 using System;
diff --git a/src/csharp/Grpc.IntegrationTesting.Client/Grpc.IntegrationTesting.Client.csproj b/src/csharp/Grpc.IntegrationTesting.Client/Grpc.IntegrationTesting.Client.csproj
index dcb24c7..c67beea 100755
--- a/src/csharp/Grpc.IntegrationTesting.Client/Grpc.IntegrationTesting.Client.csproj
+++ b/src/csharp/Grpc.IntegrationTesting.Client/Grpc.IntegrationTesting.Client.csproj
@@ -10,6 +10,7 @@
     <PackageId>Grpc.IntegrationTesting.Client</PackageId>
     <PackageTargetFallback Condition=" '$(TargetFramework)' == 'netcoreapp1.0' ">$(PackageTargetFallback);portable-net45</PackageTargetFallback>
     <RuntimeFrameworkVersion Condition=" '$(TargetFramework)' == 'netcoreapp1.0' ">1.0.4</RuntimeFrameworkVersion>
+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/src/csharp/Grpc.IntegrationTesting.QpsWorker/Grpc.IntegrationTesting.QpsWorker.csproj b/src/csharp/Grpc.IntegrationTesting.QpsWorker/Grpc.IntegrationTesting.QpsWorker.csproj
index 4377202..e452257 100755
--- a/src/csharp/Grpc.IntegrationTesting.QpsWorker/Grpc.IntegrationTesting.QpsWorker.csproj
+++ b/src/csharp/Grpc.IntegrationTesting.QpsWorker/Grpc.IntegrationTesting.QpsWorker.csproj
@@ -11,6 +11,7 @@
     <ServerGarbageCollection>true</ServerGarbageCollection>
     <PackageTargetFallback Condition=" '$(TargetFramework)' == 'netcoreapp1.0' ">$(PackageTargetFallback);portable-net45</PackageTargetFallback>
     <RuntimeFrameworkVersion Condition=" '$(TargetFramework)' == 'netcoreapp1.0' ">1.0.4</RuntimeFrameworkVersion>
+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/src/csharp/Grpc.IntegrationTesting.Server/Grpc.IntegrationTesting.Server.csproj b/src/csharp/Grpc.IntegrationTesting.Server/Grpc.IntegrationTesting.Server.csproj
index db736ba..a1fb316 100755
--- a/src/csharp/Grpc.IntegrationTesting.Server/Grpc.IntegrationTesting.Server.csproj
+++ b/src/csharp/Grpc.IntegrationTesting.Server/Grpc.IntegrationTesting.Server.csproj
@@ -10,6 +10,7 @@
     <PackageId>Grpc.IntegrationTesting.Server</PackageId>
     <PackageTargetFallback Condition=" '$(TargetFramework)' == 'netcoreapp1.0' ">$(PackageTargetFallback);portable-net45</PackageTargetFallback>
     <RuntimeFrameworkVersion Condition=" '$(TargetFramework)' == 'netcoreapp1.0' ">1.0.4</RuntimeFrameworkVersion>
+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/src/csharp/Grpc.IntegrationTesting.StressClient/Grpc.IntegrationTesting.StressClient.csproj b/src/csharp/Grpc.IntegrationTesting.StressClient/Grpc.IntegrationTesting.StressClient.csproj
index fe4e0da..f64bea3 100755
--- a/src/csharp/Grpc.IntegrationTesting.StressClient/Grpc.IntegrationTesting.StressClient.csproj
+++ b/src/csharp/Grpc.IntegrationTesting.StressClient/Grpc.IntegrationTesting.StressClient.csproj
@@ -10,6 +10,7 @@
     <PackageId>Grpc.IntegrationTesting.StressClient</PackageId>
     <PackageTargetFallback Condition=" '$(TargetFramework)' == 'netcoreapp1.0' ">$(PackageTargetFallback);portable-net45</PackageTargetFallback>
     <RuntimeFrameworkVersion Condition=" '$(TargetFramework)' == 'netcoreapp1.0' ">1.0.4</RuntimeFrameworkVersion>
+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/src/csharp/Grpc.IntegrationTesting/Control.cs b/src/csharp/Grpc.IntegrationTesting/Control.cs
index d62b5a1..b15da8b 100644
--- a/src/csharp/Grpc.IntegrationTesting/Control.cs
+++ b/src/csharp/Grpc.IntegrationTesting/Control.cs
@@ -28,86 +28,89 @@
             "c29uUGFyYW1zEhQKDG9mZmVyZWRfbG9hZBgBIAEoASISChBDbG9zZWRMb29w",
             "UGFyYW1zInsKCkxvYWRQYXJhbXMSNQoLY2xvc2VkX2xvb3AYASABKAsyHi5n",
             "cnBjLnRlc3RpbmcuQ2xvc2VkTG9vcFBhcmFtc0gAEi4KB3BvaXNzb24YAiAB",
-            "KAsyGy5ncnBjLnRlc3RpbmcuUG9pc3NvblBhcmFtc0gAQgYKBGxvYWQiQwoO",
+            "KAsyGy5ncnBjLnRlc3RpbmcuUG9pc3NvblBhcmFtc0gAQgYKBGxvYWQiVgoO",
             "U2VjdXJpdHlQYXJhbXMSEwoLdXNlX3Rlc3RfY2EYASABKAgSHAoUc2VydmVy",
-            "X2hvc3Rfb3ZlcnJpZGUYAiABKAkiTQoKQ2hhbm5lbEFyZxIMCgRuYW1lGAEg",
-            "ASgJEhMKCXN0cl92YWx1ZRgCIAEoCUgAEhMKCWludF92YWx1ZRgDIAEoBUgA",
-            "QgcKBXZhbHVlItUECgxDbGllbnRDb25maWcSFgoOc2VydmVyX3RhcmdldHMY",
-            "ASADKAkSLQoLY2xpZW50X3R5cGUYAiABKA4yGC5ncnBjLnRlc3RpbmcuQ2xp",
-            "ZW50VHlwZRI1Cg9zZWN1cml0eV9wYXJhbXMYAyABKAsyHC5ncnBjLnRlc3Rp",
-            "bmcuU2VjdXJpdHlQYXJhbXMSJAocb3V0c3RhbmRpbmdfcnBjc19wZXJfY2hh",
-            "bm5lbBgEIAEoBRIXCg9jbGllbnRfY2hhbm5lbHMYBSABKAUSHAoUYXN5bmNf",
-            "Y2xpZW50X3RocmVhZHMYByABKAUSJwoIcnBjX3R5cGUYCCABKA4yFS5ncnBj",
-            "LnRlc3RpbmcuUnBjVHlwZRItCgtsb2FkX3BhcmFtcxgKIAEoCzIYLmdycGMu",
-            "dGVzdGluZy5Mb2FkUGFyYW1zEjMKDnBheWxvYWRfY29uZmlnGAsgASgLMhsu",
-            "Z3JwYy50ZXN0aW5nLlBheWxvYWRDb25maWcSNwoQaGlzdG9ncmFtX3BhcmFt",
-            "cxgMIAEoCzIdLmdycGMudGVzdGluZy5IaXN0b2dyYW1QYXJhbXMSEQoJY29y",
-            "ZV9saXN0GA0gAygFEhIKCmNvcmVfbGltaXQYDiABKAUSGAoQb3RoZXJfY2xp",
-            "ZW50X2FwaRgPIAEoCRIuCgxjaGFubmVsX2FyZ3MYECADKAsyGC5ncnBjLnRl",
-            "c3RpbmcuQ2hhbm5lbEFyZxIWCg50aHJlYWRzX3Blcl9jcRgRIAEoBRIbChNt",
-            "ZXNzYWdlc19wZXJfc3RyZWFtGBIgASgFIjgKDENsaWVudFN0YXR1cxIoCgVz",
-            "dGF0cxgBIAEoCzIZLmdycGMudGVzdGluZy5DbGllbnRTdGF0cyIVCgRNYXJr",
-            "Eg0KBXJlc2V0GAEgASgIImgKCkNsaWVudEFyZ3MSKwoFc2V0dXAYASABKAsy",
-            "Gi5ncnBjLnRlc3RpbmcuQ2xpZW50Q29uZmlnSAASIgoEbWFyaxgCIAEoCzIS",
-            "LmdycGMudGVzdGluZy5NYXJrSABCCQoHYXJndHlwZSLMAgoMU2VydmVyQ29u",
-            "ZmlnEi0KC3NlcnZlcl90eXBlGAEgASgOMhguZ3JwYy50ZXN0aW5nLlNlcnZl",
-            "clR5cGUSNQoPc2VjdXJpdHlfcGFyYW1zGAIgASgLMhwuZ3JwYy50ZXN0aW5n",
-            "LlNlY3VyaXR5UGFyYW1zEgwKBHBvcnQYBCABKAUSHAoUYXN5bmNfc2VydmVy",
-            "X3RocmVhZHMYByABKAUSEgoKY29yZV9saW1pdBgIIAEoBRIzCg5wYXlsb2Fk",
-            "X2NvbmZpZxgJIAEoCzIbLmdycGMudGVzdGluZy5QYXlsb2FkQ29uZmlnEhEK",
-            "CWNvcmVfbGlzdBgKIAMoBRIYChBvdGhlcl9zZXJ2ZXJfYXBpGAsgASgJEhYK",
-            "DnRocmVhZHNfcGVyX2NxGAwgASgFEhwKE3Jlc291cmNlX3F1b3RhX3NpemUY",
-            "6QcgASgFImgKClNlcnZlckFyZ3MSKwoFc2V0dXAYASABKAsyGi5ncnBjLnRl",
-            "c3RpbmcuU2VydmVyQ29uZmlnSAASIgoEbWFyaxgCIAEoCzISLmdycGMudGVz",
-            "dGluZy5NYXJrSABCCQoHYXJndHlwZSJVCgxTZXJ2ZXJTdGF0dXMSKAoFc3Rh",
-            "dHMYASABKAsyGS5ncnBjLnRlc3RpbmcuU2VydmVyU3RhdHMSDAoEcG9ydBgC",
-            "IAEoBRINCgVjb3JlcxgDIAEoBSINCgtDb3JlUmVxdWVzdCIdCgxDb3JlUmVz",
-            "cG9uc2USDQoFY29yZXMYASABKAUiBgoEVm9pZCL9AQoIU2NlbmFyaW8SDAoE",
-            "bmFtZRgBIAEoCRIxCg1jbGllbnRfY29uZmlnGAIgASgLMhouZ3JwYy50ZXN0",
-            "aW5nLkNsaWVudENvbmZpZxITCgtudW1fY2xpZW50cxgDIAEoBRIxCg1zZXJ2",
-            "ZXJfY29uZmlnGAQgASgLMhouZ3JwYy50ZXN0aW5nLlNlcnZlckNvbmZpZxIT",
-            "CgtudW1fc2VydmVycxgFIAEoBRIWCg53YXJtdXBfc2Vjb25kcxgGIAEoBRIZ",
-            "ChFiZW5jaG1hcmtfc2Vjb25kcxgHIAEoBRIgChhzcGF3bl9sb2NhbF93b3Jr",
-            "ZXJfY291bnQYCCABKAUiNgoJU2NlbmFyaW9zEikKCXNjZW5hcmlvcxgBIAMo",
-            "CzIWLmdycGMudGVzdGluZy5TY2VuYXJpbyK8AwoVU2NlbmFyaW9SZXN1bHRT",
-            "dW1tYXJ5EgsKA3FwcxgBIAEoARIbChNxcHNfcGVyX3NlcnZlcl9jb3JlGAIg",
-            "ASgBEhoKEnNlcnZlcl9zeXN0ZW1fdGltZRgDIAEoARIYChBzZXJ2ZXJfdXNl",
-            "cl90aW1lGAQgASgBEhoKEmNsaWVudF9zeXN0ZW1fdGltZRgFIAEoARIYChBj",
-            "bGllbnRfdXNlcl90aW1lGAYgASgBEhIKCmxhdGVuY3lfNTAYByABKAESEgoK",
-            "bGF0ZW5jeV85MBgIIAEoARISCgpsYXRlbmN5Xzk1GAkgASgBEhIKCmxhdGVu",
-            "Y3lfOTkYCiABKAESEwoLbGF0ZW5jeV85OTkYCyABKAESGAoQc2VydmVyX2Nw",
-            "dV91c2FnZRgMIAEoARImCh5zdWNjZXNzZnVsX3JlcXVlc3RzX3Blcl9zZWNv",
-            "bmQYDSABKAESIgoaZmFpbGVkX3JlcXVlc3RzX3Blcl9zZWNvbmQYDiABKAES",
-            "IAoYY2xpZW50X3BvbGxzX3Blcl9yZXF1ZXN0GA8gASgBEiAKGHNlcnZlcl9w",
-            "b2xsc19wZXJfcmVxdWVzdBgQIAEoASKDAwoOU2NlbmFyaW9SZXN1bHQSKAoI",
-            "c2NlbmFyaW8YASABKAsyFi5ncnBjLnRlc3RpbmcuU2NlbmFyaW8SLgoJbGF0",
-            "ZW5jaWVzGAIgASgLMhsuZ3JwYy50ZXN0aW5nLkhpc3RvZ3JhbURhdGESLwoM",
-            "Y2xpZW50X3N0YXRzGAMgAygLMhkuZ3JwYy50ZXN0aW5nLkNsaWVudFN0YXRz",
-            "Ei8KDHNlcnZlcl9zdGF0cxgEIAMoCzIZLmdycGMudGVzdGluZy5TZXJ2ZXJT",
-            "dGF0cxIUCgxzZXJ2ZXJfY29yZXMYBSADKAUSNAoHc3VtbWFyeRgGIAEoCzIj",
-            "LmdycGMudGVzdGluZy5TY2VuYXJpb1Jlc3VsdFN1bW1hcnkSFgoOY2xpZW50",
-            "X3N1Y2Nlc3MYByADKAgSFgoOc2VydmVyX3N1Y2Nlc3MYCCADKAgSOQoPcmVx",
-            "dWVzdF9yZXN1bHRzGAkgAygLMiAuZ3JwYy50ZXN0aW5nLlJlcXVlc3RSZXN1",
-            "bHRDb3VudCpBCgpDbGllbnRUeXBlEg8KC1NZTkNfQ0xJRU5UEAASEAoMQVNZ",
-            "TkNfQ0xJRU5UEAESEAoMT1RIRVJfQ0xJRU5UEAIqWwoKU2VydmVyVHlwZRIP",
-            "CgtTWU5DX1NFUlZFUhAAEhAKDEFTWU5DX1NFUlZFUhABEhgKFEFTWU5DX0dF",
-            "TkVSSUNfU0VSVkVSEAISEAoMT1RIRVJfU0VSVkVSEAMqcgoHUnBjVHlwZRIJ",
-            "CgVVTkFSWRAAEg0KCVNUUkVBTUlORxABEhkKFVNUUkVBTUlOR19GUk9NX0NM",
-            "SUVOVBACEhkKFVNUUkVBTUlOR19GUk9NX1NFUlZFUhADEhcKE1NUUkVBTUlO",
-            "R19CT1RIX1dBWVMQBGIGcHJvdG8z"));
+            "X2hvc3Rfb3ZlcnJpZGUYAiABKAkSEQoJY3JlZF90eXBlGAMgASgJIk0KCkNo",
+            "YW5uZWxBcmcSDAoEbmFtZRgBIAEoCRITCglzdHJfdmFsdWUYAiABKAlIABIT",
+            "CglpbnRfdmFsdWUYAyABKAVIAEIHCgV2YWx1ZSLVBAoMQ2xpZW50Q29uZmln",
+            "EhYKDnNlcnZlcl90YXJnZXRzGAEgAygJEi0KC2NsaWVudF90eXBlGAIgASgO",
+            "MhguZ3JwYy50ZXN0aW5nLkNsaWVudFR5cGUSNQoPc2VjdXJpdHlfcGFyYW1z",
+            "GAMgASgLMhwuZ3JwYy50ZXN0aW5nLlNlY3VyaXR5UGFyYW1zEiQKHG91dHN0",
+            "YW5kaW5nX3JwY3NfcGVyX2NoYW5uZWwYBCABKAUSFwoPY2xpZW50X2NoYW5u",
+            "ZWxzGAUgASgFEhwKFGFzeW5jX2NsaWVudF90aHJlYWRzGAcgASgFEicKCHJw",
+            "Y190eXBlGAggASgOMhUuZ3JwYy50ZXN0aW5nLlJwY1R5cGUSLQoLbG9hZF9w",
+            "YXJhbXMYCiABKAsyGC5ncnBjLnRlc3RpbmcuTG9hZFBhcmFtcxIzCg5wYXls",
+            "b2FkX2NvbmZpZxgLIAEoCzIbLmdycGMudGVzdGluZy5QYXlsb2FkQ29uZmln",
+            "EjcKEGhpc3RvZ3JhbV9wYXJhbXMYDCABKAsyHS5ncnBjLnRlc3RpbmcuSGlz",
+            "dG9ncmFtUGFyYW1zEhEKCWNvcmVfbGlzdBgNIAMoBRISCgpjb3JlX2xpbWl0",
+            "GA4gASgFEhgKEG90aGVyX2NsaWVudF9hcGkYDyABKAkSLgoMY2hhbm5lbF9h",
+            "cmdzGBAgAygLMhguZ3JwYy50ZXN0aW5nLkNoYW5uZWxBcmcSFgoOdGhyZWFk",
+            "c19wZXJfY3EYESABKAUSGwoTbWVzc2FnZXNfcGVyX3N0cmVhbRgSIAEoBSI4",
+            "CgxDbGllbnRTdGF0dXMSKAoFc3RhdHMYASABKAsyGS5ncnBjLnRlc3Rpbmcu",
+            "Q2xpZW50U3RhdHMiFQoETWFyaxINCgVyZXNldBgBIAEoCCJoCgpDbGllbnRB",
+            "cmdzEisKBXNldHVwGAEgASgLMhouZ3JwYy50ZXN0aW5nLkNsaWVudENvbmZp",
+            "Z0gAEiIKBG1hcmsYAiABKAsyEi5ncnBjLnRlc3RpbmcuTWFya0gAQgkKB2Fy",
+            "Z3R5cGUi/QIKDFNlcnZlckNvbmZpZxItCgtzZXJ2ZXJfdHlwZRgBIAEoDjIY",
+            "LmdycGMudGVzdGluZy5TZXJ2ZXJUeXBlEjUKD3NlY3VyaXR5X3BhcmFtcxgC",
+            "IAEoCzIcLmdycGMudGVzdGluZy5TZWN1cml0eVBhcmFtcxIMCgRwb3J0GAQg",
+            "ASgFEhwKFGFzeW5jX3NlcnZlcl90aHJlYWRzGAcgASgFEhIKCmNvcmVfbGlt",
+            "aXQYCCABKAUSMwoOcGF5bG9hZF9jb25maWcYCSABKAsyGy5ncnBjLnRlc3Rp",
+            "bmcuUGF5bG9hZENvbmZpZxIRCgljb3JlX2xpc3QYCiADKAUSGAoQb3RoZXJf",
+            "c2VydmVyX2FwaRgLIAEoCRIWCg50aHJlYWRzX3Blcl9jcRgMIAEoBRIcChNy",
+            "ZXNvdXJjZV9xdW90YV9zaXplGOkHIAEoBRIvCgxjaGFubmVsX2FyZ3MY6gcg",
+            "AygLMhguZ3JwYy50ZXN0aW5nLkNoYW5uZWxBcmciaAoKU2VydmVyQXJncxIr",
+            "CgVzZXR1cBgBIAEoCzIaLmdycGMudGVzdGluZy5TZXJ2ZXJDb25maWdIABIi",
+            "CgRtYXJrGAIgASgLMhIuZ3JwYy50ZXN0aW5nLk1hcmtIAEIJCgdhcmd0eXBl",
+            "IlUKDFNlcnZlclN0YXR1cxIoCgVzdGF0cxgBIAEoCzIZLmdycGMudGVzdGlu",
+            "Zy5TZXJ2ZXJTdGF0cxIMCgRwb3J0GAIgASgFEg0KBWNvcmVzGAMgASgFIg0K",
+            "C0NvcmVSZXF1ZXN0Ih0KDENvcmVSZXNwb25zZRINCgVjb3JlcxgBIAEoBSIG",
+            "CgRWb2lkIv0BCghTY2VuYXJpbxIMCgRuYW1lGAEgASgJEjEKDWNsaWVudF9j",
+            "b25maWcYAiABKAsyGi5ncnBjLnRlc3RpbmcuQ2xpZW50Q29uZmlnEhMKC251",
+            "bV9jbGllbnRzGAMgASgFEjEKDXNlcnZlcl9jb25maWcYBCABKAsyGi5ncnBj",
+            "LnRlc3RpbmcuU2VydmVyQ29uZmlnEhMKC251bV9zZXJ2ZXJzGAUgASgFEhYK",
+            "Dndhcm11cF9zZWNvbmRzGAYgASgFEhkKEWJlbmNobWFya19zZWNvbmRzGAcg",
+            "ASgFEiAKGHNwYXduX2xvY2FsX3dvcmtlcl9jb3VudBgIIAEoBSI2CglTY2Vu",
+            "YXJpb3MSKQoJc2NlbmFyaW9zGAEgAygLMhYuZ3JwYy50ZXN0aW5nLlNjZW5h",
+            "cmlvIoQEChVTY2VuYXJpb1Jlc3VsdFN1bW1hcnkSCwoDcXBzGAEgASgBEhsK",
+            "E3Fwc19wZXJfc2VydmVyX2NvcmUYAiABKAESGgoSc2VydmVyX3N5c3RlbV90",
+            "aW1lGAMgASgBEhgKEHNlcnZlcl91c2VyX3RpbWUYBCABKAESGgoSY2xpZW50",
+            "X3N5c3RlbV90aW1lGAUgASgBEhgKEGNsaWVudF91c2VyX3RpbWUYBiABKAES",
+            "EgoKbGF0ZW5jeV81MBgHIAEoARISCgpsYXRlbmN5XzkwGAggASgBEhIKCmxh",
+            "dGVuY3lfOTUYCSABKAESEgoKbGF0ZW5jeV85ORgKIAEoARITCgtsYXRlbmN5",
+            "Xzk5ORgLIAEoARIYChBzZXJ2ZXJfY3B1X3VzYWdlGAwgASgBEiYKHnN1Y2Nl",
+            "c3NmdWxfcmVxdWVzdHNfcGVyX3NlY29uZBgNIAEoARIiChpmYWlsZWRfcmVx",
+            "dWVzdHNfcGVyX3NlY29uZBgOIAEoARIgChhjbGllbnRfcG9sbHNfcGVyX3Jl",
+            "cXVlc3QYDyABKAESIAoYc2VydmVyX3BvbGxzX3Blcl9yZXF1ZXN0GBAgASgB",
+            "EiIKGnNlcnZlcl9xdWVyaWVzX3Blcl9jcHVfc2VjGBEgASgBEiIKGmNsaWVu",
+            "dF9xdWVyaWVzX3Blcl9jcHVfc2VjGBIgASgBIoMDCg5TY2VuYXJpb1Jlc3Vs",
+            "dBIoCghzY2VuYXJpbxgBIAEoCzIWLmdycGMudGVzdGluZy5TY2VuYXJpbxIu",
+            "CglsYXRlbmNpZXMYAiABKAsyGy5ncnBjLnRlc3RpbmcuSGlzdG9ncmFtRGF0",
+            "YRIvCgxjbGllbnRfc3RhdHMYAyADKAsyGS5ncnBjLnRlc3RpbmcuQ2xpZW50",
+            "U3RhdHMSLwoMc2VydmVyX3N0YXRzGAQgAygLMhkuZ3JwYy50ZXN0aW5nLlNl",
+            "cnZlclN0YXRzEhQKDHNlcnZlcl9jb3JlcxgFIAMoBRI0CgdzdW1tYXJ5GAYg",
+            "ASgLMiMuZ3JwYy50ZXN0aW5nLlNjZW5hcmlvUmVzdWx0U3VtbWFyeRIWCg5j",
+            "bGllbnRfc3VjY2VzcxgHIAMoCBIWCg5zZXJ2ZXJfc3VjY2VzcxgIIAMoCBI5",
+            "Cg9yZXF1ZXN0X3Jlc3VsdHMYCSADKAsyIC5ncnBjLnRlc3RpbmcuUmVxdWVz",
+            "dFJlc3VsdENvdW50KkEKCkNsaWVudFR5cGUSDwoLU1lOQ19DTElFTlQQABIQ",
+            "CgxBU1lOQ19DTElFTlQQARIQCgxPVEhFUl9DTElFTlQQAipbCgpTZXJ2ZXJU",
+            "eXBlEg8KC1NZTkNfU0VSVkVSEAASEAoMQVNZTkNfU0VSVkVSEAESGAoUQVNZ",
+            "TkNfR0VORVJJQ19TRVJWRVIQAhIQCgxPVEhFUl9TRVJWRVIQAypyCgdScGNU",
+            "eXBlEgkKBVVOQVJZEAASDQoJU1RSRUFNSU5HEAESGQoVU1RSRUFNSU5HX0ZS",
+            "T01fQ0xJRU5UEAISGQoVU1RSRUFNSU5HX0ZST01fU0VSVkVSEAMSFwoTU1RS",
+            "RUFNSU5HX0JPVEhfV0FZUxAEYgZwcm90bzM="));
       descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
           new pbr::FileDescriptor[] { global::Grpc.Testing.PayloadsReflection.Descriptor, global::Grpc.Testing.StatsReflection.Descriptor, },
           new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Grpc.Testing.ClientType), typeof(global::Grpc.Testing.ServerType), typeof(global::Grpc.Testing.RpcType), }, new pbr::GeneratedClrTypeInfo[] {
             new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.PoissonParams), global::Grpc.Testing.PoissonParams.Parser, new[]{ "OfferedLoad" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ClosedLoopParams), global::Grpc.Testing.ClosedLoopParams.Parser, null, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.LoadParams), global::Grpc.Testing.LoadParams.Parser, new[]{ "ClosedLoop", "Poisson" }, new[]{ "Load" }, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.SecurityParams), global::Grpc.Testing.SecurityParams.Parser, new[]{ "UseTestCa", "ServerHostOverride" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.SecurityParams), global::Grpc.Testing.SecurityParams.Parser, new[]{ "UseTestCa", "ServerHostOverride", "CredType" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ChannelArg), global::Grpc.Testing.ChannelArg.Parser, new[]{ "Name", "StrValue", "IntValue" }, new[]{ "Value" }, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ClientConfig), global::Grpc.Testing.ClientConfig.Parser, new[]{ "ServerTargets", "ClientType", "SecurityParams", "OutstandingRpcsPerChannel", "ClientChannels", "AsyncClientThreads", "RpcType", "LoadParams", "PayloadConfig", "HistogramParams", "CoreList", "CoreLimit", "OtherClientApi", "ChannelArgs", "ThreadsPerCq", "MessagesPerStream" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ClientStatus), global::Grpc.Testing.ClientStatus.Parser, new[]{ "Stats" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.Mark), global::Grpc.Testing.Mark.Parser, new[]{ "Reset" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ClientArgs), global::Grpc.Testing.ClientArgs.Parser, new[]{ "Setup", "Mark" }, new[]{ "Argtype" }, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ServerConfig), global::Grpc.Testing.ServerConfig.Parser, new[]{ "ServerType", "SecurityParams", "Port", "AsyncServerThreads", "CoreLimit", "PayloadConfig", "CoreList", "OtherServerApi", "ThreadsPerCq", "ResourceQuotaSize" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ServerConfig), global::Grpc.Testing.ServerConfig.Parser, new[]{ "ServerType", "SecurityParams", "Port", "AsyncServerThreads", "CoreLimit", "PayloadConfig", "CoreList", "OtherServerApi", "ThreadsPerCq", "ResourceQuotaSize", "ChannelArgs" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ServerArgs), global::Grpc.Testing.ServerArgs.Parser, new[]{ "Setup", "Mark" }, new[]{ "Argtype" }, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ServerStatus), global::Grpc.Testing.ServerStatus.Parser, new[]{ "Stats", "Port", "Cores" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.CoreRequest), global::Grpc.Testing.CoreRequest.Parser, null, null, null, null),
@@ -115,7 +118,7 @@
             new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.Void), global::Grpc.Testing.Void.Parser, null, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.Scenario), global::Grpc.Testing.Scenario.Parser, new[]{ "Name", "ClientConfig", "NumClients", "ServerConfig", "NumServers", "WarmupSeconds", "BenchmarkSeconds", "SpawnLocalWorkerCount" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.Scenarios), global::Grpc.Testing.Scenarios.Parser, new[]{ "Scenarios_" }, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ScenarioResultSummary), global::Grpc.Testing.ScenarioResultSummary.Parser, new[]{ "Qps", "QpsPerServerCore", "ServerSystemTime", "ServerUserTime", "ClientSystemTime", "ClientUserTime", "Latency50", "Latency90", "Latency95", "Latency99", "Latency999", "ServerCpuUsage", "SuccessfulRequestsPerSecond", "FailedRequestsPerSecond", "ClientPollsPerRequest", "ServerPollsPerRequest" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ScenarioResultSummary), global::Grpc.Testing.ScenarioResultSummary.Parser, new[]{ "Qps", "QpsPerServerCore", "ServerSystemTime", "ServerUserTime", "ClientSystemTime", "ClientUserTime", "Latency50", "Latency90", "Latency95", "Latency99", "Latency999", "ServerCpuUsage", "SuccessfulRequestsPerSecond", "FailedRequestsPerSecond", "ClientPollsPerRequest", "ServerPollsPerRequest", "ServerQueriesPerCpuSec", "ClientQueriesPerCpuSec" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ScenarioResult), global::Grpc.Testing.ScenarioResult.Parser, new[]{ "Scenario", "Latencies", "ClientStats", "ServerStats", "ServerCores", "Summary", "ClientSuccess", "ServerSuccess", "RequestResults" }, null, null, null)
           }));
     }
@@ -589,6 +592,7 @@
     public SecurityParams(SecurityParams other) : this() {
       useTestCa_ = other.useTestCa_;
       serverHostOverride_ = other.serverHostOverride_;
+      credType_ = other.credType_;
     }
 
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@@ -618,6 +622,17 @@
       }
     }
 
+    /// <summary>Field number for the "cred_type" field.</summary>
+    public const int CredTypeFieldNumber = 3;
+    private string credType_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public string CredType {
+      get { return credType_; }
+      set {
+        credType_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as SecurityParams);
@@ -633,6 +648,7 @@
       }
       if (UseTestCa != other.UseTestCa) return false;
       if (ServerHostOverride != other.ServerHostOverride) return false;
+      if (CredType != other.CredType) return false;
       return true;
     }
 
@@ -641,6 +657,7 @@
       int hash = 1;
       if (UseTestCa != false) hash ^= UseTestCa.GetHashCode();
       if (ServerHostOverride.Length != 0) hash ^= ServerHostOverride.GetHashCode();
+      if (CredType.Length != 0) hash ^= CredType.GetHashCode();
       return hash;
     }
 
@@ -659,6 +676,10 @@
         output.WriteRawTag(18);
         output.WriteString(ServerHostOverride);
       }
+      if (CredType.Length != 0) {
+        output.WriteRawTag(26);
+        output.WriteString(CredType);
+      }
     }
 
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@@ -670,6 +691,9 @@
       if (ServerHostOverride.Length != 0) {
         size += 1 + pb::CodedOutputStream.ComputeStringSize(ServerHostOverride);
       }
+      if (CredType.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(CredType);
+      }
       return size;
     }
 
@@ -684,6 +708,9 @@
       if (other.ServerHostOverride.Length != 0) {
         ServerHostOverride = other.ServerHostOverride;
       }
+      if (other.CredType.Length != 0) {
+        CredType = other.CredType;
+      }
     }
 
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@@ -702,6 +729,10 @@
             ServerHostOverride = input.ReadString();
             break;
           }
+          case 26: {
+            CredType = input.ReadString();
+            break;
+          }
         }
       }
     }
@@ -1945,6 +1976,7 @@
       otherServerApi_ = other.otherServerApi_;
       threadsPerCq_ = other.threadsPerCq_;
       resourceQuotaSize_ = other.resourceQuotaSize_;
+      channelArgs_ = other.channelArgs_.Clone();
     }
 
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@@ -2088,6 +2120,16 @@
       }
     }
 
+    /// <summary>Field number for the "channel_args" field.</summary>
+    public const int ChannelArgsFieldNumber = 1002;
+    private static readonly pb::FieldCodec<global::Grpc.Testing.ChannelArg> _repeated_channelArgs_codec
+        = pb::FieldCodec.ForMessage(8018, global::Grpc.Testing.ChannelArg.Parser);
+    private readonly pbc::RepeatedField<global::Grpc.Testing.ChannelArg> channelArgs_ = new pbc::RepeatedField<global::Grpc.Testing.ChannelArg>();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public pbc::RepeatedField<global::Grpc.Testing.ChannelArg> ChannelArgs {
+      get { return channelArgs_; }
+    }
+
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as ServerConfig);
@@ -2111,6 +2153,7 @@
       if (OtherServerApi != other.OtherServerApi) return false;
       if (ThreadsPerCq != other.ThreadsPerCq) return false;
       if (ResourceQuotaSize != other.ResourceQuotaSize) return false;
+      if(!channelArgs_.Equals(other.channelArgs_)) return false;
       return true;
     }
 
@@ -2127,6 +2170,7 @@
       if (OtherServerApi.Length != 0) hash ^= OtherServerApi.GetHashCode();
       if (ThreadsPerCq != 0) hash ^= ThreadsPerCq.GetHashCode();
       if (ResourceQuotaSize != 0) hash ^= ResourceQuotaSize.GetHashCode();
+      hash ^= channelArgs_.GetHashCode();
       return hash;
     }
 
@@ -2174,6 +2218,7 @@
         output.WriteRawTag(200, 62);
         output.WriteInt32(ResourceQuotaSize);
       }
+      channelArgs_.WriteTo(output, _repeated_channelArgs_codec);
     }
 
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@@ -2207,6 +2252,7 @@
       if (ResourceQuotaSize != 0) {
         size += 2 + pb::CodedOutputStream.ComputeInt32Size(ResourceQuotaSize);
       }
+      size += channelArgs_.CalculateSize(_repeated_channelArgs_codec);
       return size;
     }
 
@@ -2249,6 +2295,7 @@
       if (other.ResourceQuotaSize != 0) {
         ResourceQuotaSize = other.ResourceQuotaSize;
       }
+      channelArgs_.Add(other.channelArgs_);
     }
 
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@@ -2306,6 +2353,10 @@
             ResourceQuotaSize = input.ReadInt32();
             break;
           }
+          case 8018: {
+            channelArgs_.AddEntriesFrom(input, _repeated_channelArgs_codec);
+            break;
+          }
         }
       }
     }
@@ -3489,6 +3540,8 @@
       failedRequestsPerSecond_ = other.failedRequestsPerSecond_;
       clientPollsPerRequest_ = other.clientPollsPerRequest_;
       serverPollsPerRequest_ = other.serverPollsPerRequest_;
+      serverQueriesPerCpuSec_ = other.serverQueriesPerCpuSec_;
+      clientQueriesPerCpuSec_ = other.clientQueriesPerCpuSec_;
     }
 
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@@ -3702,6 +3755,31 @@
       }
     }
 
+    /// <summary>Field number for the "server_queries_per_cpu_sec" field.</summary>
+    public const int ServerQueriesPerCpuSecFieldNumber = 17;
+    private double serverQueriesPerCpuSec_;
+    /// <summary>
+    /// Queries per CPU-sec over all servers or clients
+    /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double ServerQueriesPerCpuSec {
+      get { return serverQueriesPerCpuSec_; }
+      set {
+        serverQueriesPerCpuSec_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "client_queries_per_cpu_sec" field.</summary>
+    public const int ClientQueriesPerCpuSecFieldNumber = 18;
+    private double clientQueriesPerCpuSec_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public double ClientQueriesPerCpuSec {
+      get { return clientQueriesPerCpuSec_; }
+      set {
+        clientQueriesPerCpuSec_ = value;
+      }
+    }
+
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as ScenarioResultSummary);
@@ -3731,6 +3809,8 @@
       if (FailedRequestsPerSecond != other.FailedRequestsPerSecond) return false;
       if (ClientPollsPerRequest != other.ClientPollsPerRequest) return false;
       if (ServerPollsPerRequest != other.ServerPollsPerRequest) return false;
+      if (ServerQueriesPerCpuSec != other.ServerQueriesPerCpuSec) return false;
+      if (ClientQueriesPerCpuSec != other.ClientQueriesPerCpuSec) return false;
       return true;
     }
 
@@ -3753,6 +3833,8 @@
       if (FailedRequestsPerSecond != 0D) hash ^= FailedRequestsPerSecond.GetHashCode();
       if (ClientPollsPerRequest != 0D) hash ^= ClientPollsPerRequest.GetHashCode();
       if (ServerPollsPerRequest != 0D) hash ^= ServerPollsPerRequest.GetHashCode();
+      if (ServerQueriesPerCpuSec != 0D) hash ^= ServerQueriesPerCpuSec.GetHashCode();
+      if (ClientQueriesPerCpuSec != 0D) hash ^= ClientQueriesPerCpuSec.GetHashCode();
       return hash;
     }
 
@@ -3827,6 +3909,14 @@
         output.WriteRawTag(129, 1);
         output.WriteDouble(ServerPollsPerRequest);
       }
+      if (ServerQueriesPerCpuSec != 0D) {
+        output.WriteRawTag(137, 1);
+        output.WriteDouble(ServerQueriesPerCpuSec);
+      }
+      if (ClientQueriesPerCpuSec != 0D) {
+        output.WriteRawTag(145, 1);
+        output.WriteDouble(ClientQueriesPerCpuSec);
+      }
     }
 
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@@ -3880,6 +3970,12 @@
       if (ServerPollsPerRequest != 0D) {
         size += 2 + 8;
       }
+      if (ServerQueriesPerCpuSec != 0D) {
+        size += 2 + 8;
+      }
+      if (ClientQueriesPerCpuSec != 0D) {
+        size += 2 + 8;
+      }
       return size;
     }
 
@@ -3936,6 +4032,12 @@
       if (other.ServerPollsPerRequest != 0D) {
         ServerPollsPerRequest = other.ServerPollsPerRequest;
       }
+      if (other.ServerQueriesPerCpuSec != 0D) {
+        ServerQueriesPerCpuSec = other.ServerQueriesPerCpuSec;
+      }
+      if (other.ClientQueriesPerCpuSec != 0D) {
+        ClientQueriesPerCpuSec = other.ClientQueriesPerCpuSec;
+      }
     }
 
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@@ -4010,6 +4112,14 @@
             ServerPollsPerRequest = input.ReadDouble();
             break;
           }
+          case 137: {
+            ServerQueriesPerCpuSec = input.ReadDouble();
+            break;
+          }
+          case 145: {
+            ClientQueriesPerCpuSec = input.ReadDouble();
+            break;
+          }
         }
       }
     }
diff --git a/src/csharp/Grpc.IntegrationTesting/CustomErrorDetailsTest.cs b/src/csharp/Grpc.IntegrationTesting/CustomErrorDetailsTest.cs
index 374c6fc..5d22d77 100644
--- a/src/csharp/Grpc.IntegrationTesting/CustomErrorDetailsTest.cs
+++ b/src/csharp/Grpc.IntegrationTesting/CustomErrorDetailsTest.cs
@@ -42,7 +42,7 @@
         Channel channel;
         TestService.TestServiceClient client;
 
-        [TestFixtureSetUp]
+        [OneTimeSetUp]
         public void Init()
         {
             // Disable SO_REUSEPORT to prevent https://github.com/grpc/grpc/issues/10755
@@ -57,7 +57,7 @@
             client = new TestService.TestServiceClient(channel);
         }
 
-        [TestFixtureTearDown]
+        [OneTimeTearDown]
         public void Cleanup()
         {
             channel.ShutdownAsync().Wait();
@@ -108,7 +108,7 @@
 
         private class CustomErrorDetailsTestServiceImpl : TestService.TestServiceBase
         {
-            public override async Task<SimpleResponse> UnaryCall(SimpleRequest request, ServerCallContext context)
+            public override Task<SimpleResponse> UnaryCall(SimpleRequest request, ServerCallContext context)
             {
                 try
                 {
diff --git a/src/csharp/Grpc.IntegrationTesting/GeneratedServiceBaseTest.cs b/src/csharp/Grpc.IntegrationTesting/GeneratedServiceBaseTest.cs
index a97818a..adeec05 100644
--- a/src/csharp/Grpc.IntegrationTesting/GeneratedServiceBaseTest.cs
+++ b/src/csharp/Grpc.IntegrationTesting/GeneratedServiceBaseTest.cs
@@ -65,7 +65,7 @@
         }
 
         [Test]
-        public async Task UnimplementedByDefault_ClientStreaming()
+        public void UnimplementedByDefault_ClientStreaming()
         {
             var call = client.StreamingInputCall();
 
@@ -74,7 +74,7 @@
         }
 
         [Test]
-        public async Task UnimplementedByDefault_ServerStreamingCall()
+        public void UnimplementedByDefault_ServerStreamingCall()
         {
             var call = client.StreamingOutputCall(new StreamingOutputCallRequest());
 
@@ -83,7 +83,7 @@
         }
 
         [Test]
-        public async Task UnimplementedByDefault_DuplexStreamingCall()
+        public void UnimplementedByDefault_DuplexStreamingCall()
         {
             var call = client.FullDuplexCall();
 
diff --git a/src/csharp/Grpc.IntegrationTesting/Grpc.IntegrationTesting.csproj b/src/csharp/Grpc.IntegrationTesting/Grpc.IntegrationTesting.csproj
index 6f2f06a..f5077fe 100755
--- a/src/csharp/Grpc.IntegrationTesting/Grpc.IntegrationTesting.csproj
+++ b/src/csharp/Grpc.IntegrationTesting/Grpc.IntegrationTesting.csproj
@@ -10,6 +10,7 @@
     <PackageId>Grpc.IntegrationTesting</PackageId>
     <PackageTargetFallback Condition=" '$(TargetFramework)' == 'netcoreapp1.0' ">$(PackageTargetFallback);portable-net45</PackageTargetFallback>
     <RuntimeFrameworkVersion Condition=" '$(TargetFramework)' == 'netcoreapp1.0' ">1.0.4</RuntimeFrameworkVersion>
+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/src/csharp/Grpc.IntegrationTesting/InteropClientServerTest.cs b/src/csharp/Grpc.IntegrationTesting/InteropClientServerTest.cs
index 4a28f24..e0fc259 100644
--- a/src/csharp/Grpc.IntegrationTesting/InteropClientServerTest.cs
+++ b/src/csharp/Grpc.IntegrationTesting/InteropClientServerTest.cs
@@ -38,7 +38,7 @@
         Channel channel;
         TestService.TestServiceClient client;
 
-        [TestFixtureSetUp]
+        [OneTimeSetUp]
         public void Init()
         {
             // Disable SO_REUSEPORT to prevent https://github.com/grpc/grpc/issues/10755
@@ -58,7 +58,7 @@
             client = new TestService.TestServiceClient(channel);
         }
 
-        [TestFixtureTearDown]
+        [OneTimeTearDown]
         public void Cleanup()
         {
             channel.ShutdownAsync().Wait();
diff --git a/src/csharp/Grpc.IntegrationTesting/MetricsGrpc.cs b/src/csharp/Grpc.IntegrationTesting/MetricsGrpc.cs
index bc32c56..9a664f3 100644
--- a/src/csharp/Grpc.IntegrationTesting/MetricsGrpc.cs
+++ b/src/csharp/Grpc.IntegrationTesting/MetricsGrpc.cs
@@ -21,6 +21,7 @@
 // Currently, 'Gauge' (i.e a metric that represents the measured value of
 // something at an instant of time) is the only metric type supported by the
 // service.
+#pragma warning disable 1591
 #region Designer generated code
 
 using System;
diff --git a/src/csharp/Grpc.IntegrationTesting/RunnerClientServerTest.cs b/src/csharp/Grpc.IntegrationTesting/RunnerClientServerTest.cs
index a766a5b..c5c92aa 100644
--- a/src/csharp/Grpc.IntegrationTesting/RunnerClientServerTest.cs
+++ b/src/csharp/Grpc.IntegrationTesting/RunnerClientServerTest.cs
@@ -35,7 +35,7 @@
     {
         IServerRunner serverRunner;
 
-        [TestFixtureSetUp]
+        [OneTimeSetUp]
         public void Init()
         {
             var serverConfig = new ServerConfig
@@ -45,7 +45,7 @@
             serverRunner = ServerRunners.CreateStarted(serverConfig);
         }
 
-        [TestFixtureTearDown]
+        [OneTimeTearDown]
         public void Cleanup()
         {
             serverRunner.StopAsync().Wait();
diff --git a/src/csharp/Grpc.IntegrationTesting/ServicesGrpc.cs b/src/csharp/Grpc.IntegrationTesting/ServicesGrpc.cs
index bd5971e..bfae4ee 100644
--- a/src/csharp/Grpc.IntegrationTesting/ServicesGrpc.cs
+++ b/src/csharp/Grpc.IntegrationTesting/ServicesGrpc.cs
@@ -17,6 +17,7 @@
 //
 // An integration test service that covers all the method signature permutations
 // of unary/streaming requests/responses.
+#pragma warning disable 1591
 #region Designer generated code
 
 using System;
diff --git a/src/csharp/Grpc.IntegrationTesting/SslCredentialsTest.cs b/src/csharp/Grpc.IntegrationTesting/SslCredentialsTest.cs
index 974ed96..152d8fe 100644
--- a/src/csharp/Grpc.IntegrationTesting/SslCredentialsTest.cs
+++ b/src/csharp/Grpc.IntegrationTesting/SslCredentialsTest.cs
@@ -41,7 +41,7 @@
         Channel channel;
         TestService.TestServiceClient client;
 
-        [TestFixtureSetUp]
+        [OneTimeSetUp]
         public void Init()
         {
             var rootCert = File.ReadAllText(TestCredentials.ClientCertAuthorityPath);
@@ -69,7 +69,7 @@
             client = new TestService.TestServiceClient(channel);
         }
 
-        [TestFixtureTearDown]
+        [OneTimeTearDown]
         public void Cleanup()
         {
             channel.ShutdownAsync().Wait();
@@ -94,15 +94,15 @@
 
         private class SslCredentialsTestServiceImpl : TestService.TestServiceBase
         {
-            public override async Task<SimpleResponse> UnaryCall(SimpleRequest request, ServerCallContext context)
+            public override Task<SimpleResponse> UnaryCall(SimpleRequest request, ServerCallContext context)
             {
-                return new SimpleResponse { Payload = CreateZerosPayload(request.ResponseSize) };
+                return Task.FromResult(new SimpleResponse { Payload = CreateZerosPayload(request.ResponseSize) });
             }
 
             public override async Task<StreamingInputCallResponse> StreamingInputCall(IAsyncStreamReader<StreamingInputCallRequest> requestStream, ServerCallContext context)
             {
                 var authContext = context.AuthContext;
-                await requestStream.ForEachAsync(async request => {});
+                await requestStream.ForEachAsync(request => TaskUtils.CompletedTask);
 
                 Assert.IsTrue(authContext.IsPeerAuthenticated);
                 Assert.AreEqual("x509_subject_alternative_name", authContext.PeerIdentityPropertyName);
diff --git a/src/csharp/Grpc.IntegrationTesting/TestGrpc.cs b/src/csharp/Grpc.IntegrationTesting/TestGrpc.cs
index b180d09..b419dd1 100644
--- a/src/csharp/Grpc.IntegrationTesting/TestGrpc.cs
+++ b/src/csharp/Grpc.IntegrationTesting/TestGrpc.cs
@@ -18,6 +18,7 @@
 // An integration test service that covers all the method signature permutations
 // of unary/streaming requests/responses.
 //
+#pragma warning disable 1591
 #region Designer generated code
 
 using System;
diff --git a/src/csharp/Grpc.IntegrationTesting/TestServiceImpl.cs b/src/csharp/Grpc.IntegrationTesting/TestServiceImpl.cs
index ad03351..0972512 100644
--- a/src/csharp/Grpc.IntegrationTesting/TestServiceImpl.cs
+++ b/src/csharp/Grpc.IntegrationTesting/TestServiceImpl.cs
@@ -63,9 +63,10 @@
             await EnsureEchoMetadataAsync(context);
 
             int sum = 0;
-            await requestStream.ForEachAsync(async request =>
+            await requestStream.ForEachAsync(request =>
             {
                 sum += request.Payload.Body.Length;
+                return TaskUtils.CompletedTask;
             });
             return new StreamingInputCallResponse { AggregatedPayloadSize = sum };
         }
@@ -85,7 +86,7 @@
             });
         }
 
-        public override async Task HalfDuplexCall(IAsyncStreamReader<StreamingOutputCallRequest> requestStream, IServerStreamWriter<StreamingOutputCallResponse> responseStream, ServerCallContext context)
+        public override Task HalfDuplexCall(IAsyncStreamReader<StreamingOutputCallRequest> requestStream, IServerStreamWriter<StreamingOutputCallResponse> responseStream, ServerCallContext context)
         {
             throw new NotImplementedException();
         }
diff --git a/src/csharp/Grpc.Microbenchmarks/Grpc.Microbenchmarks.csproj b/src/csharp/Grpc.Microbenchmarks/Grpc.Microbenchmarks.csproj
index 26a940e..17797e1 100644
--- a/src/csharp/Grpc.Microbenchmarks/Grpc.Microbenchmarks.csproj
+++ b/src/csharp/Grpc.Microbenchmarks/Grpc.Microbenchmarks.csproj
@@ -10,6 +10,7 @@
     <PackageId>Grpc.Microbenchmarks</PackageId>
     <PackageTargetFallback Condition=" '$(TargetFramework)' == 'netcoreapp1.0' ">$(PackageTargetFallback);portable-net45</PackageTargetFallback>
     <RuntimeFrameworkVersion Condition=" '$(TargetFramework)' == 'netcoreapp1.0' ">1.0.4</RuntimeFrameworkVersion>
+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/src/csharp/Grpc.Reflection.Tests/Grpc.Reflection.Tests.csproj b/src/csharp/Grpc.Reflection.Tests/Grpc.Reflection.Tests.csproj
index af6ade8..cf756c6 100755
--- a/src/csharp/Grpc.Reflection.Tests/Grpc.Reflection.Tests.csproj
+++ b/src/csharp/Grpc.Reflection.Tests/Grpc.Reflection.Tests.csproj
@@ -10,6 +10,7 @@
     <PackageId>Grpc.Reflection.Tests</PackageId>
     <PackageTargetFallback Condition=" '$(TargetFramework)' == 'netcoreapp1.0' ">$(PackageTargetFallback);portable-net45</PackageTargetFallback>
     <RuntimeFrameworkVersion Condition=" '$(TargetFramework)' == 'netcoreapp1.0' ">1.0.4</RuntimeFrameworkVersion>
+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/src/csharp/Grpc.Reflection.Tests/ReflectionClientServerTest.cs b/src/csharp/Grpc.Reflection.Tests/ReflectionClientServerTest.cs
index 7e894ed..76f8cfa 100644
--- a/src/csharp/Grpc.Reflection.Tests/ReflectionClientServerTest.cs
+++ b/src/csharp/Grpc.Reflection.Tests/ReflectionClientServerTest.cs
@@ -38,7 +38,7 @@
         ServerReflection.ServerReflectionClient client;
         ReflectionServiceImpl serviceImpl;
 
-        [TestFixtureSetUp]
+        [OneTimeSetUp]
         public void Init()
         {
             serviceImpl = new ReflectionServiceImpl(ServerReflection.Descriptor);
@@ -55,7 +55,7 @@
             client = new ServerReflection.ServerReflectionClient(channel);
         }
 
-        [TestFixtureTearDown]
+        [OneTimeTearDown]
         public void Cleanup()
         {
             channel.ShutdownAsync().Wait();
diff --git a/src/csharp/Grpc.Reflection/Grpc.Reflection.csproj b/src/csharp/Grpc.Reflection/Grpc.Reflection.csproj
index 929a78e..b77fd69 100755
--- a/src/csharp/Grpc.Reflection/Grpc.Reflection.csproj
+++ b/src/csharp/Grpc.Reflection/Grpc.Reflection.csproj
@@ -18,6 +18,7 @@
     <IncludeSymbols>true</IncludeSymbols>
     <IncludeSource>true</IncludeSource>
     <GenerateDocumentationFile>true</GenerateDocumentationFile>
+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/src/csharp/Grpc.Reflection/ReflectionGrpc.cs b/src/csharp/Grpc.Reflection/ReflectionGrpc.cs
index 0af76ee..5843957 100644
--- a/src/csharp/Grpc.Reflection/ReflectionGrpc.cs
+++ b/src/csharp/Grpc.Reflection/ReflectionGrpc.cs
@@ -17,6 +17,7 @@
 //
 // Service exported by server reflection
 //
+#pragma warning disable 1591
 #region Designer generated code
 
 using System;
diff --git a/src/csharp/Grpc.Reflection/ReflectionServiceImpl.cs b/src/csharp/Grpc.Reflection/ReflectionServiceImpl.cs
index 9f27a94..1eaf10b 100644
--- a/src/csharp/Grpc.Reflection/ReflectionServiceImpl.cs
+++ b/src/csharp/Grpc.Reflection/ReflectionServiceImpl.cs
@@ -60,6 +60,9 @@
         {
         }
 
+        /// <summary>
+        /// Processes a stream of server reflection requests.
+        /// </summary>
         public override async Task ServerReflectionInfo(IAsyncStreamReader<ServerReflectionRequest> requestStream, IServerStreamWriter<ServerReflectionResponse> responseStream, ServerCallContext context)
         {
             while (await requestStream.MoveNext())
diff --git a/src/csharp/build_packages_dotnetcli.bat b/src/csharp/build_packages_dotnetcli.bat
index 4e3870d..c419d87 100755
--- a/src/csharp/build_packages_dotnetcli.bat
+++ b/src/csharp/build_packages_dotnetcli.bat
@@ -13,7 +13,7 @@
 @rem limitations under the License.
 
 @rem Current package versions
-set VERSION=1.5.0-dev
+set VERSION=1.7.0-dev
 
 @rem Adjust the location of nuget.exe
 set NUGET=C:\nuget\nuget.exe
diff --git a/src/csharp/build_packages_dotnetcli.sh b/src/csharp/build_packages_dotnetcli.sh
index f259cdb..124dfbb 100755
--- a/src/csharp/build_packages_dotnetcli.sh
+++ b/src/csharp/build_packages_dotnetcli.sh
@@ -39,7 +39,7 @@
 dotnet pack --configuration Release Grpc.HealthCheck --output ../../../artifacts
 dotnet pack --configuration Release Grpc.Reflection --output ../../../artifacts
 
-nuget pack Grpc.nuspec -Version "1.5.0-dev" -OutputDirectory ../../artifacts
-nuget pack Grpc.Tools.nuspec -Version "1.5.0-dev" -OutputDirectory ../../artifacts
+nuget pack Grpc.nuspec -Version "1.7.0-dev" -OutputDirectory ../../artifacts
+nuget pack Grpc.Tools.nuspec -Version "1.7.0-dev" -OutputDirectory ../../artifacts
 
 (cd ../../artifacts && zip csharp_nugets_dotnetcli.zip *.nupkg)
diff --git a/src/csharp/global.json b/src/csharp/global.json
new file mode 100644
index 0000000..e4b797e
--- /dev/null
+++ b/src/csharp/global.json
@@ -0,0 +1,5 @@
+{
+  "sdk": {
+    "version": "1.0.0"
+  }
+}
diff --git a/src/node/health_check/package.json b/src/node/health_check/package.json
index 6aa4152..3c7d370 100644
--- a/src/node/health_check/package.json
+++ b/src/node/health_check/package.json
@@ -1,6 +1,6 @@
 {
   "name": "grpc-health-check",
-  "version": "1.5.0-dev",
+  "version": "1.7.0-dev",
   "author": "Google Inc.",
   "description": "Health check service for use with gRPC",
   "repository": {
@@ -15,7 +15,7 @@
     }
   ],
   "dependencies": {
-    "grpc": "^1.5.0-dev",
+    "grpc": "^1.7.0-dev",
     "lodash": "^3.9.3",
     "google-protobuf": "^3.0.0"
   },
diff --git a/src/node/tools/package.json b/src/node/tools/package.json
index 0a3c327..d9b1fb8 100644
--- a/src/node/tools/package.json
+++ b/src/node/tools/package.json
@@ -1,6 +1,6 @@
 {
   "name": "grpc-tools",
-  "version": "1.5.0-dev",
+  "version": "1.7.0-dev",
   "author": "Google Inc.",
   "description": "Tools for developing with gRPC on Node.js",
   "homepage": "https://grpc.io/",
diff --git "a/src/objective-c/\041ProtoCompiler-gRPCPlugin.podspec" "b/src/objective-c/\041ProtoCompiler-gRPCPlugin.podspec"
index 345eecc..3a282b0 100644
--- "a/src/objective-c/\041ProtoCompiler-gRPCPlugin.podspec"
+++ "b/src/objective-c/\041ProtoCompiler-gRPCPlugin.podspec"
@@ -42,7 +42,7 @@
   # exclamation mark ensures that other "regular" pods will be able to find it as it'll be installed
   # before them.
   s.name     = '!ProtoCompiler-gRPCPlugin'
-  v = '1.5.0-dev'
+  v = '1.7.0-dev'
   s.version  = v
   s.summary  = 'The gRPC ProtoC plugin generates Objective-C files from .proto services.'
   s.description = <<-DESC
diff --git a/src/objective-c/GRPCClient/private/version.h b/src/objective-c/GRPCClient/private/version.h
index d9cb388..843954e 100644
--- a/src/objective-c/GRPCClient/private/version.h
+++ b/src/objective-c/GRPCClient/private/version.h
@@ -23,4 +23,4 @@
 // `tools/buildgen/generate_projects.sh`.
 
 
-#define GRPC_OBJC_VERSION_STRING @"1.5.0-dev"
+#define GRPC_OBJC_VERSION_STRING @"1.7.0-dev"
diff --git a/src/php/composer.json b/src/php/composer.json
index c6a74c5..3606a18 100644
--- a/src/php/composer.json
+++ b/src/php/composer.json
@@ -2,7 +2,7 @@
   "name": "grpc/grpc-dev",
   "description": "gRPC library for PHP - for Developement use only",
   "license": "Apache-2.0",
-  "version": "1.5.0",
+  "version": "1.7.0",
   "require": {
     "php": ">=5.5.0",
     "google/protobuf": "^v3.3.0"
diff --git a/src/php/ext/grpc/version.h b/src/php/ext/grpc/version.h
index 744028b..07d8eee 100644
--- a/src/php/ext/grpc/version.h
+++ b/src/php/ext/grpc/version.h
@@ -20,6 +20,6 @@
 #ifndef VERSION_H
 #define VERSION_H
 
-#define PHP_GRPC_VERSION "1.5.0dev"
+#define PHP_GRPC_VERSION "1.7.0dev"
 
 #endif /* VERSION_H */
diff --git a/src/php/lib/Grpc/ServerStreamingCall.php b/src/php/lib/Grpc/ServerStreamingCall.php
index 269a99a..f8fddfe 100644
--- a/src/php/lib/Grpc/ServerStreamingCall.php
+++ b/src/php/lib/Grpc/ServerStreamingCall.php
@@ -40,13 +40,11 @@
         if (array_key_exists('flags', $options)) {
             $message_array['flags'] = $options['flags'];
         }
-        $event = $this->call->startBatch([
+        $this->call->startBatch([
             OP_SEND_INITIAL_METADATA => $metadata,
-            OP_RECV_INITIAL_METADATA => true,
             OP_SEND_MESSAGE => $message_array,
             OP_SEND_CLOSE_FROM_CLIENT => true,
         ]);
-        $this->metadata = $event->metadata;
     }
 
     /**
@@ -54,9 +52,15 @@
      */
     public function responses()
     {
-        $response = $this->call->startBatch([
-            OP_RECV_MESSAGE => true,
-        ])->message;
+        $batch = [OP_RECV_MESSAGE => true];
+        if ($this->metadata === null) {
+            $batch[OP_RECV_INITIAL_METADATA] = true;
+        }
+        $read_event = $this->call->startBatch($batch);
+        if ($this->metadata === null) {
+            $this->metadata = $read_event->metadata;
+        }
+        $response = $read_event->message;
         while ($response !== null) {
             yield $this->_deserializeResponse($response);
             $response = $this->call->startBatch([
@@ -81,4 +85,16 @@
 
         return $status_event->status;
     }
+
+    /**
+     * @return mixed The metadata sent by the server
+     */
+    public function getMetadata()
+    {
+        if ($this->metadata === null) {
+            $event = $this->call->startBatch([OP_RECV_INITIAL_METADATA => true]);
+            $this->metadata = $event->metadata;
+        }
+        return $this->metadata;
+    }
 }
diff --git a/src/php/lib/Grpc/UnaryCall.php b/src/php/lib/Grpc/UnaryCall.php
index dd55d02..e849649 100644
--- a/src/php/lib/Grpc/UnaryCall.php
+++ b/src/php/lib/Grpc/UnaryCall.php
@@ -40,13 +40,11 @@
         if (isset($options['flags'])) {
             $message_array['flags'] = $options['flags'];
         }
-        $event = $this->call->startBatch([
+        $this->call->startBatch([
             OP_SEND_INITIAL_METADATA => $metadata,
-            OP_RECV_INITIAL_METADATA => true,
             OP_SEND_MESSAGE => $message_array,
             OP_SEND_CLOSE_FROM_CLIENT => true,
         ]);
-        $this->metadata = $event->metadata;
     }
 
     /**
@@ -56,14 +54,32 @@
      */
     public function wait()
     {
-        $event = $this->call->startBatch([
+        $batch = [
             OP_RECV_MESSAGE => true,
             OP_RECV_STATUS_ON_CLIENT => true,
-        ]);
-
+        ];
+        if ($this->metadata === null) {
+            $batch[OP_RECV_INITIAL_METADATA] = true;
+        }
+        $event = $this->call->startBatch($batch);
+        if ($this->metadata === null) {
+            $this->metadata = $event->metadata;
+        }
         $status = $event->status;
         $this->trailing_metadata = $status->metadata;
 
         return [$this->_deserializeResponse($event->message), $status];
     }
+
+    /**
+     * @return mixed The metadata sent by the server
+     */
+    public function getMetadata()
+    {
+        if ($this->metadata === null) {
+            $event = $this->call->startBatch([OP_RECV_INITIAL_METADATA => true]);
+            $this->metadata = $event->metadata;
+        }
+        return $this->metadata;
+    }
 }
diff --git a/src/python/grpcio/grpc/_grpcio_metadata.py b/src/python/grpcio/grpc/_grpcio_metadata.py
index dcb4645..a4eb358 100644
--- a/src/python/grpcio/grpc/_grpcio_metadata.py
+++ b/src/python/grpcio/grpc/_grpcio_metadata.py
@@ -14,4 +14,4 @@
 
 # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio/grpc/_grpcio_metadata.py.template`!!!
 
-__version__ = """1.5.0.dev0"""
+__version__ = """1.7.0.dev0"""
diff --git a/src/python/grpcio/grpc_version.py b/src/python/grpcio/grpc_version.py
index 1bbd1e1..3194a89 100644
--- a/src/python/grpcio/grpc_version.py
+++ b/src/python/grpcio/grpc_version.py
@@ -14,4 +14,4 @@
 
 # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio/grpc_version.py.template`!!!
 
-VERSION='1.5.0.dev0'
+VERSION='1.7.0.dev0'
diff --git a/src/python/grpcio_health_checking/grpc_version.py b/src/python/grpcio_health_checking/grpc_version.py
index 8aa5118..ef68bad 100644
--- a/src/python/grpcio_health_checking/grpc_version.py
+++ b/src/python/grpcio_health_checking/grpc_version.py
@@ -14,4 +14,4 @@
 
 # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_health_checking/grpc_version.py.template`!!!
 
-VERSION='1.5.0.dev0'
+VERSION='1.7.0.dev0'
diff --git a/src/python/grpcio_reflection/grpc_version.py b/src/python/grpcio_reflection/grpc_version.py
index a23b9b5..55ab959 100644
--- a/src/python/grpcio_reflection/grpc_version.py
+++ b/src/python/grpcio_reflection/grpc_version.py
@@ -14,4 +14,4 @@
 
 # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_reflection/grpc_version.py.template`!!!
 
-VERSION='1.5.0.dev0'
+VERSION='1.7.0.dev0'
diff --git a/src/python/grpcio_tests/grpc_version.py b/src/python/grpcio_tests/grpc_version.py
index fd47b42..9e54dc9 100644
--- a/src/python/grpcio_tests/grpc_version.py
+++ b/src/python/grpcio_tests/grpc_version.py
@@ -14,4 +14,4 @@
 
 # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_tests/grpc_version.py.template`!!!
 
-VERSION='1.5.0.dev0'
+VERSION='1.7.0.dev0'
diff --git a/src/ruby/lib/grpc/generic/rpc_desc.rb b/src/ruby/lib/grpc/generic/rpc_desc.rb
index 89cf8ff..6fb6c41 100644
--- a/src/ruby/lib/grpc/generic/rpc_desc.rb
+++ b/src/ruby/lib/grpc/generic/rpc_desc.rb
@@ -99,9 +99,13 @@
       # event.  Send a status of deadline exceeded
       GRPC.logger.warn("late call: #{active_call}")
       send_status(active_call, DEADLINE_EXCEEDED, 'late')
-    rescue StandardError => e
+    rescue StandardError, NotImplementedError => e
       # This will usuaally be an unhandled error in the handling code.
       # Send back a UNKNOWN status to the client
+      #
+      # Note: this intentionally does not map NotImplementedError to
+      # UNIMPLEMENTED because NotImplementedError is intended for low-level
+      # OS interaction (e.g. syscalls) not supported by the current OS.
       GRPC.logger.warn("failed handler: #{active_call}; sending status:UNKNOWN")
       GRPC.logger.warn(e)
       send_status(active_call, UNKNOWN, "#{e.class}: #{e.message}")
diff --git a/src/ruby/lib/grpc/version.rb b/src/ruby/lib/grpc/version.rb
index 0aaf449..228c01a 100644
--- a/src/ruby/lib/grpc/version.rb
+++ b/src/ruby/lib/grpc/version.rb
@@ -14,5 +14,5 @@
 
 # GRPC contains the General RPC module.
 module GRPC
-  VERSION = '1.5.0.dev'
+  VERSION = '1.7.0.dev'
 end
diff --git a/src/ruby/spec/generic/rpc_desc_spec.rb b/src/ruby/spec/generic/rpc_desc_spec.rb
index be578c4..6852b98 100644
--- a/src/ruby/spec/generic/rpc_desc_spec.rb
+++ b/src/ruby/spec/generic/rpc_desc_spec.rb
@@ -52,6 +52,13 @@
       this_desc.run_server_method(@call, method(:other_error))
     end
 
+    it 'sends status UNKNOWN if NotImplementedErrors are raised' do
+      expect(@call).to receive(:read_unary_request).once.and_return(Object.new)
+      expect(@call).to receive(:send_status).once.with(
+        UNKNOWN, not_implemented_error_msg, false, metadata: {})
+      this_desc.run_server_method(@call, method(:not_implemented))
+    end
+
     it 'absorbs CallError with no further action' do
       expect(@call).to receive(:read_unary_request).once.and_raise(CallError)
       blk = proc do
@@ -102,6 +109,12 @@
         @client_streamer.run_server_method(@call, method(:other_error_alt))
       end
 
+      it 'sends status UNKNOWN if NotImplementedErrors are raised' do
+        expect(@call).to receive(:send_status).once.with(
+          UNKNOWN, not_implemented_error_msg, false, metadata: {})
+        @client_streamer.run_server_method(@call, method(:not_implemented_alt))
+      end
+
       it 'absorbs CallError with no further action' do
         expect(@call).to receive(:server_unary_response).once.and_raise(
           CallError)
@@ -166,6 +179,14 @@
         @bidi_streamer.run_server_method(@call, method(:other_error_alt))
       end
 
+      it 'sends status UNKNOWN if NotImplementedErrors are raised' do
+        expect(@call).to receive(:run_server_bidi).and_raise(
+          not_implemented_error)
+        expect(@call).to receive(:send_status).once.with(
+          UNKNOWN, not_implemented_error_msg, false, metadata: {})
+        @bidi_streamer.run_server_method(@call, method(:not_implemented_alt))
+      end
+
       it 'closes the stream if there no errors' do
         expect(@call).to receive(:run_server_bidi)
         expect(@call).to receive(:output_metadata).and_return(fake_md)
@@ -329,8 +350,25 @@
     fail(ArgumentError, 'other error')
   end
 
+  def not_implemented(_req, _call)
+    fail not_implemented_error
+  end
+
+  def not_implemented_alt(_call)
+    fail not_implemented_error
+  end
+
   def arg_error_msg(error = nil)
     error ||= ArgumentError.new('other error')
     "#{error.class}: #{error.message}"
   end
+
+  def not_implemented_error
+    NotImplementedError.new('some OS feature not implemented')
+  end
+
+  def not_implemented_error_msg(error = nil)
+    error ||= not_implemented_error
+    "#{error.class}: #{error.message}"
+  end
 end
diff --git a/src/ruby/tools/version.rb b/src/ruby/tools/version.rb
index 4c52932..ea0c4ae 100644
--- a/src/ruby/tools/version.rb
+++ b/src/ruby/tools/version.rb
@@ -14,6 +14,6 @@
 
 module GRPC
   module Tools
-    VERSION = '1.5.0.dev'
+    VERSION = '1.7.0.dev'
   end
 end
diff --git a/templates/gRPC-Core.podspec.template b/templates/gRPC-Core.podspec.template
index cfc13cf..616f2cb 100644
--- a/templates/gRPC-Core.podspec.template
+++ b/templates/gRPC-Core.podspec.template
@@ -178,4 +178,9 @@
                         'test/core/util/port.c',
                         'test/core/util/port_server_client.{c,h}'
     end
+
+    # TODO (mxyan): Instead of this hack, add include path "third_party" to C core's include path?
+    s.prepare_command = <<-END_OF_COMMAND
+      find src/core/ -type f -exec sed -E -i '.back' 's;#include "third_party/nanopb/(.*)";#include <nanopb/\\1>;g' {} \\\;
+    END_OF_COMMAND
   end
diff --git a/templates/grpc.gyp.template b/templates/grpc.gyp.template
new file mode 100644
index 0000000..3363082
--- /dev/null
+++ b/templates/grpc.gyp.template
@@ -0,0 +1,157 @@
+%YAML 1.2
+--- |
+  # GRPC GYP build file
+
+  # This file has been automatically generated from a template file.
+  # Please look at the templates directory instead.
+  # This file can be regenerated from the template by running
+  # tools/buildgen/generate_projects.sh
+
+  # Copyright 2015 gRPC authors.
+  #
+  # Licensed under the Apache License, Version 2.0 (the "License");
+  # you may not use this file except in compliance with the License.
+  # You may obtain a copy of the License at
+  #
+  #     http://www.apache.org/licenses/LICENSE-2.0
+  #
+  # Unless required by applicable law or agreed to in writing, software
+  # distributed under the License is distributed on an "AS IS" BASIS,
+  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  # See the License for the specific language governing permissions and
+  # limitations under the License.
+
+  {
+    'variables': {
+     # The openssl and zlib dependencies must be passed in as variables
+     # defined in an included gypi file, usually common.gypi.
+     'openssl_gyp_target%': 'Please Define openssl_gyp_target variable',
+     'zlib_gyp_target%': 'Please Define zlib_gyp_target variable',
+
+     'grpc_gcov%': 'false',
+     'grpc_alpine%': 'false',
+    },
+    'target_defaults': {
+      'configurations': {
+        % for name, args in configs.iteritems():
+        %  if name in ['dbg', 'opt']:
+        '${{'dbg':'Debug', 'opt': 'Release'}[name]}': {
+          % for arg, prop in [('CPPFLAGS', 'cflags'), ('DEFINES', 'defines')]:
+          %  if args.get(arg, None) is not None:
+          '${prop}': [
+            % for item in args.get(arg).split():
+            '${item}',
+            % endfor
+          ],
+          %  endif
+          % endfor
+        },
+        %  endif
+        % endfor
+      },
+      % for arg, prop in [('CPPFLAGS', 'cflags'), ('LDFLAGS', 'ldflags')]:
+      %  if defaults['global'].get(arg, None) is not None:
+      '${prop}': [
+        % for item in defaults['global'].get(arg).split():
+        '${item}',
+        % endfor
+      ],
+      %  endif
+      % endfor
+      'cflags_c': [
+        '-Werror',
+        '-std=c99'
+      ],
+      'cflags_cc': [
+        '-Werror',
+        '-std=c++11'
+      ],
+      'include_dirs': [
+        '.',
+        '../..',
+        'include',
+      ],
+      'defines': [
+        'GRPC_ARES=0',
+      ],
+      'dependencies': [
+        '<(openssl_gyp_target)',
+        '<(zlib_gyp_target)',
+      ],
+      'conditions': [
+        ['grpc_gcov=="true"', {
+          % for arg, prop in [('CPPFLAGS', 'cflags'), ('DEFINES', 'defines'), ('LDFLAGS', 'ldflags')]:
+          %  if configs['gcov'].get(arg, None) is not None:
+          '${prop}': [
+            % for item in configs['gcov'].get(arg).split():
+            '${item}',
+            % endfor
+          ],
+          %  endif
+          % endfor
+        }],
+        ['grpc_alpine=="true"', {
+          'defines': [
+            'GPR_MUSL_LIBC_COMPAT'
+          ]
+        }],
+        ['OS == "win"', {
+          'defines': [
+            '_WIN32_WINNT=0x0600',
+            'WIN32_LEAN_AND_MEAN',
+            '_HAS_EXCEPTIONS=0',
+            'UNICODE',
+            '_UNICODE',
+            'NOMINMAX',
+          ],
+          'msvs_settings': {
+            'VCCLCompilerTool': {
+              'RuntimeLibrary': 1, # static debug
+            }
+          },
+          "libraries": [
+            "ws2_32"
+          ]
+        }],
+        ['OS == "mac"', {
+          'xcode_settings': {
+            % if defaults['global'].get('CPPFLAGS', None) is not None:
+            'OTHER_CFLAGS': [
+              % for item in defaults['global'].get('CPPFLAGS').split():
+              '${item}',
+              % endfor
+            ],
+            'OTHER_CPLUSPLUSFLAGS': [
+              % for item in defaults['global'].get('CPPFLAGS').split():
+              '${item}',
+              % endfor
+              '-stdlib=libc++',
+              '-std=c++11',
+              '-Wno-error=deprecated-declarations'
+            ],
+            % endif
+          },
+        }]
+      ]
+    },
+    'targets': [
+      % for lib in libs:
+      %  if getattr(lib, 'platforms', None) is None and lib.name != 'ares':
+      {
+        'target_name': '${lib.name}',
+        'type': 'static_library',
+        'dependencies': [
+          % for dep in getattr(lib, 'deps', []):
+          '${dep}',
+          % endfor
+        ],
+        'sources': [
+          % for source in lib.src:
+          '${source}',
+          % endfor
+        ],
+      },
+      %  endif
+      % endfor
+    ]
+  }
diff --git a/test/core/end2end/tests/streaming_error_response.c b/test/core/end2end/tests/streaming_error_response.c
index fd8fa7f..9d562b9 100644
--- a/test/core/end2end/tests/streaming_error_response.c
+++ b/test/core/end2end/tests/streaming_error_response.c
@@ -185,6 +185,19 @@
   CQ_EXPECT_COMPLETION(cqv, tag(103), 1);
   cq_verify(cqv);
 
+  if (!request_status_early) {
+    memset(ops, 0, sizeof(ops));
+    op = ops;
+    op->op = GRPC_OP_RECV_MESSAGE;
+    op->data.recv_message.recv_message = &response_payload2_recv;
+    op++;
+    error = grpc_call_start_batch(c, ops, (size_t)(op - ops), tag(2), NULL);
+    GPR_ASSERT(GRPC_CALL_OK == error);
+
+    CQ_EXPECT_COMPLETION(cqv, tag(2), 1);
+    cq_verify(cqv);
+  }
+
   memset(ops, 0, sizeof(ops));
   op = ops;
   op->op = GRPC_OP_RECV_CLOSE_ON_SERVER;
@@ -199,21 +212,9 @@
   error = grpc_call_start_batch(s, ops, (size_t)(op - ops), tag(104), NULL);
   GPR_ASSERT(GRPC_CALL_OK == error);
 
-  if (!request_status_early) {
-    memset(ops, 0, sizeof(ops));
-    op = ops;
-    op->op = GRPC_OP_RECV_MESSAGE;
-    op->data.recv_message.recv_message = &response_payload2_recv;
-    op++;
-    error = grpc_call_start_batch(c, ops, (size_t)(op - ops), tag(2), NULL);
-    GPR_ASSERT(GRPC_CALL_OK == error);
-  }
-
   CQ_EXPECT_COMPLETION(cqv, tag(104), 1);
   if (request_status_early) {
     CQ_EXPECT_COMPLETION(cqv, tag(1), 1);
-  } else {
-    CQ_EXPECT_COMPLETION(cqv, tag(2), 1);
   }
   cq_verify(cqv);
 
diff --git a/test/core/transport/bdp_estimator_test.c b/test/core/transport/bdp_estimator_test.c
index e2612c7..dda48f4 100644
--- a/test/core/transport/bdp_estimator_test.c
+++ b/test/core/transport/bdp_estimator_test.c
@@ -43,12 +43,13 @@
 
 static void add_samples(grpc_bdp_estimator *estimator, int64_t *samples,
                         size_t n) {
-  GPR_ASSERT(grpc_bdp_estimator_add_incoming_bytes(estimator, 1234567) == true);
+  grpc_bdp_estimator_add_incoming_bytes(estimator, 1234567);
+  GPR_ASSERT(grpc_bdp_estimator_need_ping(estimator) == true);
   grpc_bdp_estimator_schedule_ping(estimator);
   grpc_bdp_estimator_start_ping(estimator);
   for (size_t i = 0; i < n; i++) {
-    GPR_ASSERT(grpc_bdp_estimator_add_incoming_bytes(estimator, samples[i]) ==
-               false);
+    grpc_bdp_estimator_add_incoming_bytes(estimator, samples[i]);
+    GPR_ASSERT(grpc_bdp_estimator_need_ping(estimator) == false);
   }
   gpr_sleep_until(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
                                gpr_time_from_millis(1, GPR_TIMESPAN)));
diff --git a/third_party/protobuf b/third_party/protobuf
index 97d50e3..80a37e0 160000
--- a/third_party/protobuf
+++ b/third_party/protobuf
@@ -1 +1 @@
-Subproject commit 97d50e306e576dadf2184e643b7c934da45730c8
+Subproject commit 80a37e0782d2d702d52234b62dd4b9ec74fd2c95
diff --git a/tools/distrib/python/grpcio_tools/grpc_version.py b/tools/distrib/python/grpcio_tools/grpc_version.py
index 3bad859..a4178a5 100644
--- a/tools/distrib/python/grpcio_tools/grpc_version.py
+++ b/tools/distrib/python/grpcio_tools/grpc_version.py
@@ -14,4 +14,4 @@
 
 # AUTO-GENERATED FROM `$REPO_ROOT/templates/tools/distrib/python/grpcio_tools/grpc_version.py.template`!!!
 
-VERSION='1.5.0.dev0'
+VERSION='1.7.0.dev0'
diff --git a/tools/doxygen/Doxyfile.c++ b/tools/doxygen/Doxyfile.c++
index 589ef1c..b83e581 100644
--- a/tools/doxygen/Doxyfile.c++
+++ b/tools/doxygen/Doxyfile.c++
@@ -40,7 +40,7 @@
 # could be handy for archiving the generated documentation or if some version
 # control system is used.
 
-PROJECT_NUMBER         = 1.5.0-dev
+PROJECT_NUMBER         = 1.7.0-dev
 
 # Using the PROJECT_BRIEF tag one can provide an optional one line description
 # for a project that appears at the top of each page and should give viewer a
diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal
index 7290f20..67dfb06 100644
--- a/tools/doxygen/Doxyfile.c++.internal
+++ b/tools/doxygen/Doxyfile.c++.internal
@@ -40,7 +40,7 @@
 # could be handy for archiving the generated documentation or if some version
 # control system is used.
 
-PROJECT_NUMBER         = 1.5.0-dev
+PROJECT_NUMBER         = 1.7.0-dev
 
 # Using the PROJECT_BRIEF tag one can provide an optional one line description
 # for a project that appears at the top of each page and should give viewer a
diff --git a/tools/flakes/detect_flakes.py b/tools/flakes/detect_flakes.py
index 3289907..2aff4c0 100644
--- a/tools/flakes/detect_flakes.py
+++ b/tools/flakes/detect_flakes.py
@@ -68,10 +68,13 @@
   query_job = big_query_utils.sync_query_job(bq, 'grpc-testing', query)
   page = bq.jobs().getQueryResults(
       pageToken=None, **query_job['jobReference']).execute(num_retries=3)
-  testname_to_cols = {row['f'][0]['v']:
-                      (row['f'][1]['v'], row['f'][2]['v'], row['f'][3]['v'])
-                      for row in page['rows']}
-  return testname_to_cols
+  rows = page.get('rows')
+  if rows:
+    return {row['f'][0]['v']:
+            (row['f'][1]['v'], row['f'][2]['v'], row['f'][3]['v'])
+            for row in rows}
+  else:
+    return {}
 
 
 def get_new_flakes():
@@ -91,6 +94,8 @@
   if new_flakes:
     print("Found {} new flakes:".format(len(new_flakes)))
     print_table(new_flakes)
+  else:
+    print("No new flakes found!")
 
 
 if __name__ == '__main__':
diff --git a/tools/run_tests/run_performance_tests.py b/tools/run_tests/run_performance_tests.py
index 78d1079..0db5e4e 100755
--- a/tools/run_tests/run_performance_tests.py
+++ b/tools/run_tests/run_performance_tests.py
@@ -87,7 +87,7 @@
     user_at_host = '%s@%s' % (_REMOTE_HOST_USERNAME, remote_host)
     ssh_cmd = ['ssh']
     cmdline = ['timeout', '%s' % (worker_timeout + 30)] + cmdline
-    ssh_cmd.extend([str(user_at_host), 'cd ~/performance_workspace/grpc/ && tools/run_tests/start_port_server.py && %s' % ' '.join(cmdline)])
+    ssh_cmd.extend([str(user_at_host), 'cd ~/performance_workspace/grpc/ && python tools/run_tests/start_port_server.py && %s' % ' '.join(cmdline)])
     cmdline = ssh_cmd
 
   jobspec = jobset.JobSpec(
diff --git a/tools/run_tests/run_tests.py b/tools/run_tests/run_tests.py
index a695a62..e8a4be3 100755
--- a/tools/run_tests/run_tests.py
+++ b/tools/run_tests/run_tests.py
@@ -63,8 +63,8 @@
 }
 
 _POLLING_STRATEGIES = {
-  'linux': ['epollsig', 'poll', 'poll-cv'],
-# TODO(ctiller, sreecha): enable epoll1, epollex, epoll-thread-pool
+  'linux': ['epollsig', 'epoll1', 'poll', 'poll-cv'],
+# TODO(ctiller, sreecha): enable epollex, epoll-thread-pool
   'mac': ['poll'],
 }
 
@@ -84,6 +84,7 @@
     [grpc-testing:jenkins_test_results.aggregate_results]
   WHERE
     timestamp >= DATE_ADD(CURRENT_DATE(), -1, "WEEK")
+    AND platform = '"""+platform_string()+"""'
     AND NOT REGEXP_MATCH(job_name, '.*portability.*') )
 GROUP BY
   filtered_test_name
@@ -1267,18 +1268,22 @@
                        'Useful when running many iterations of each test (argument -n).')
 argp.add_argument('--force_default_poller', default=False, action='store_const', const=True,
                   help='Don\'t try to iterate over many polling strategies when they exist')
+argp.add_argument('--force_use_pollers', default=None, type=str,
+                  help='Only use the specified comma-delimited list of polling engines. '
+                  'Example: --force_use_pollers epollsig,poll '
+                  ' (This flag has no effect if --force_default_poller flag is also used)')
 argp.add_argument('--max_time', default=-1, type=int, help='Maximum test runtime in seconds')
 argp.add_argument('--bq_result_table',
                   default='',
                   type=str,
                   nargs='?',
                   help='Upload test results to a specified BQ table.')
-argp.add_argument('--auto_set_flakes', default=True, type=bool,
-                  help='Set flakiness data from historic data')
+argp.add_argument('--disable_auto_set_flakes', default=False, const=True, action='store_const',
+                  help='Disable rerunning historically flaky tests')
 args = argp.parse_args()
 
 flaky_tests = set()
-if args.auto_set_flakes:
+if not args.disable_auto_set_flakes:
   try:
     flaky_tests = set(get_flaky_tests())
   except:
@@ -1286,6 +1291,8 @@
 
 if args.force_default_poller:
   _POLLING_STRATEGIES = {}
+elif args.force_use_pollers:
+  _POLLING_STRATEGIES[platform_string()] = args.force_use_pollers.split(',')
 
 jobset.measure_cpu_costs = args.measure_cpu_costs
 
diff --git a/tools/run_tests/run_tests_matrix.py b/tools/run_tests/run_tests_matrix.py
index 6fe1609..04e2a70 100755
--- a/tools/run_tests/run_tests_matrix.py
+++ b/tools/run_tests/run_tests_matrix.py
@@ -411,6 +411,7 @@
     extra_args.append('--bq_result_table')
     extra_args.append('%s' % args.bq_result_table)
     extra_args.append('--measure_cpu_costs')
+    extra_args.append('--disable_auto_set_flakes')
 
   all_jobs = _create_test_jobs(extra_args=extra_args, inner_jobs=args.inner_jobs) + \
              _create_portability_test_jobs(extra_args=extra_args, inner_jobs=args.inner_jobs)
diff --git a/tools/run_tests/sanity/check_submodules.sh b/tools/run_tests/sanity/check_submodules.sh
index 569aade..b0a0c3a 100755
--- a/tools/run_tests/sanity/check_submodules.sh
+++ b/tools/run_tests/sanity/check_submodules.sh
@@ -31,7 +31,7 @@
  886e7d75368e3f4fab3f4d0d3584e4abfc557755 third_party/boringssl-with-bazel (version_for_cocoapods_7.0-857-g886e7d7)
  30dbc81fb5ffdc98ea9b14b1918bfe4e8779b26e third_party/gflags (v2.2.0)
  ec44c6c1675c25b9827aacd08c02433cccde7780 third_party/googletest (release-1.8.0)
- 97d50e306e576dadf2184e643b7c934da45730c8 third_party/protobuf (v3.4.0rc2)
+ 80a37e0782d2d702d52234b62dd4b9ec74fd2c95 third_party/protobuf (v3.4.0)
  cacf7f1d4e3d44d871b605da3b647f07d718623f third_party/zlib (v1.2.11)
  7691f773af79bf75a62d1863fd0f13ebf9dc51b1 third_party/cares/cares (1.12.0)
 EOF