Merge pull request #9372 from markdroth/proxy_mapper

Add proxy mapper hook.
diff --git a/.gitignore b/.gitignore
index 3112445..618c9ba 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,6 +8,7 @@
 # Python items
 cython_debug/
 python_build/
+python_format_venv/
 .coverage*
 .eggs
 htmlcov/
diff --git a/BUILD b/BUILD
index dff211d..5f0d50c 100644
--- a/BUILD
+++ b/BUILD
@@ -664,6 +664,7 @@
         "src/core/ext/client_channel/connector.c",
         "src/core/ext/client_channel/default_initial_connect_string.c",
         "src/core/ext/client_channel/http_connect_handshaker.c",
+        "src/core/ext/client_channel/http_proxy.c",
         "src/core/ext/client_channel/initial_connect_string.c",
         "src/core/ext/client_channel/lb_policy.c",
         "src/core/ext/client_channel/lb_policy_factory.c",
@@ -683,6 +684,7 @@
         "src/core/ext/client_channel/client_channel_factory.h",
         "src/core/ext/client_channel/connector.h",
         "src/core/ext/client_channel/http_connect_handshaker.h",
+        "src/core/ext/client_channel/http_proxy.h",
         "src/core/ext/client_channel/initial_connect_string.h",
         "src/core/ext/client_channel/lb_policy.h",
         "src/core/ext/client_channel/lb_policy_factory.h",
@@ -1031,7 +1033,7 @@
         "src/core/ext/transport/cronet/transport/cronet_transport.c",
     ],
     hdrs = [
-        "third_party/objective_c/Cronet/cronet_c_for_grpc.h",
+        "third_party/Cronet/bidirectional_stream_c.h",
     ],
     language = "c",
     public_hdrs = [
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4d0aa90..ad40bfc 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -48,6 +48,9 @@
 set(PACKAGE_BUGREPORT "https://github.com/grpc/grpc/issues/")
 project(${PACKAGE_NAME} C CXX)
 
+# Options
+option(gRPC_BUILD_TESTS "Build tests" OFF)
+
 if (NOT MSVC)
   set(gRPC_INSTALL ON CACHE BOOL "Generate installation target")
 else()
@@ -63,6 +66,9 @@
 set(gRPC_PROTOBUF_PROVIDER "module" CACHE STRING "Provider of protobuf library")
 set_property(CACHE gRPC_PROTOBUF_PROVIDER PROPERTY STRINGS "module" "package")
 
+set(gRPC_GFLAGS_PROVIDER "module" CACHE STRING "Provider of gflags library")
+set_property(CACHE gRPC_GFLAGS_PROVIDER PROPERTY STRINGS "module" "package")
+
 set(gRPC_USE_PROTO_LITE OFF CACHE BOOL "Use the protobuf-lite library")
 
 if (MSVC)
@@ -122,6 +128,9 @@
     if(TARGET libprotoc)
       set(_gRPC_PROTOBUF_PROTOC_LIBRARIES libprotoc)
     endif()
+    if(TARGET protoc)
+      set(_gRPC_PROTOBUF_PROTOC protoc)
+    endif()
   else()
       message(WARNING "gRPC_PROTOBUF_PROVIDER is \"module\" but PROTOBUF_ROOT_DIR is wrong")
   endif()
@@ -134,6 +143,9 @@
     if(TARGET protobuf::libprotoc)
       set(_gRPC_PROTOBUF_PROTOC_LIBRARIES protobuf::libprotoc)
     endif()
+    if(TARGET protobuf::protoc)
+      set(_gRPC_PROTOBUF_PROTOC protobuf::protoc)
+    endif()
     set(_gRPC_FIND_PROTOBUF "if(NOT protobuf_FOUND)\n  find_package(protobuf CONFIG)\nendif()")
   else()
     find_package(Protobuf MODULE)
@@ -161,6 +173,26 @@
   set(_gRPC_FIND_SSL "if(NOT OpenSSL_FOUND)\n  find_package(OpenSSL)\nendif()")
 endif()
 
+if("${gRPC_GFLAGS_PROVIDER}" STREQUAL "module")
+  if(NOT GFLAGS_ROOT_DIR)
+    set(GFLAGS_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gflags)
+  endif()
+  if(EXISTS "${GFLAGS_ROOT_DIR}/CMakeLists.txt")
+      add_subdirectory(${GFLAGS_ROOT_DIR} third_party/gflags)
+      if(TARGET gflags_static)
+          set(_gRPC_GFLAGS_LIBRARIES gflags_static)
+      endif()
+  else()
+      message(WARNING "gRPC_GFLAGS_PROVIDER is \"module\" but GFLAGS_ROOT_DIR is wrong")
+  endif()
+elseif("${gRPC_GFLAGS_PROVIDER}" STREQUAL "package")
+  find_package(gflags)
+  if(TARGET gflags::gflags)
+    set(_gRPC_GFLAGS_LIBRARIES gflags::gflags)
+  endif()
+  set(_gRPC_FIND_GFLAGS "if(NOT gflags_FOUND)\n  find_package(gflags)\nendif()")
+endif()
+
 if(NOT MSVC)
   set(CMAKE_C_FLAGS   "${CMAKE_C_FLAGS}   -std=c11")
   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
@@ -175,7 +207,56 @@
   set(CMAKE_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake/gRPC")
 endif()
 
-  
+# Create directory for generated .proto files
+set(_gRPC_PROTO_GENS_DIR ${CMAKE_BINARY_DIR}/gens)
+file(MAKE_DIRECTORY ${_gRPC_PROTO_GENS_DIR})
+
+#  protobuf_generate_grpc_cpp
+#  --------------------------
+#
+#   Add custom commands to process ``.proto`` files to C++ using protoc and
+#   GRPC plugin::
+#
+#     protobuf_generate_grpc_cpp [<ARGN>...]
+#
+#   ``ARGN``
+#     ``.proto`` files
+#
+function(protobuf_generate_grpc_cpp)
+  if(NOT ARGN)
+    message(SEND_ERROR "Error: PROTOBUF_GENERATE_GRPC_CPP() called without any proto files")
+    return()
+  endif()
+
+  set(_protobuf_include_path -I .)
+  foreach(FIL ${ARGN})
+    get_filename_component(ABS_FIL ${FIL} ABSOLUTE)
+    get_filename_component(FIL_WE ${FIL} NAME_WE)
+    file(RELATIVE_PATH REL_FIL ${CMAKE_SOURCE_DIR} ${ABS_FIL})
+    get_filename_component(REL_DIR ${REL_FIL} DIRECTORY)
+    set(RELFIL_WE "${REL_DIR}/${FIL_WE}")
+    
+    add_custom_command(
+      OUTPUT "${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.cc"
+             "${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.h"
+             "${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.cc"
+             "${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.h"
+      COMMAND ${_gRPC_PROTOBUF_PROTOC}
+      ARGS --grpc_out=${_gRPC_PROTO_GENS_DIR}
+           --cpp_out=${_gRPC_PROTO_GENS_DIR}
+           --plugin=protoc-gen-grpc=$<TARGET_FILE:grpc_cpp_plugin>
+           ${_protobuf_include_path}
+           ${REL_FIL}
+      DEPENDS ${ABS_FIL} ${_gRPC_PROTOBUF_PROTOC} grpc_cpp_plugin
+      WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+      COMMENT "Running gRPC C++ protocol buffer compiler on ${FIL}"
+      VERBATIM)
+      
+      set_source_files_properties("${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.cc" "${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.h" "${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.cc" "${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.h" PROPERTIES GENERATED TRUE)
+  endforeach()
+endfunction()
+
+
 add_library(gpr
   src/core/lib/profiling/basic_timers.c
   src/core/lib/profiling/stap_timers.c
@@ -223,6 +304,7 @@
   src/core/lib/support/wrap_memcpy.c
 )
 
+
 target_include_directories(gpr
   PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
   PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
@@ -230,6 +312,7 @@
   PRIVATE ${PROTOBUF_ROOT_DIR}/src
   PRIVATE ${ZLIB_INCLUDE_DIR}
   PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
 )
 
 
@@ -280,7 +363,7 @@
   )
 endforeach()
 
-  
+
 if (gRPC_INSTALL)
   install(TARGETS gpr EXPORT gRPCTargets
     RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
@@ -289,7 +372,30 @@
   )
 endif()
 
-  
+if (gRPC_BUILD_TESTS)
+
+add_library(gpr_test_util
+  test/core/util/test_config.c
+)
+
+
+target_include_directories(gpr_test_util
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(gpr_test_util
+  gpr
+)
+
+
+endif (gRPC_BUILD_TESTS)
+
 add_library(grpc
   src/core/lib/surface/init.c
   src/core/lib/channel/channel_args.c
@@ -465,6 +571,7 @@
   src/core/ext/client_channel/connector.c
   src/core/ext/client_channel/default_initial_connect_string.c
   src/core/ext/client_channel/http_connect_handshaker.c
+  src/core/ext/client_channel/http_proxy.c
   src/core/ext/client_channel/initial_connect_string.c
   src/core/ext/client_channel/lb_policy.c
   src/core/ext/client_channel/lb_policy_factory.c
@@ -512,6 +619,7 @@
   src/core/plugin_registry/grpc_plugin_registry.c
 )
 
+
 target_include_directories(grpc
   PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
   PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
@@ -519,6 +627,7 @@
   PRIVATE ${PROTOBUF_ROOT_DIR}/src
   PRIVATE ${ZLIB_INCLUDE_DIR}
   PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
 )
 
 target_link_libraries(grpc
@@ -567,7 +676,7 @@
   )
 endforeach()
 
-  
+
 if (gRPC_INSTALL)
   install(TARGETS grpc EXPORT gRPCTargets
     RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
@@ -576,7 +685,7 @@
   )
 endif()
 
-  
+
 add_library(grpc_cronet
   src/core/lib/surface/init.c
   src/core/lib/channel/channel_args.c
@@ -726,6 +835,7 @@
   src/core/ext/client_channel/connector.c
   src/core/ext/client_channel/default_initial_connect_string.c
   src/core/ext/client_channel/http_connect_handshaker.c
+  src/core/ext/client_channel/http_proxy.c
   src/core/ext/client_channel/initial_connect_string.c
   src/core/ext/client_channel/lb_policy.c
   src/core/ext/client_channel/lb_policy_factory.c
@@ -770,6 +880,7 @@
   src/core/plugin_registry/grpc_cronet_plugin_registry.c
 )
 
+
 target_include_directories(grpc_cronet
   PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
   PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
@@ -777,6 +888,7 @@
   PRIVATE ${PROTOBUF_ROOT_DIR}/src
   PRIVATE ${ZLIB_INCLUDE_DIR}
   PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
 )
 
 target_link_libraries(grpc_cronet
@@ -824,7 +936,7 @@
   )
 endforeach()
 
-  
+
 if (gRPC_INSTALL)
   install(TARGETS grpc_cronet EXPORT gRPCTargets
     RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
@@ -833,7 +945,241 @@
   )
 endif()
 
-  
+if (gRPC_BUILD_TESTS)
+
+add_library(grpc_test_util
+  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
+  test/core/end2end/cq_verifier.c
+  test/core/end2end/fake_resolver.c
+  test/core/end2end/fixtures/http_proxy.c
+  test/core/end2end/fixtures/proxy.c
+  test/core/iomgr/endpoint_tests.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_posix.c
+  test/core/util/port_server_client.c
+  test/core/util/port_uv.c
+  test/core/util/port_windows.c
+  test/core/util/slice_splitter.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/compress_filter.c
+  src/core/lib/channel/connected_channel.c
+  src/core/lib/channel/deadline_filter.c
+  src/core/lib/channel/handshaker.c
+  src/core/lib/channel/handshaker_factory.c
+  src/core/lib/channel/handshaker_registry.c
+  src/core/lib/channel/http_client_filter.c
+  src/core/lib/channel/http_server_filter.c
+  src/core/lib/channel/message_size_filter.c
+  src/core/lib/compression/compression.c
+  src/core/lib/compression/message_compress.c
+  src/core/lib/debug/trace.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_epoll_linux.c
+  src/core/lib/iomgr/ev_poll_posix.c
+  src/core/lib/iomgr/ev_posix.c
+  src/core/lib/iomgr/exec_ctx.c
+  src/core/lib/iomgr/executor.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/load_file.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_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_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_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/iomgr/workqueue_uv.c
+  src/core/lib/iomgr/workqueue_windows.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/percent_encoding.c
+  src/core/lib/slice/slice.c
+  src/core/lib/slice/slice_buffer.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/event_string.c
+  src/core/lib/surface/lame_client.c
+  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/byte_stream.c
+  src/core/lib/transport/connectivity_state.c
+  src/core/lib/transport/mdstr_hash_table.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/timeout_encoding.c
+  src/core/lib/transport/transport.c
+  src/core/lib/transport/transport_op_string.c
+)
+
+
+target_include_directories(grpc_test_util
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(grpc_test_util
+  gpr_test_util
+  gpr
+  grpc
+)
+
+foreach(_hdr
+  include/grpc/byte_buffer.h
+  include/grpc/byte_buffer_reader.h
+  include/grpc/compression.h
+  include/grpc/grpc.h
+  include/grpc/grpc_posix.h
+  include/grpc/grpc_security_constants.h
+  include/grpc/slice.h
+  include/grpc/slice_buffer.h
+  include/grpc/status.h
+  include/grpc/impl/codegen/byte_buffer_reader.h
+  include/grpc/impl/codegen/compression_types.h
+  include/grpc/impl/codegen/connectivity_state.h
+  include/grpc/impl/codegen/exec_ctx_fwd.h
+  include/grpc/impl/codegen/grpc_types.h
+  include/grpc/impl/codegen/propagation_bits.h
+  include/grpc/impl/codegen/status.h
+  include/grpc/impl/codegen/atm.h
+  include/grpc/impl/codegen/atm_gcc_atomic.h
+  include/grpc/impl/codegen/atm_gcc_sync.h
+  include/grpc/impl/codegen/atm_windows.h
+  include/grpc/impl/codegen/gpr_slice.h
+  include/grpc/impl/codegen/gpr_types.h
+  include/grpc/impl/codegen/port_platform.h
+  include/grpc/impl/codegen/slice.h
+  include/grpc/impl/codegen/sync.h
+  include/grpc/impl/codegen/sync_generic.h
+  include/grpc/impl/codegen/sync_posix.h
+  include/grpc/impl/codegen/sync_windows.h
+)
+  string(REPLACE "include/" "" _path ${_hdr})
+  get_filename_component(_path ${_path} PATH)
+  install(FILES ${_hdr}
+    DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${_path}"
+  )
+endforeach()
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(grpc_test_util_unsecure
+  test/core/end2end/cq_verifier.c
+  test/core/end2end/fake_resolver.c
+  test/core/end2end/fixtures/http_proxy.c
+  test/core/end2end/fixtures/proxy.c
+  test/core/iomgr/endpoint_tests.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_posix.c
+  test/core/util/port_server_client.c
+  test/core/util/port_uv.c
+  test/core/util/port_windows.c
+  test/core/util/slice_splitter.c
+)
+
+
+target_include_directories(grpc_test_util_unsecure
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(grpc_test_util_unsecure
+  gpr
+  gpr_test_util
+  grpc_unsecure
+  grpc
+)
+
+
+endif (gRPC_BUILD_TESTS)
+
 add_library(grpc_unsecure
   src/core/lib/surface/init.c
   src/core/lib/surface/init_unsecure.c
@@ -986,6 +1332,7 @@
   src/core/ext/client_channel/connector.c
   src/core/ext/client_channel/default_initial_connect_string.c
   src/core/ext/client_channel/http_connect_handshaker.c
+  src/core/ext/client_channel/http_proxy.c
   src/core/ext/client_channel/initial_connect_string.c
   src/core/ext/client_channel/lb_policy.c
   src/core/ext/client_channel/lb_policy_factory.c
@@ -1028,6 +1375,7 @@
   src/core/plugin_registry/grpc_unsecure_plugin_registry.c
 )
 
+
 target_include_directories(grpc_unsecure
   PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
   PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
@@ -1035,6 +1383,7 @@
   PRIVATE ${PROTOBUF_ROOT_DIR}/src
   PRIVATE ${ZLIB_INCLUDE_DIR}
   PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
 )
 
 target_link_libraries(grpc_unsecure
@@ -1080,7 +1429,7 @@
   )
 endforeach()
 
-  
+
 if (gRPC_INSTALL)
   install(TARGETS grpc_unsecure EXPORT gRPCTargets
     RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
@@ -1089,7 +1438,60 @@
   )
 endif()
 
-  
+if (gRPC_BUILD_TESTS)
+
+add_library(reconnect_server
+  test/core/util/reconnect_server.c
+)
+
+
+target_include_directories(reconnect_server
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(reconnect_server
+  test_tcp_server
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(test_tcp_server
+  test/core/util/test_tcp_server.c
+)
+
+
+target_include_directories(test_tcp_server
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(test_tcp_server
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+
+endif (gRPC_BUILD_TESTS)
+
 add_library(grpc++
   src/cpp/client/insecure_credentials.cc
   src/cpp/client/secure_credentials.cc
@@ -1130,6 +1532,7 @@
   src/cpp/codegen/codegen_init.cc
 )
 
+
 target_include_directories(grpc++
   PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
   PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
@@ -1137,6 +1540,7 @@
   PRIVATE ${PROTOBUF_ROOT_DIR}/src
   PRIVATE ${ZLIB_INCLUDE_DIR}
   PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
 )
 
 target_link_libraries(grpc++
@@ -1244,7 +1648,7 @@
   )
 endforeach()
 
-  
+
 if (gRPC_INSTALL)
   install(TARGETS grpc++ EXPORT gRPCTargets
     RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
@@ -1253,7 +1657,7 @@
   )
 endif()
 
-  
+
 add_library(grpc++_cronet
   src/cpp/client/cronet_credentials.cc
   src/cpp/client/insecure_credentials.cc
@@ -1434,6 +1838,7 @@
   src/core/ext/client_channel/connector.c
   src/core/ext/client_channel/default_initial_connect_string.c
   src/core/ext/client_channel/http_connect_handshaker.c
+  src/core/ext/client_channel/http_proxy.c
   src/core/ext/client_channel/initial_connect_string.c
   src/core/ext/client_channel/lb_policy.c
   src/core/ext/client_channel/lb_policy_factory.c
@@ -1469,6 +1874,7 @@
   third_party/nanopb/pb_encode.c
 )
 
+
 target_include_directories(grpc++_cronet
   PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
   PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
@@ -1476,6 +1882,7 @@
   PRIVATE ${PROTOBUF_ROOT_DIR}/src
   PRIVATE ${ZLIB_INCLUDE_DIR}
   PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
 )
 
 target_link_libraries(grpc++_cronet
@@ -1593,7 +2000,7 @@
   )
 endforeach()
 
-  
+
 if (gRPC_INSTALL)
   install(TARGETS grpc++_cronet EXPORT gRPCTargets
     RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
@@ -1602,7 +2009,257 @@
   )
 endif()
 
-  
+if (gRPC_BUILD_TESTS)
+
+add_library(grpc++_proto_reflection_desc_db
+  test/cpp/util/proto_reflection_descriptor_database.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/reflection/v1alpha/reflection.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/reflection/v1alpha/reflection.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.h
+)
+
+protobuf_generate_grpc_cpp(
+  src/proto/grpc/reflection/v1alpha/reflection.proto
+)
+
+target_include_directories(grpc++_proto_reflection_desc_db
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+  PRIVATE ${_gRPC_PROTO_GENS_DIR}
+)
+
+target_link_libraries(grpc++_proto_reflection_desc_db
+  grpc++
+)
+
+foreach(_hdr
+  include/grpc++/impl/codegen/config_protobuf.h
+)
+  string(REPLACE "include/" "" _path ${_hdr})
+  get_filename_component(_path ${_path} PATH)
+  install(FILES ${_hdr}
+    DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${_path}"
+  )
+endforeach()
+
+endif (gRPC_BUILD_TESTS)
+
+add_library(grpc++_reflection
+  src/cpp/ext/proto_server_reflection.cc
+  src/cpp/ext/proto_server_reflection_plugin.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/reflection/v1alpha/reflection.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/reflection/v1alpha/reflection.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.h
+)
+
+protobuf_generate_grpc_cpp(
+  src/proto/grpc/reflection/v1alpha/reflection.proto
+)
+
+target_include_directories(grpc++_reflection
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE ${_gRPC_PROTO_GENS_DIR}
+)
+
+target_link_libraries(grpc++_reflection
+  grpc++
+)
+
+foreach(_hdr
+  include/grpc++/ext/proto_server_reflection_plugin.h
+)
+  string(REPLACE "include/" "" _path ${_hdr})
+  get_filename_component(_path ${_path} PATH)
+  install(FILES ${_hdr}
+    DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${_path}"
+  )
+endforeach()
+
+
+if (gRPC_INSTALL)
+  install(TARGETS grpc++_reflection EXPORT gRPCTargets
+    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+  )
+endif()
+
+if (gRPC_BUILD_TESTS)
+
+add_library(grpc++_test
+  src/cpp/test/server_context_test_spouse.cc
+)
+
+
+target_include_directories(grpc++_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(grpc++_test
+  grpc++
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(grpc++_test_config
+  test/cpp/util/test_config_cc.cc
+)
+
+
+target_include_directories(grpc++_test_config
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(grpc++_test_util
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h
+  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
+)
+
+protobuf_generate_grpc_cpp(
+  src/proto/grpc/testing/echo_messages.proto
+)
+protobuf_generate_grpc_cpp(
+  src/proto/grpc/testing/echo.proto
+)
+protobuf_generate_grpc_cpp(
+  src/proto/grpc/testing/duplicate/echo_duplicate.proto
+)
+
+target_include_directories(grpc++_test_util
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+  PRIVATE ${_gRPC_PROTO_GENS_DIR}
+)
+
+target_link_libraries(grpc++_test_util
+  grpc++
+  grpc_test_util
+)
+
+foreach(_hdr
+  include/grpc++/impl/codegen/async_stream.h
+  include/grpc++/impl/codegen/async_unary_call.h
+  include/grpc++/impl/codegen/call.h
+  include/grpc++/impl/codegen/call_hook.h
+  include/grpc++/impl/codegen/channel_interface.h
+  include/grpc++/impl/codegen/client_context.h
+  include/grpc++/impl/codegen/client_unary_call.h
+  include/grpc++/impl/codegen/completion_queue.h
+  include/grpc++/impl/codegen/completion_queue_tag.h
+  include/grpc++/impl/codegen/config.h
+  include/grpc++/impl/codegen/core_codegen_interface.h
+  include/grpc++/impl/codegen/create_auth_context.h
+  include/grpc++/impl/codegen/grpc_library.h
+  include/grpc++/impl/codegen/method_handler_impl.h
+  include/grpc++/impl/codegen/rpc_method.h
+  include/grpc++/impl/codegen/rpc_service_method.h
+  include/grpc++/impl/codegen/security/auth_context.h
+  include/grpc++/impl/codegen/serialization_traits.h
+  include/grpc++/impl/codegen/server_context.h
+  include/grpc++/impl/codegen/server_interface.h
+  include/grpc++/impl/codegen/service_type.h
+  include/grpc++/impl/codegen/status.h
+  include/grpc++/impl/codegen/status_code_enum.h
+  include/grpc++/impl/codegen/status_helper.h
+  include/grpc++/impl/codegen/string_ref.h
+  include/grpc++/impl/codegen/stub_options.h
+  include/grpc++/impl/codegen/sync_stream.h
+  include/grpc++/impl/codegen/time.h
+  include/grpc/impl/codegen/byte_buffer_reader.h
+  include/grpc/impl/codegen/compression_types.h
+  include/grpc/impl/codegen/connectivity_state.h
+  include/grpc/impl/codegen/exec_ctx_fwd.h
+  include/grpc/impl/codegen/grpc_types.h
+  include/grpc/impl/codegen/propagation_bits.h
+  include/grpc/impl/codegen/status.h
+  include/grpc/impl/codegen/atm.h
+  include/grpc/impl/codegen/atm_gcc_atomic.h
+  include/grpc/impl/codegen/atm_gcc_sync.h
+  include/grpc/impl/codegen/atm_windows.h
+  include/grpc/impl/codegen/gpr_slice.h
+  include/grpc/impl/codegen/gpr_types.h
+  include/grpc/impl/codegen/port_platform.h
+  include/grpc/impl/codegen/slice.h
+  include/grpc/impl/codegen/sync.h
+  include/grpc/impl/codegen/sync_generic.h
+  include/grpc/impl/codegen/sync_posix.h
+  include/grpc/impl/codegen/sync_windows.h
+  include/grpc++/impl/codegen/proto_utils.h
+  include/grpc++/impl/codegen/config_protobuf.h
+  include/grpc++/impl/codegen/thrift_serializer.h
+  include/grpc++/impl/codegen/thrift_utils.h
+)
+  string(REPLACE "include/" "" _path ${_hdr})
+  get_filename_component(_path ${_path} PATH)
+  install(FILES ${_hdr}
+    DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${_path}"
+  )
+endforeach()
+
+endif (gRPC_BUILD_TESTS)
+
 add_library(grpc++_unsecure
   src/cpp/client/insecure_credentials.cc
   src/cpp/common/insecure_create_auth_context.cc
@@ -1638,6 +2295,7 @@
   src/cpp/codegen/codegen_init.cc
 )
 
+
 target_include_directories(grpc++_unsecure
   PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
   PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
@@ -1645,6 +2303,7 @@
   PRIVATE ${PROTOBUF_ROOT_DIR}/src
   PRIVATE ${ZLIB_INCLUDE_DIR}
   PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
 )
 
 target_link_libraries(grpc++_unsecure
@@ -1752,7 +2411,7 @@
   )
 endforeach()
 
-  
+
 if (gRPC_INSTALL)
   install(TARGETS grpc++_unsecure EXPORT gRPCTargets
     RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
@@ -1761,7 +2420,54 @@
   )
 endif()
 
-  
+if (gRPC_BUILD_TESTS)
+
+add_library(grpc_cli_libs
+  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
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/reflection/v1alpha/reflection.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/reflection/v1alpha/reflection.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.h
+)
+
+protobuf_generate_grpc_cpp(
+  src/proto/grpc/reflection/v1alpha/reflection.proto
+)
+
+target_include_directories(grpc_cli_libs
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+  PRIVATE ${_gRPC_PROTO_GENS_DIR}
+)
+
+target_link_libraries(grpc_cli_libs
+  grpc++_proto_reflection_desc_db
+  grpc++
+)
+
+foreach(_hdr
+  include/grpc++/impl/codegen/config_protobuf.h
+)
+  string(REPLACE "include/" "" _path ${_hdr})
+  get_filename_component(_path ${_path} PATH)
+  install(FILES ${_hdr}
+    DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${_path}"
+  )
+endforeach()
+
+endif (gRPC_BUILD_TESTS)
+
 add_library(grpc_plugin_support
   src/compiler/cpp_generator.cc
   src/compiler/csharp_generator.cc
@@ -1772,6 +2478,7 @@
   src/compiler/ruby_generator.cc
 )
 
+
 target_include_directories(grpc_plugin_support
   PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
   PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
@@ -1779,6 +2486,7 @@
   PRIVATE ${PROTOBUF_ROOT_DIR}/src
   PRIVATE ${ZLIB_INCLUDE_DIR}
   PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
 )
 
 target_link_libraries(grpc_plugin_support
@@ -1795,7 +2503,7 @@
   )
 endforeach()
 
-  
+
 if (gRPC_INSTALL)
   install(TARGETS grpc_plugin_support EXPORT gRPCTargets
     RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
@@ -1804,7 +2512,2898 @@
   )
 endif()
 
+if (gRPC_BUILD_TESTS)
 
+add_library(http2_client_main
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.grpc.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.grpc.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.grpc.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.grpc.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.grpc.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.grpc.pb.h
+  test/cpp/interop/http2_client.cc
+)
+
+protobuf_generate_grpc_cpp(
+  src/proto/grpc/testing/empty.proto
+)
+protobuf_generate_grpc_cpp(
+  src/proto/grpc/testing/messages.proto
+)
+protobuf_generate_grpc_cpp(
+  src/proto/grpc/testing/test.proto
+)
+
+target_include_directories(http2_client_main
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+  PRIVATE ${_gRPC_PROTO_GENS_DIR}
+)
+
+target_link_libraries(http2_client_main
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  grpc++_test_config
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(interop_client_helper
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.grpc.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.grpc.pb.h
+  test/cpp/interop/client_helper.cc
+)
+
+protobuf_generate_grpc_cpp(
+  src/proto/grpc/testing/messages.proto
+)
+
+target_include_directories(interop_client_helper
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+  PRIVATE ${_gRPC_PROTO_GENS_DIR}
+)
+
+target_link_libraries(interop_client_helper
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(interop_client_main
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.grpc.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.grpc.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.grpc.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.grpc.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.grpc.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.grpc.pb.h
+  test/cpp/interop/client.cc
+  test/cpp/interop/interop_client.cc
+)
+
+protobuf_generate_grpc_cpp(
+  src/proto/grpc/testing/empty.proto
+)
+protobuf_generate_grpc_cpp(
+  src/proto/grpc/testing/messages.proto
+)
+protobuf_generate_grpc_cpp(
+  src/proto/grpc/testing/test.proto
+)
+
+target_include_directories(interop_client_main
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+  PRIVATE ${_gRPC_PROTO_GENS_DIR}
+)
+
+target_link_libraries(interop_client_main
+  interop_client_helper
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  grpc++_test_config
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(interop_server_helper
+  test/cpp/interop/server_helper.cc
+)
+
+
+target_include_directories(interop_server_helper
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(interop_server_helper
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(interop_server_lib
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.grpc.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.grpc.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.grpc.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.grpc.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.grpc.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.grpc.pb.h
+  test/cpp/interop/interop_server.cc
+)
+
+protobuf_generate_grpc_cpp(
+  src/proto/grpc/testing/empty.proto
+)
+protobuf_generate_grpc_cpp(
+  src/proto/grpc/testing/messages.proto
+)
+protobuf_generate_grpc_cpp(
+  src/proto/grpc/testing/test.proto
+)
+
+target_include_directories(interop_server_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+  PRIVATE ${_gRPC_PROTO_GENS_DIR}
+)
+
+target_link_libraries(interop_server_lib
+  interop_server_helper
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  grpc++_test_config
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(interop_server_main
+  test/cpp/interop/interop_server_bootstrap.cc
+)
+
+
+target_include_directories(interop_server_main
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(interop_server_main
+  interop_server_lib
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(qps
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.grpc.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.grpc.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/payloads.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/payloads.grpc.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/payloads.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/payloads.grpc.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/stats.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/stats.grpc.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/stats.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/stats.grpc.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/control.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/control.grpc.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/control.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/control.grpc.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/services.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/services.grpc.pb.cc
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/services.pb.h
+  ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/services.grpc.pb.h
+  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
+  test/cpp/util/benchmark_config.cc
+)
+
+protobuf_generate_grpc_cpp(
+  src/proto/grpc/testing/messages.proto
+)
+protobuf_generate_grpc_cpp(
+  src/proto/grpc/testing/payloads.proto
+)
+protobuf_generate_grpc_cpp(
+  src/proto/grpc/testing/stats.proto
+)
+protobuf_generate_grpc_cpp(
+  src/proto/grpc/testing/control.proto
+)
+protobuf_generate_grpc_cpp(
+  src/proto/grpc/testing/services.proto
+)
+
+target_include_directories(qps
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+  PRIVATE ${_gRPC_PROTO_GENS_DIR}
+)
+
+target_link_libraries(qps
+  grpc_test_util
+  grpc++_test_util
+  grpc++
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl
+  src/boringssl/err_data.c
+  third_party/boringssl/crypto/aes/aes.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/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/buffer.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/newhope/error_correction.c
+  third_party/boringssl/crypto/newhope/newhope.c
+  third_party/boringssl/crypto/newhope/ntt.c
+  third_party/boringssl/crypto/newhope/poly.c
+  third_party/boringssl/crypto/newhope/precomp.c
+  third_party/boringssl/crypto/newhope/reduce.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_pbe.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/rand/deterministic.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.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/time_support.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/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_enc.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_rsa.c
+  third_party/boringssl/ssl/ssl_session.c
+  third_party/boringssl/ssl/ssl_stat.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_include_directories(boringssl
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(boringssl
+  ${_gRPC_SSL_LIBRARIES}
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_test_util
+  third_party/boringssl/crypto/test/file_test.cc
+  third_party/boringssl/crypto/test/malloc.cc
+  third_party/boringssl/crypto/test/test_util.cc
+)
+
+
+target_include_directories(boringssl_test_util
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_test_util
+  ${_gRPC_SSL_LIBRARIES}
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_aes_test_lib
+  third_party/boringssl/crypto/aes/aes_test.cc
+)
+
+
+target_include_directories(boringssl_aes_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_aes_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_asn1_test_lib
+  third_party/boringssl/crypto/asn1/asn1_test.cc
+)
+
+
+target_include_directories(boringssl_asn1_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_asn1_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_base64_test_lib
+  third_party/boringssl/crypto/base64/base64_test.cc
+)
+
+
+target_include_directories(boringssl_base64_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_base64_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_bio_test_lib
+  third_party/boringssl/crypto/bio/bio_test.cc
+)
+
+
+target_include_directories(boringssl_bio_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_bio_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_bn_test_lib
+  third_party/boringssl/crypto/bn/bn_test.cc
+)
+
+
+target_include_directories(boringssl_bn_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_bn_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_bytestring_test_lib
+  third_party/boringssl/crypto/bytestring/bytestring_test.cc
+)
+
+
+target_include_directories(boringssl_bytestring_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_bytestring_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_chacha_test_lib
+  third_party/boringssl/crypto/chacha/chacha_test.cc
+)
+
+
+target_include_directories(boringssl_chacha_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_chacha_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_aead_test_lib
+  third_party/boringssl/crypto/cipher/aead_test.cc
+)
+
+
+target_include_directories(boringssl_aead_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_aead_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_cipher_test_lib
+  third_party/boringssl/crypto/cipher/cipher_test.cc
+)
+
+
+target_include_directories(boringssl_cipher_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_cipher_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_cmac_test_lib
+  third_party/boringssl/crypto/cmac/cmac_test.cc
+)
+
+
+target_include_directories(boringssl_cmac_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_cmac_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_constant_time_test_lib
+  third_party/boringssl/crypto/constant_time_test.c
+)
+
+
+target_include_directories(boringssl_constant_time_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(boringssl_constant_time_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_ed25519_test_lib
+  third_party/boringssl/crypto/curve25519/ed25519_test.cc
+)
+
+
+target_include_directories(boringssl_ed25519_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_ed25519_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_spake25519_test_lib
+  third_party/boringssl/crypto/curve25519/spake25519_test.cc
+)
+
+
+target_include_directories(boringssl_spake25519_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_spake25519_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_x25519_test_lib
+  third_party/boringssl/crypto/curve25519/x25519_test.cc
+)
+
+
+target_include_directories(boringssl_x25519_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_x25519_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_dh_test_lib
+  third_party/boringssl/crypto/dh/dh_test.cc
+)
+
+
+target_include_directories(boringssl_dh_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_dh_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_digest_test_lib
+  third_party/boringssl/crypto/digest/digest_test.cc
+)
+
+
+target_include_directories(boringssl_digest_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_digest_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_dsa_test_lib
+  third_party/boringssl/crypto/dsa/dsa_test.c
+)
+
+
+target_include_directories(boringssl_dsa_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(boringssl_dsa_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_ec_test_lib
+  third_party/boringssl/crypto/ec/ec_test.cc
+)
+
+
+target_include_directories(boringssl_ec_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_ec_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_example_mul_lib
+  third_party/boringssl/crypto/ec/example_mul.c
+)
+
+
+target_include_directories(boringssl_example_mul_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(boringssl_example_mul_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_ecdh_test_lib
+  third_party/boringssl/crypto/ecdh/ecdh_test.cc
+)
+
+
+target_include_directories(boringssl_ecdh_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_ecdh_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_ecdsa_sign_test_lib
+  third_party/boringssl/crypto/ecdsa/ecdsa_sign_test.cc
+)
+
+
+target_include_directories(boringssl_ecdsa_sign_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_ecdsa_sign_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_ecdsa_test_lib
+  third_party/boringssl/crypto/ecdsa/ecdsa_test.cc
+)
+
+
+target_include_directories(boringssl_ecdsa_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_ecdsa_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_ecdsa_verify_test_lib
+  third_party/boringssl/crypto/ecdsa/ecdsa_verify_test.cc
+)
+
+
+target_include_directories(boringssl_ecdsa_verify_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_ecdsa_verify_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_err_test_lib
+  third_party/boringssl/crypto/err/err_test.cc
+)
+
+
+target_include_directories(boringssl_err_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_err_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_evp_extra_test_lib
+  third_party/boringssl/crypto/evp/evp_extra_test.cc
+)
+
+
+target_include_directories(boringssl_evp_extra_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_evp_extra_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_evp_test_lib
+  third_party/boringssl/crypto/evp/evp_test.cc
+)
+
+
+target_include_directories(boringssl_evp_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_evp_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_pbkdf_test_lib
+  third_party/boringssl/crypto/evp/pbkdf_test.cc
+)
+
+
+target_include_directories(boringssl_pbkdf_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_pbkdf_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_hkdf_test_lib
+  third_party/boringssl/crypto/hkdf/hkdf_test.c
+)
+
+
+target_include_directories(boringssl_hkdf_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(boringssl_hkdf_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_hmac_test_lib
+  third_party/boringssl/crypto/hmac/hmac_test.cc
+)
+
+
+target_include_directories(boringssl_hmac_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_hmac_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_lhash_test_lib
+  third_party/boringssl/crypto/lhash/lhash_test.c
+)
+
+
+target_include_directories(boringssl_lhash_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(boringssl_lhash_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_gcm_test_lib
+  third_party/boringssl/crypto/modes/gcm_test.cc
+)
+
+
+target_include_directories(boringssl_gcm_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_gcm_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_newhope_statistical_test_lib
+  third_party/boringssl/crypto/newhope/newhope_statistical_test.cc
+)
+
+
+target_include_directories(boringssl_newhope_statistical_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_newhope_statistical_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_newhope_test_lib
+  third_party/boringssl/crypto/newhope/newhope_test.cc
+)
+
+
+target_include_directories(boringssl_newhope_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_newhope_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_newhope_vectors_test_lib
+  third_party/boringssl/crypto/newhope/newhope_vectors_test.cc
+)
+
+
+target_include_directories(boringssl_newhope_vectors_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_newhope_vectors_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_obj_test_lib
+  third_party/boringssl/crypto/obj/obj_test.cc
+)
+
+
+target_include_directories(boringssl_obj_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_obj_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_pkcs12_test_lib
+  third_party/boringssl/crypto/pkcs8/pkcs12_test.cc
+)
+
+
+target_include_directories(boringssl_pkcs12_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_pkcs12_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_pkcs8_test_lib
+  third_party/boringssl/crypto/pkcs8/pkcs8_test.cc
+)
+
+
+target_include_directories(boringssl_pkcs8_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_pkcs8_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_poly1305_test_lib
+  third_party/boringssl/crypto/poly1305/poly1305_test.cc
+)
+
+
+target_include_directories(boringssl_poly1305_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_poly1305_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_refcount_test_lib
+  third_party/boringssl/crypto/refcount_test.c
+)
+
+
+target_include_directories(boringssl_refcount_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(boringssl_refcount_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_rsa_test_lib
+  third_party/boringssl/crypto/rsa/rsa_test.cc
+)
+
+
+target_include_directories(boringssl_rsa_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_rsa_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_thread_test_lib
+  third_party/boringssl/crypto/thread_test.c
+)
+
+
+target_include_directories(boringssl_thread_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(boringssl_thread_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_pkcs7_test_lib
+  third_party/boringssl/crypto/x509/pkcs7_test.c
+)
+
+
+target_include_directories(boringssl_pkcs7_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(boringssl_pkcs7_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_x509_test_lib
+  third_party/boringssl/crypto/x509/x509_test.cc
+)
+
+
+target_include_directories(boringssl_x509_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_x509_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_tab_test_lib
+  third_party/boringssl/crypto/x509v3/tab_test.c
+)
+
+
+target_include_directories(boringssl_tab_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(boringssl_tab_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_v3name_test_lib
+  third_party/boringssl/crypto/x509v3/v3name_test.c
+)
+
+
+target_include_directories(boringssl_v3name_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(boringssl_v3name_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(boringssl_ssl_test_lib
+  third_party/boringssl/ssl/ssl_test.cc
+)
+
+
+target_include_directories(boringssl_ssl_test_lib
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_ssl_test_lib
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_test_util
+  boringssl
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(benchmark
+  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_include_directories(benchmark
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(benchmark
+  ${_gRPC_SSL_LIBRARIES}
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(z
+  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_include_directories(z
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(z
+  ${_gRPC_SSL_LIBRARIES}
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(bad_client_test
+  test/core/bad_client/bad_client.c
+)
+
+
+target_include_directories(bad_client_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(bad_client_test
+  grpc_test_util_unsecure
+  grpc_unsecure
+  gpr_test_util
+  gpr
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(bad_ssl_test_server
+  test/core/bad_ssl/server_common.c
+)
+
+
+target_include_directories(bad_ssl_test_server
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(bad_ssl_test_server
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(end2end_tests
+  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/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_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/large_metadata.c
+  test/core/end2end/tests/load_reporting_hook.c
+  test/core/end2end/tests/max_concurrent_streams.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/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/write_buffering.c
+  test/core/end2end/tests/write_buffering_at_end.c
+)
+
+
+target_include_directories(end2end_tests
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(end2end_tests
+  ${_gRPC_SSL_LIBRARIES}
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_library(end2end_nosec_tests
+  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/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_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/large_metadata.c
+  test/core/end2end/tests/load_reporting_hook.c
+  test/core/end2end/tests/max_concurrent_streams.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/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/write_buffering.c
+  test/core/end2end/tests/write_buffering_at_end.c
+)
+
+
+target_include_directories(end2end_nosec_tests
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_INCLUDE_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(end2end_nosec_tests
+  grpc_test_util_unsecure
+  grpc_unsecure
+  gpr_test_util
+  gpr
+)
+
+
+endif (gRPC_BUILD_TESTS)
+
+if (gRPC_BUILD_TESTS)
+
+add_executable(alarm_test
+  test/core/surface/alarm_test.c
+)
+
+target_include_directories(alarm_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(alarm_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(algorithm_test
+  test/core/compression/algorithm_test.c
+)
+
+target_include_directories(algorithm_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(algorithm_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(alloc_test
+  test/core/support/alloc_test.c
+)
+
+target_include_directories(alloc_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(alloc_test
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(alpn_test
+  test/core/transport/chttp2/alpn_test.c
+)
+
+target_include_directories(alpn_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(alpn_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(bad_server_response_test
+  test/core/end2end/bad_server_response_test.c
+)
+
+target_include_directories(bad_server_response_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(bad_server_response_test
+  test_tcp_server
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(bin_decoder_test
+  test/core/transport/chttp2/bin_decoder_test.c
+)
+
+target_include_directories(bin_decoder_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(bin_decoder_test
+  grpc_test_util
+  grpc
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(bin_encoder_test
+  test/core/transport/chttp2/bin_encoder_test.c
+)
+
+target_include_directories(bin_encoder_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(bin_encoder_test
+  grpc_test_util
+  grpc
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(census_context_test
+  test/core/census/context_test.c
+)
+
+target_include_directories(census_context_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(census_context_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(census_resource_test
+  test/core/census/resource_test.c
+)
+
+target_include_directories(census_resource_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(census_resource_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(census_trace_context_test
+  test/core/census/trace_context_test.c
+)
+
+target_include_directories(census_trace_context_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(census_trace_context_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(channel_create_test
+  test/core/surface/channel_create_test.c
+)
+
+target_include_directories(channel_create_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(channel_create_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(chttp2_hpack_encoder_test
+  test/core/transport/chttp2/hpack_encoder_test.c
+)
+
+target_include_directories(chttp2_hpack_encoder_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(chttp2_hpack_encoder_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(chttp2_status_conversion_test
+  test/core/transport/chttp2/status_conversion_test.c
+)
+
+target_include_directories(chttp2_status_conversion_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(chttp2_status_conversion_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(chttp2_stream_map_test
+  test/core/transport/chttp2/stream_map_test.c
+)
+
+target_include_directories(chttp2_stream_map_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(chttp2_stream_map_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(chttp2_varint_test
+  test/core/transport/chttp2/varint_test.c
+)
+
+target_include_directories(chttp2_varint_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(chttp2_varint_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(combiner_test
+  test/core/iomgr/combiner_test.c
+)
+
+target_include_directories(combiner_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(combiner_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(compression_test
+  test/core/compression/compression_test.c
+)
+
+target_include_directories(compression_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(compression_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(concurrent_connectivity_test
+  test/core/surface/concurrent_connectivity_test.c
+)
+
+target_include_directories(concurrent_connectivity_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(concurrent_connectivity_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(connection_refused_test
+  test/core/end2end/connection_refused_test.c
+)
+
+target_include_directories(connection_refused_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(connection_refused_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(dns_resolver_connectivity_test
+  test/core/client_channel/resolvers/dns_resolver_connectivity_test.c
+)
+
+target_include_directories(dns_resolver_connectivity_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(dns_resolver_connectivity_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(dns_resolver_test
+  test/core/client_channel/resolvers/dns_resolver_test.c
+)
+
+target_include_directories(dns_resolver_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(dns_resolver_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(dualstack_socket_test
+  test/core/end2end/dualstack_socket_test.c
+)
+
+target_include_directories(dualstack_socket_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(dualstack_socket_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(endpoint_pair_test
+  test/core/iomgr/endpoint_pair_test.c
+)
+
+target_include_directories(endpoint_pair_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(endpoint_pair_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(ev_epoll_linux_test
+  test/core/iomgr/ev_epoll_linux_test.c
+)
+
+target_include_directories(ev_epoll_linux_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(ev_epoll_linux_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(fd_conservation_posix_test
+  test/core/iomgr/fd_conservation_posix_test.c
+)
+
+target_include_directories(fd_conservation_posix_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(fd_conservation_posix_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(fd_posix_test
+  test/core/iomgr/fd_posix_test.c
+)
+
+target_include_directories(fd_posix_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(fd_posix_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(fling_client
+  test/core/fling/client.c
+)
+
+target_include_directories(fling_client
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(fling_client
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(fling_server
+  test/core/fling/server.c
+)
+
+target_include_directories(fling_server
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(fling_server
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(fling_stream_test
+  test/core/fling/fling_stream_test.c
+)
+
+target_include_directories(fling_stream_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(fling_stream_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(fling_test
+  test/core/fling/fling_test.c
+)
+
+target_include_directories(fling_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(fling_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
 
 add_executable(gen_hpack_tables
   tools/codegen/core/gen_hpack_tables.c
@@ -1817,6 +5416,7 @@
   PRIVATE ${PROTOBUF_ROOT_DIR}/src
   PRIVATE ${ZLIB_ROOT_DIR}
   PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
 )
 
 target_link_libraries(gen_hpack_tables
@@ -1845,6 +5445,7 @@
   PRIVATE ${PROTOBUF_ROOT_DIR}/src
   PRIVATE ${ZLIB_ROOT_DIR}
   PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
 )
 
 
@@ -1869,6 +5470,7 @@
   PRIVATE ${PROTOBUF_ROOT_DIR}/src
   PRIVATE ${ZLIB_ROOT_DIR}
   PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
 )
 
 
@@ -1881,6 +5483,526 @@
   )
 endif()
 
+if (gRPC_BUILD_TESTS)
+
+add_executable(goaway_server_test
+  test/core/end2end/goaway_server_test.c
+)
+
+target_include_directories(goaway_server_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(goaway_server_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(gpr_avl_test
+  test/core/support/avl_test.c
+)
+
+target_include_directories(gpr_avl_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(gpr_avl_test
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(gpr_backoff_test
+  test/core/support/backoff_test.c
+)
+
+target_include_directories(gpr_backoff_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(gpr_backoff_test
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(gpr_cmdline_test
+  test/core/support/cmdline_test.c
+)
+
+target_include_directories(gpr_cmdline_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(gpr_cmdline_test
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(gpr_cpu_test
+  test/core/support/cpu_test.c
+)
+
+target_include_directories(gpr_cpu_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(gpr_cpu_test
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(gpr_env_test
+  test/core/support/env_test.c
+)
+
+target_include_directories(gpr_env_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(gpr_env_test
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(gpr_histogram_test
+  test/core/support/histogram_test.c
+)
+
+target_include_directories(gpr_histogram_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(gpr_histogram_test
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(gpr_host_port_test
+  test/core/support/host_port_test.c
+)
+
+target_include_directories(gpr_host_port_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(gpr_host_port_test
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(gpr_log_test
+  test/core/support/log_test.c
+)
+
+target_include_directories(gpr_log_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(gpr_log_test
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(gpr_mpscq_test
+  test/core/support/mpscq_test.c
+)
+
+target_include_directories(gpr_mpscq_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(gpr_mpscq_test
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(gpr_stack_lockfree_test
+  test/core/support/stack_lockfree_test.c
+)
+
+target_include_directories(gpr_stack_lockfree_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(gpr_stack_lockfree_test
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(gpr_string_test
+  test/core/support/string_test.c
+)
+
+target_include_directories(gpr_string_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(gpr_string_test
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(gpr_sync_test
+  test/core/support/sync_test.c
+)
+
+target_include_directories(gpr_sync_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(gpr_sync_test
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(gpr_thd_test
+  test/core/support/thd_test.c
+)
+
+target_include_directories(gpr_thd_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(gpr_thd_test
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(gpr_time_test
+  test/core/support/time_test.c
+)
+
+target_include_directories(gpr_time_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(gpr_time_test
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(gpr_tls_test
+  test/core/support/tls_test.c
+)
+
+target_include_directories(gpr_tls_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(gpr_tls_test
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(gpr_useful_test
+  test/core/support/useful_test.c
+)
+
+target_include_directories(gpr_useful_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(gpr_useful_test
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(grpc_auth_context_test
+  test/core/security/auth_context_test.c
+)
+
+target_include_directories(grpc_auth_context_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(grpc_auth_context_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(grpc_b64_test
+  test/core/security/b64_test.c
+)
+
+target_include_directories(grpc_b64_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(grpc_b64_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(grpc_byte_buffer_reader_test
+  test/core/surface/byte_buffer_reader_test.c
+)
+
+target_include_directories(grpc_byte_buffer_reader_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(grpc_byte_buffer_reader_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(grpc_channel_args_test
+  test/core/channel/channel_args_test.c
+)
+
+target_include_directories(grpc_channel_args_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(grpc_channel_args_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(grpc_channel_stack_test
+  test/core/channel/channel_stack_test.c
+)
+
+target_include_directories(grpc_channel_stack_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(grpc_channel_stack_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(grpc_completion_queue_test
+  test/core/surface/completion_queue_test.c
+)
+
+target_include_directories(grpc_completion_queue_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(grpc_completion_queue_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
 
 add_executable(grpc_create_jwt
   test/core/security/create_jwt.c
@@ -1893,6 +6015,7 @@
   PRIVATE ${PROTOBUF_ROOT_DIR}/src
   PRIVATE ${ZLIB_ROOT_DIR}
   PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
 )
 
 target_link_libraries(grpc_create_jwt
@@ -1910,6 +6033,126 @@
   )
 endif()
 
+if (gRPC_BUILD_TESTS)
+
+add_executable(grpc_credentials_test
+  test/core/security/credentials_test.c
+)
+
+target_include_directories(grpc_credentials_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(grpc_credentials_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(grpc_fetch_oauth2
+  test/core/security/fetch_oauth2.c
+)
+
+target_include_directories(grpc_fetch_oauth2
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(grpc_fetch_oauth2
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(grpc_invalid_channel_args_test
+  test/core/surface/invalid_channel_args_test.c
+)
+
+target_include_directories(grpc_invalid_channel_args_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(grpc_invalid_channel_args_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(grpc_json_token_test
+  test/core/security/json_token_test.c
+)
+
+target_include_directories(grpc_json_token_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(grpc_json_token_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(grpc_jwt_verifier_test
+  test/core/security/jwt_verifier_test.c
+)
+
+target_include_directories(grpc_jwt_verifier_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(grpc_jwt_verifier_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
 
 add_executable(grpc_print_google_default_creds_token
   test/core/security/print_google_default_creds_token.c
@@ -1922,6 +6165,7 @@
   PRIVATE ${PROTOBUF_ROOT_DIR}/src
   PRIVATE ${ZLIB_ROOT_DIR}
   PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
 )
 
 target_link_libraries(grpc_print_google_default_creds_token
@@ -1938,6 +6182,30 @@
   )
 endif()
 
+if (gRPC_BUILD_TESTS)
+
+add_executable(grpc_security_connector_test
+  test/core/security/security_connector_test.c
+)
+
+target_include_directories(grpc_security_connector_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(grpc_security_connector_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
 
 add_executable(grpc_verify_jwt
   test/core/security/verify_jwt.c
@@ -1950,6 +6218,7 @@
   PRIVATE ${PROTOBUF_ROOT_DIR}/src
   PRIVATE ${ZLIB_ROOT_DIR}
   PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
 )
 
 target_link_libraries(grpc_verify_jwt
@@ -1966,6 +6235,1988 @@
   )
 endif()
 
+if (gRPC_BUILD_TESTS)
+
+add_executable(handshake_client
+  test/core/handshake/client_ssl.c
+)
+
+target_include_directories(handshake_client
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(handshake_client
+  ${_gRPC_SSL_LIBRARIES}
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(handshake_server
+  test/core/handshake/server_ssl.c
+)
+
+target_include_directories(handshake_server
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(handshake_server
+  ${_gRPC_SSL_LIBRARIES}
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(hpack_parser_test
+  test/core/transport/chttp2/hpack_parser_test.c
+)
+
+target_include_directories(hpack_parser_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(hpack_parser_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(hpack_table_test
+  test/core/transport/chttp2/hpack_table_test.c
+)
+
+target_include_directories(hpack_table_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(hpack_table_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(http_parser_test
+  test/core/http/parser_test.c
+)
+
+target_include_directories(http_parser_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(http_parser_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(httpcli_format_request_test
+  test/core/http/format_request_test.c
+)
+
+target_include_directories(httpcli_format_request_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(httpcli_format_request_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(httpcli_test
+  test/core/http/httpcli_test.c
+)
+
+target_include_directories(httpcli_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(httpcli_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(httpscli_test
+  test/core/http/httpscli_test.c
+)
+
+target_include_directories(httpscli_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(httpscli_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(init_test
+  test/core/surface/init_test.c
+)
+
+target_include_directories(init_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(init_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(internal_api_canary_iomgr_test
+  test/core/internal_api_canaries/iomgr.c
+)
+
+target_include_directories(internal_api_canary_iomgr_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(internal_api_canary_iomgr_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(internal_api_canary_support_test
+  test/core/internal_api_canaries/iomgr.c
+)
+
+target_include_directories(internal_api_canary_support_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(internal_api_canary_support_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(internal_api_canary_transport_test
+  test/core/internal_api_canaries/iomgr.c
+)
+
+target_include_directories(internal_api_canary_transport_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(internal_api_canary_transport_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(invalid_call_argument_test
+  test/core/end2end/invalid_call_argument_test.c
+)
+
+target_include_directories(invalid_call_argument_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(invalid_call_argument_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(json_rewrite
+  test/core/json/json_rewrite.c
+)
+
+target_include_directories(json_rewrite
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(json_rewrite
+  grpc
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(json_rewrite_test
+  test/core/json/json_rewrite_test.c
+)
+
+target_include_directories(json_rewrite_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(json_rewrite_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(json_stream_error_test
+  test/core/json/json_stream_error_test.c
+)
+
+target_include_directories(json_stream_error_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(json_stream_error_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(json_test
+  test/core/json/json_test.c
+)
+
+target_include_directories(json_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(json_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(lame_client_test
+  test/core/surface/lame_client_test.c
+)
+
+target_include_directories(lame_client_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(lame_client_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(lb_policies_test
+  test/core/client_channel/lb_policies_test.c
+)
+
+target_include_directories(lb_policies_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(lb_policies_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(load_file_test
+  test/core/iomgr/load_file_test.c
+)
+
+target_include_directories(load_file_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(load_file_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(memory_profile_client
+  test/core/memory_usage/client.c
+)
+
+target_include_directories(memory_profile_client
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(memory_profile_client
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(memory_profile_server
+  test/core/memory_usage/server.c
+)
+
+target_include_directories(memory_profile_server
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(memory_profile_server
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(memory_profile_test
+  test/core/memory_usage/memory_usage_test.c
+)
+
+target_include_directories(memory_profile_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(memory_profile_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(message_compress_test
+  test/core/compression/message_compress_test.c
+)
+
+target_include_directories(message_compress_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(message_compress_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(mlog_test
+  test/core/census/mlog_test.c
+)
+
+target_include_directories(mlog_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(mlog_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(multiple_server_queues_test
+  test/core/end2end/multiple_server_queues_test.c
+)
+
+target_include_directories(multiple_server_queues_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(multiple_server_queues_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(murmur_hash_test
+  test/core/support/murmur_hash_test.c
+)
+
+target_include_directories(murmur_hash_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(murmur_hash_test
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(no_server_test
+  test/core/end2end/no_server_test.c
+)
+
+target_include_directories(no_server_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(no_server_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(percent_encoding_test
+  test/core/slice/percent_encoding_test.c
+)
+
+target_include_directories(percent_encoding_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(percent_encoding_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(resolve_address_test
+  test/core/iomgr/resolve_address_test.c
+)
+
+target_include_directories(resolve_address_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(resolve_address_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(resource_quota_test
+  test/core/iomgr/resource_quota_test.c
+)
+
+target_include_directories(resource_quota_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(resource_quota_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(secure_channel_create_test
+  test/core/surface/secure_channel_create_test.c
+)
+
+target_include_directories(secure_channel_create_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(secure_channel_create_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(secure_endpoint_test
+  test/core/security/secure_endpoint_test.c
+)
+
+target_include_directories(secure_endpoint_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(secure_endpoint_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(sequential_connectivity_test
+  test/core/surface/sequential_connectivity_test.c
+)
+
+target_include_directories(sequential_connectivity_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(sequential_connectivity_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(server_chttp2_test
+  test/core/surface/server_chttp2_test.c
+)
+
+target_include_directories(server_chttp2_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(server_chttp2_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(server_test
+  test/core/surface/server_test.c
+)
+
+target_include_directories(server_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(server_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(set_initial_connect_string_test
+  test/core/client_channel/set_initial_connect_string_test.c
+)
+
+target_include_directories(set_initial_connect_string_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(set_initial_connect_string_test
+  test_tcp_server
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(slice_buffer_test
+  test/core/slice/slice_buffer_test.c
+)
+
+target_include_directories(slice_buffer_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(slice_buffer_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(slice_string_helpers_test
+  test/core/slice/slice_string_helpers_test.c
+)
+
+target_include_directories(slice_string_helpers_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(slice_string_helpers_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(slice_test
+  test/core/slice/slice_test.c
+)
+
+target_include_directories(slice_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(slice_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(sockaddr_resolver_test
+  test/core/client_channel/resolvers/sockaddr_resolver_test.c
+)
+
+target_include_directories(sockaddr_resolver_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(sockaddr_resolver_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(sockaddr_utils_test
+  test/core/iomgr/sockaddr_utils_test.c
+)
+
+target_include_directories(sockaddr_utils_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(sockaddr_utils_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(socket_utils_test
+  test/core/iomgr/socket_utils_test.c
+)
+
+target_include_directories(socket_utils_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(socket_utils_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(tcp_client_posix_test
+  test/core/iomgr/tcp_client_posix_test.c
+)
+
+target_include_directories(tcp_client_posix_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(tcp_client_posix_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(tcp_posix_test
+  test/core/iomgr/tcp_posix_test.c
+)
+
+target_include_directories(tcp_posix_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(tcp_posix_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(tcp_server_posix_test
+  test/core/iomgr/tcp_server_posix_test.c
+)
+
+target_include_directories(tcp_server_posix_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(tcp_server_posix_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(time_averaged_stats_test
+  test/core/iomgr/time_averaged_stats_test.c
+)
+
+target_include_directories(time_averaged_stats_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(time_averaged_stats_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(timeout_encoding_test
+  test/core/transport/timeout_encoding_test.c
+)
+
+target_include_directories(timeout_encoding_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(timeout_encoding_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(timer_heap_test
+  test/core/iomgr/timer_heap_test.c
+)
+
+target_include_directories(timer_heap_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(timer_heap_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(timer_list_test
+  test/core/iomgr/timer_list_test.c
+)
+
+target_include_directories(timer_list_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(timer_list_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(transport_connectivity_state_test
+  test/core/transport/connectivity_state_test.c
+)
+
+target_include_directories(transport_connectivity_state_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(transport_connectivity_state_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(transport_metadata_test
+  test/core/transport/metadata_test.c
+)
+
+target_include_directories(transport_metadata_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(transport_metadata_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(transport_pid_controller_test
+  test/core/transport/pid_controller_test.c
+)
+
+target_include_directories(transport_pid_controller_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(transport_pid_controller_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(transport_security_test
+  test/core/tsi/transport_security_test.c
+)
+
+target_include_directories(transport_security_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(transport_security_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(udp_server_test
+  test/core/iomgr/udp_server_test.c
+)
+
+target_include_directories(udp_server_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(udp_server_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(uri_parser_test
+  test/core/client_channel/uri_parser_test.c
+)
+
+target_include_directories(uri_parser_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(uri_parser_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(wakeup_fd_cv_test
+  test/core/iomgr/wakeup_fd_cv_test.c
+)
+
+target_include_directories(wakeup_fd_cv_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(wakeup_fd_cv_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(alarm_cpp_test
+  test/cpp/common/alarm_cpp_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(alarm_cpp_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(alarm_cpp_test
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(async_end2end_test
+  test/cpp/end2end/async_end2end_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(async_end2end_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(async_end2end_test
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(auth_property_iterator_test
+  test/cpp/common/auth_property_iterator_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(auth_property_iterator_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(auth_property_iterator_test
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(bm_fullstack
+  test/cpp/microbenchmarks/bm_fullstack.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(bm_fullstack
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(bm_fullstack
+  benchmark
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(channel_arguments_test
+  test/cpp/common/channel_arguments_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(channel_arguments_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(channel_arguments_test
+  grpc++
+  grpc
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(channel_filter_test
+  test/cpp/common/channel_filter_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(channel_filter_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(channel_filter_test
+  grpc++
+  grpc
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(cli_call_test
+  test/cpp/util/cli_call_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(cli_call_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(cli_call_test
+  grpc_cli_libs
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(client_crash_test
+  test/cpp/end2end/client_crash_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(client_crash_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(client_crash_test
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(client_crash_test_server
+  test/cpp/end2end/client_crash_test_server.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(client_crash_test_server
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(client_crash_test_server
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(codegen_test_full
+  src/proto/grpc/testing/control.proto
+  src/proto/grpc/testing/messages.proto
+  src/proto/grpc/testing/payloads.proto
+  src/proto/grpc/testing/services.proto
+  src/proto/grpc/testing/stats.proto
+  test/cpp/codegen/codegen_test_full.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(codegen_test_full
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(codegen_test_full
+  grpc++
+  grpc
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(codegen_test_minimal
+  src/proto/grpc/testing/control.proto
+  src/proto/grpc/testing/messages.proto
+  src/proto/grpc/testing/payloads.proto
+  src/proto/grpc/testing/services.proto
+  src/proto/grpc/testing/stats.proto
+  test/cpp/codegen/codegen_test_minimal.cc
+  src/cpp/codegen/codegen_init.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(codegen_test_minimal
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(codegen_test_minimal
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(credentials_test
+  test/cpp/client/credentials_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(credentials_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(credentials_test
+  grpc++
+  grpc
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(cxx_byte_buffer_test
+  test/cpp/util/byte_buffer_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(cxx_byte_buffer_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(cxx_byte_buffer_test
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(cxx_slice_test
+  test/cpp/util/slice_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(cxx_slice_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(cxx_slice_test
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(cxx_string_ref_test
+  test/cpp/util/string_ref_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(cxx_string_ref_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(cxx_string_ref_test
+  grpc++
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(cxx_time_test
+  test/cpp/util/time_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(cxx_time_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(cxx_time_test
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(end2end_test
+  test/cpp/end2end/end2end_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(end2end_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(end2end_test
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(filter_end2end_test
+  test/cpp/end2end/filter_end2end_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(filter_end2end_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(filter_end2end_test
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(generic_end2end_test
+  test/cpp/end2end/generic_end2end_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(generic_end2end_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(generic_end2end_test
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(golden_file_test
+  src/proto/grpc/testing/compiler_test.proto
+  test/cpp/codegen/golden_file_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(golden_file_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(golden_file_test
+  grpc++
+  grpc
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(grpc_cli
+  test/cpp/util/grpc_cli.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(grpc_cli
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(grpc_cli
+  grpc_cli_libs
+  grpc++_proto_reflection_desc_db
+  grpc++
+  grpc
+  gpr
+  grpc++_test_config
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
 
 add_executable(grpc_cpp_plugin
   src/compiler/cpp_plugin.cc
@@ -1978,6 +8229,7 @@
   PRIVATE ${PROTOBUF_ROOT_DIR}/src
   PRIVATE ${ZLIB_ROOT_DIR}
   PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
 )
 
 target_link_libraries(grpc_cpp_plugin
@@ -2006,6 +8258,7 @@
   PRIVATE ${PROTOBUF_ROOT_DIR}/src
   PRIVATE ${ZLIB_ROOT_DIR}
   PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
 )
 
 target_link_libraries(grpc_csharp_plugin
@@ -2034,6 +8287,7 @@
   PRIVATE ${PROTOBUF_ROOT_DIR}/src
   PRIVATE ${ZLIB_ROOT_DIR}
   PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
 )
 
 target_link_libraries(grpc_node_plugin
@@ -2062,6 +8316,7 @@
   PRIVATE ${PROTOBUF_ROOT_DIR}/src
   PRIVATE ${ZLIB_ROOT_DIR}
   PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
 )
 
 target_link_libraries(grpc_objective_c_plugin
@@ -2090,6 +8345,7 @@
   PRIVATE ${PROTOBUF_ROOT_DIR}/src
   PRIVATE ${ZLIB_ROOT_DIR}
   PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
 )
 
 target_link_libraries(grpc_php_plugin
@@ -2118,6 +8374,7 @@
   PRIVATE ${PROTOBUF_ROOT_DIR}/src
   PRIVATE ${ZLIB_ROOT_DIR}
   PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
 )
 
 target_link_libraries(grpc_python_plugin
@@ -2146,6 +8403,7 @@
   PRIVATE ${PROTOBUF_ROOT_DIR}/src
   PRIVATE ${ZLIB_ROOT_DIR}
   PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
 )
 
 target_link_libraries(grpc_ruby_plugin
@@ -2162,6 +8420,3646 @@
   )
 endif()
 
+if (gRPC_BUILD_TESTS)
+
+add_executable(grpc_tool_test
+  src/proto/grpc/testing/echo.proto
+  src/proto/grpc/testing/echo_messages.proto
+  test/cpp/util/grpc_tool_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(grpc_tool_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(grpc_tool_test
+  grpc_cli_libs
+  grpc++_proto_reflection_desc_db
+  grpc++_reflection
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(grpclb_api_test
+  src/proto/grpc/lb/v1/load_balancer.proto
+  test/cpp/grpclb/grpclb_api_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(grpclb_api_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(grpclb_api_test
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(grpclb_test
+  src/proto/grpc/lb/v1/load_balancer.proto
+  test/cpp/grpclb/grpclb_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(grpclb_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(grpclb_test
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(http2_client
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(http2_client
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(http2_client
+  http2_client_main
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  grpc++_test_config
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(hybrid_end2end_test
+  test/cpp/end2end/hybrid_end2end_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(hybrid_end2end_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(hybrid_end2end_test
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(interop_client
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(interop_client
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(interop_client
+  interop_client_main
+  interop_client_helper
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  grpc++_test_config
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(interop_server
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(interop_server
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(interop_server
+  interop_server_main
+  interop_server_helper
+  interop_server_lib
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  grpc++_test_config
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(interop_test
+  test/cpp/interop/interop_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(interop_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(interop_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+  grpc++_test_config
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(json_run_localhost
+  test/cpp/qps/json_run_localhost.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(json_run_localhost
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(json_run_localhost
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  grpc++_test_config
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(metrics_client
+  src/proto/grpc/testing/metrics.proto
+  test/cpp/interop/metrics_client.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(metrics_client
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(metrics_client
+  grpc++
+  grpc
+  gpr
+  grpc++_test_config
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(mock_test
+  test/cpp/end2end/mock_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(mock_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(mock_test
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(noop-benchmark
+  test/cpp/microbenchmarks/noop-benchmark.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(noop-benchmark
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(noop-benchmark
+  benchmark
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(proto_server_reflection_test
+  test/cpp/end2end/proto_server_reflection_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(proto_server_reflection_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(proto_server_reflection_test
+  grpc++_proto_reflection_desc_db
+  grpc++_reflection
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(qps_interarrival_test
+  test/cpp/qps/qps_interarrival_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(qps_interarrival_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(qps_interarrival_test
+  qps
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(qps_json_driver
+  test/cpp/qps/qps_json_driver.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(qps_json_driver
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(qps_json_driver
+  qps
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  grpc++_test_config
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(qps_openloop_test
+  test/cpp/qps/qps_openloop_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(qps_openloop_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(qps_openloop_test
+  qps
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  grpc++_test_config
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(qps_worker
+  test/cpp/qps/worker.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(qps_worker
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(qps_worker
+  qps
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  grpc++_test_config
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(reconnect_interop_client
+  src/proto/grpc/testing/empty.proto
+  src/proto/grpc/testing/messages.proto
+  src/proto/grpc/testing/test.proto
+  test/cpp/interop/reconnect_interop_client.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(reconnect_interop_client
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(reconnect_interop_client
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  grpc++_test_config
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(reconnect_interop_server
+  src/proto/grpc/testing/empty.proto
+  src/proto/grpc/testing/messages.proto
+  src/proto/grpc/testing/test.proto
+  test/cpp/interop/reconnect_interop_server.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(reconnect_interop_server
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(reconnect_interop_server
+  reconnect_server
+  test_tcp_server
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  grpc++_test_config
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(round_robin_end2end_test
+  test/cpp/end2end/round_robin_end2end_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(round_robin_end2end_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(round_robin_end2end_test
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(secure_auth_context_test
+  test/cpp/common/secure_auth_context_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(secure_auth_context_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(secure_auth_context_test
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(secure_sync_unary_ping_pong_test
+  test/cpp/qps/secure_sync_unary_ping_pong_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(secure_sync_unary_ping_pong_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(secure_sync_unary_ping_pong_test
+  qps
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(server_builder_plugin_test
+  test/cpp/end2end/server_builder_plugin_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(server_builder_plugin_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(server_builder_plugin_test
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(server_context_test_spouse_test
+  test/cpp/test/server_context_test_spouse_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(server_context_test_spouse_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(server_context_test_spouse_test
+  grpc_test_util
+  grpc++_test
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(server_crash_test
+  test/cpp/end2end/server_crash_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(server_crash_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(server_crash_test
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(server_crash_test_client
+  test/cpp/end2end/server_crash_test_client.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(server_crash_test_client
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(server_crash_test_client
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(shutdown_test
+  test/cpp/end2end/shutdown_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(shutdown_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(shutdown_test
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(status_test
+  test/cpp/util/status_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(status_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(status_test
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(streaming_throughput_test
+  test/cpp/end2end/streaming_throughput_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(streaming_throughput_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(streaming_throughput_test
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(stress_test
+  src/proto/grpc/testing/empty.proto
+  src/proto/grpc/testing/messages.proto
+  src/proto/grpc/testing/metrics.proto
+  src/proto/grpc/testing/test.proto
+  test/cpp/interop/interop_client.cc
+  test/cpp/interop/stress_interop_client.cc
+  test/cpp/interop/stress_test.cc
+  test/cpp/util/create_test_channel.cc
+  test/cpp/util/metrics_server.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(stress_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(stress_test
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  grpc++_test_config
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(thread_manager_test
+  test/cpp/thread_manager/thread_manager_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(thread_manager_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(thread_manager_test
+  grpc++
+  grpc
+  gpr
+  grpc++_test_config
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(thread_stress_test
+  test/cpp/end2end/thread_stress_test.cc
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(thread_stress_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(thread_stress_test
+  grpc++_test_util
+  grpc_test_util
+  grpc++
+  grpc
+  gpr_test_util
+  gpr
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_aes_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_aes_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_aes_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_aes_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_asn1_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_asn1_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_asn1_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_asn1_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_base64_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_base64_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_base64_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_base64_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_bio_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_bio_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_bio_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_bio_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_bn_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_bn_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_bn_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_bn_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_bytestring_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_bytestring_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_bytestring_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_bytestring_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_chacha_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_chacha_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_chacha_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_chacha_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_aead_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_aead_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_aead_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_aead_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_cipher_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_cipher_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_cipher_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_cipher_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_cmac_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_cmac_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_cmac_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_cmac_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_constant_time_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_constant_time_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_constant_time_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_constant_time_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_ed25519_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_ed25519_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_ed25519_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_ed25519_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_spake25519_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_spake25519_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_spake25519_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_spake25519_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_x25519_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_x25519_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_x25519_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_x25519_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_dh_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_dh_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_dh_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_dh_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_digest_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_digest_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_digest_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_digest_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_dsa_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_dsa_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_dsa_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_dsa_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_ec_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_ec_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_ec_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_ec_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_example_mul
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_example_mul
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_example_mul
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_example_mul_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_ecdh_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_ecdh_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_ecdh_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_ecdh_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_ecdsa_sign_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_ecdsa_sign_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_ecdsa_sign_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_ecdsa_sign_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_ecdsa_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_ecdsa_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_ecdsa_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_ecdsa_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_ecdsa_verify_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_ecdsa_verify_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_ecdsa_verify_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_ecdsa_verify_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_err_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_err_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_err_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_err_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_evp_extra_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_evp_extra_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_evp_extra_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_evp_extra_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_evp_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_evp_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_evp_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_evp_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_pbkdf_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_pbkdf_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_pbkdf_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_pbkdf_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_hkdf_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_hkdf_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_hkdf_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_hkdf_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_hmac_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_hmac_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_hmac_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_hmac_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_lhash_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_lhash_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_lhash_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_lhash_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_gcm_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_gcm_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_gcm_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_gcm_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_newhope_statistical_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_newhope_statistical_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_newhope_statistical_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_newhope_statistical_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_newhope_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_newhope_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_newhope_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_newhope_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_newhope_vectors_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_newhope_vectors_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_newhope_vectors_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_newhope_vectors_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_obj_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_obj_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_obj_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_obj_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_pkcs12_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_pkcs12_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_pkcs12_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_pkcs12_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_pkcs8_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_pkcs8_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_pkcs8_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_pkcs8_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_poly1305_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_poly1305_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_poly1305_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_poly1305_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_refcount_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_refcount_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_refcount_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_refcount_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_rsa_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_rsa_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_rsa_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_rsa_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_thread_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_thread_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_thread_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_thread_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_pkcs7_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_pkcs7_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_pkcs7_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_pkcs7_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_x509_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_x509_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_x509_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_x509_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_tab_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_tab_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_tab_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_tab_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_v3name_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_v3name_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_v3name_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_v3name_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(boringssl_ssl_test
+  third_party/googletest/src/gtest-all.cc
+)
+
+target_include_directories(boringssl_ssl_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+  PRIVATE third_party/googletest/include
+  PRIVATE third_party/googletest
+)
+
+target_link_libraries(boringssl_ssl_test
+  ${_gRPC_SSL_LIBRARIES}
+  boringssl_ssl_test_lib
+  boringssl_test_util
+  boringssl
+  ${_gRPC_GFLAGS_LIBRARIES}
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(badreq_bad_client_test
+  test/core/bad_client/tests/badreq.c
+)
+
+target_include_directories(badreq_bad_client_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(badreq_bad_client_test
+  ${_gRPC_SSL_LIBRARIES}
+  bad_client_test
+  grpc_test_util_unsecure
+  grpc_unsecure
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(connection_prefix_bad_client_test
+  test/core/bad_client/tests/connection_prefix.c
+)
+
+target_include_directories(connection_prefix_bad_client_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(connection_prefix_bad_client_test
+  ${_gRPC_SSL_LIBRARIES}
+  bad_client_test
+  grpc_test_util_unsecure
+  grpc_unsecure
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(head_of_line_blocking_bad_client_test
+  test/core/bad_client/tests/head_of_line_blocking.c
+)
+
+target_include_directories(head_of_line_blocking_bad_client_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(head_of_line_blocking_bad_client_test
+  ${_gRPC_SSL_LIBRARIES}
+  bad_client_test
+  grpc_test_util_unsecure
+  grpc_unsecure
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(headers_bad_client_test
+  test/core/bad_client/tests/headers.c
+)
+
+target_include_directories(headers_bad_client_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(headers_bad_client_test
+  ${_gRPC_SSL_LIBRARIES}
+  bad_client_test
+  grpc_test_util_unsecure
+  grpc_unsecure
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(initial_settings_frame_bad_client_test
+  test/core/bad_client/tests/initial_settings_frame.c
+)
+
+target_include_directories(initial_settings_frame_bad_client_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(initial_settings_frame_bad_client_test
+  ${_gRPC_SSL_LIBRARIES}
+  bad_client_test
+  grpc_test_util_unsecure
+  grpc_unsecure
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(large_metadata_bad_client_test
+  test/core/bad_client/tests/large_metadata.c
+)
+
+target_include_directories(large_metadata_bad_client_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(large_metadata_bad_client_test
+  ${_gRPC_SSL_LIBRARIES}
+  bad_client_test
+  grpc_test_util_unsecure
+  grpc_unsecure
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(server_registered_method_bad_client_test
+  test/core/bad_client/tests/server_registered_method.c
+)
+
+target_include_directories(server_registered_method_bad_client_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(server_registered_method_bad_client_test
+  ${_gRPC_SSL_LIBRARIES}
+  bad_client_test
+  grpc_test_util_unsecure
+  grpc_unsecure
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(simple_request_bad_client_test
+  test/core/bad_client/tests/simple_request.c
+)
+
+target_include_directories(simple_request_bad_client_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(simple_request_bad_client_test
+  ${_gRPC_SSL_LIBRARIES}
+  bad_client_test
+  grpc_test_util_unsecure
+  grpc_unsecure
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(unknown_frame_bad_client_test
+  test/core/bad_client/tests/unknown_frame.c
+)
+
+target_include_directories(unknown_frame_bad_client_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(unknown_frame_bad_client_test
+  ${_gRPC_SSL_LIBRARIES}
+  bad_client_test
+  grpc_test_util_unsecure
+  grpc_unsecure
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(window_overflow_bad_client_test
+  test/core/bad_client/tests/window_overflow.c
+)
+
+target_include_directories(window_overflow_bad_client_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(window_overflow_bad_client_test
+  ${_gRPC_SSL_LIBRARIES}
+  bad_client_test
+  grpc_test_util_unsecure
+  grpc_unsecure
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(bad_ssl_cert_server
+  test/core/bad_ssl/servers/cert.c
+)
+
+target_include_directories(bad_ssl_cert_server
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(bad_ssl_cert_server
+  bad_ssl_test_server
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(bad_ssl_cert_test
+  test/core/bad_ssl/bad_ssl_test.c
+)
+
+target_include_directories(bad_ssl_cert_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(bad_ssl_cert_test
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(h2_census_test
+  test/core/end2end/fixtures/h2_census.c
+)
+
+target_include_directories(h2_census_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(h2_census_test
+  end2end_tests
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(h2_compress_test
+  test/core/end2end/fixtures/h2_compress.c
+)
+
+target_include_directories(h2_compress_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(h2_compress_test
+  end2end_tests
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(h2_fakesec_test
+  test/core/end2end/fixtures/h2_fakesec.c
+)
+
+target_include_directories(h2_fakesec_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(h2_fakesec_test
+  end2end_tests
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(h2_fd_test
+  test/core/end2end/fixtures/h2_fd.c
+)
+
+target_include_directories(h2_fd_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(h2_fd_test
+  end2end_tests
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(h2_full_test
+  test/core/end2end/fixtures/h2_full.c
+)
+
+target_include_directories(h2_full_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(h2_full_test
+  end2end_tests
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(h2_full+pipe_test
+  test/core/end2end/fixtures/h2_full+pipe.c
+)
+
+target_include_directories(h2_full+pipe_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(h2_full+pipe_test
+  end2end_tests
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(h2_full+trace_test
+  test/core/end2end/fixtures/h2_full+trace.c
+)
+
+target_include_directories(h2_full+trace_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(h2_full+trace_test
+  end2end_tests
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(h2_http_proxy_test
+  test/core/end2end/fixtures/h2_http_proxy.c
+)
+
+target_include_directories(h2_http_proxy_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(h2_http_proxy_test
+  end2end_tests
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(h2_load_reporting_test
+  test/core/end2end/fixtures/h2_load_reporting.c
+)
+
+target_include_directories(h2_load_reporting_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(h2_load_reporting_test
+  end2end_tests
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(h2_oauth2_test
+  test/core/end2end/fixtures/h2_oauth2.c
+)
+
+target_include_directories(h2_oauth2_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(h2_oauth2_test
+  end2end_tests
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(h2_proxy_test
+  test/core/end2end/fixtures/h2_proxy.c
+)
+
+target_include_directories(h2_proxy_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(h2_proxy_test
+  end2end_tests
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(h2_sockpair_test
+  test/core/end2end/fixtures/h2_sockpair.c
+)
+
+target_include_directories(h2_sockpair_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(h2_sockpair_test
+  end2end_tests
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(h2_sockpair+trace_test
+  test/core/end2end/fixtures/h2_sockpair+trace.c
+)
+
+target_include_directories(h2_sockpair+trace_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(h2_sockpair+trace_test
+  end2end_tests
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(h2_sockpair_1byte_test
+  test/core/end2end/fixtures/h2_sockpair_1byte.c
+)
+
+target_include_directories(h2_sockpair_1byte_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(h2_sockpair_1byte_test
+  end2end_tests
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(h2_ssl_test
+  test/core/end2end/fixtures/h2_ssl.c
+)
+
+target_include_directories(h2_ssl_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(h2_ssl_test
+  end2end_tests
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(h2_ssl_cert_test
+  test/core/end2end/fixtures/h2_ssl_cert.c
+)
+
+target_include_directories(h2_ssl_cert_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(h2_ssl_cert_test
+  end2end_tests
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(h2_ssl_proxy_test
+  test/core/end2end/fixtures/h2_ssl_proxy.c
+)
+
+target_include_directories(h2_ssl_proxy_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(h2_ssl_proxy_test
+  end2end_tests
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(h2_uds_test
+  test/core/end2end/fixtures/h2_uds.c
+)
+
+target_include_directories(h2_uds_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(h2_uds_test
+  end2end_tests
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(h2_census_nosec_test
+  test/core/end2end/fixtures/h2_census.c
+)
+
+target_include_directories(h2_census_nosec_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(h2_census_nosec_test
+  end2end_nosec_tests
+  grpc_test_util_unsecure
+  grpc_unsecure
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(h2_compress_nosec_test
+  test/core/end2end/fixtures/h2_compress.c
+)
+
+target_include_directories(h2_compress_nosec_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(h2_compress_nosec_test
+  end2end_nosec_tests
+  grpc_test_util_unsecure
+  grpc_unsecure
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(h2_fd_nosec_test
+  test/core/end2end/fixtures/h2_fd.c
+)
+
+target_include_directories(h2_fd_nosec_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(h2_fd_nosec_test
+  end2end_nosec_tests
+  grpc_test_util_unsecure
+  grpc_unsecure
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(h2_full_nosec_test
+  test/core/end2end/fixtures/h2_full.c
+)
+
+target_include_directories(h2_full_nosec_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(h2_full_nosec_test
+  end2end_nosec_tests
+  grpc_test_util_unsecure
+  grpc_unsecure
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(h2_full+pipe_nosec_test
+  test/core/end2end/fixtures/h2_full+pipe.c
+)
+
+target_include_directories(h2_full+pipe_nosec_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(h2_full+pipe_nosec_test
+  end2end_nosec_tests
+  grpc_test_util_unsecure
+  grpc_unsecure
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(h2_full+trace_nosec_test
+  test/core/end2end/fixtures/h2_full+trace.c
+)
+
+target_include_directories(h2_full+trace_nosec_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(h2_full+trace_nosec_test
+  end2end_nosec_tests
+  grpc_test_util_unsecure
+  grpc_unsecure
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(h2_http_proxy_nosec_test
+  test/core/end2end/fixtures/h2_http_proxy.c
+)
+
+target_include_directories(h2_http_proxy_nosec_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(h2_http_proxy_nosec_test
+  end2end_nosec_tests
+  grpc_test_util_unsecure
+  grpc_unsecure
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(h2_load_reporting_nosec_test
+  test/core/end2end/fixtures/h2_load_reporting.c
+)
+
+target_include_directories(h2_load_reporting_nosec_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(h2_load_reporting_nosec_test
+  end2end_nosec_tests
+  grpc_test_util_unsecure
+  grpc_unsecure
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(h2_proxy_nosec_test
+  test/core/end2end/fixtures/h2_proxy.c
+)
+
+target_include_directories(h2_proxy_nosec_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(h2_proxy_nosec_test
+  end2end_nosec_tests
+  grpc_test_util_unsecure
+  grpc_unsecure
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(h2_sockpair_nosec_test
+  test/core/end2end/fixtures/h2_sockpair.c
+)
+
+target_include_directories(h2_sockpair_nosec_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(h2_sockpair_nosec_test
+  end2end_nosec_tests
+  grpc_test_util_unsecure
+  grpc_unsecure
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(h2_sockpair+trace_nosec_test
+  test/core/end2end/fixtures/h2_sockpair+trace.c
+)
+
+target_include_directories(h2_sockpair+trace_nosec_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(h2_sockpair+trace_nosec_test
+  end2end_nosec_tests
+  grpc_test_util_unsecure
+  grpc_unsecure
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(h2_sockpair_1byte_nosec_test
+  test/core/end2end/fixtures/h2_sockpair_1byte.c
+)
+
+target_include_directories(h2_sockpair_1byte_nosec_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(h2_sockpair_1byte_nosec_test
+  end2end_nosec_tests
+  grpc_test_util_unsecure
+  grpc_unsecure
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(h2_uds_nosec_test
+  test/core/end2end/fixtures/h2_uds.c
+)
+
+target_include_directories(h2_uds_nosec_test
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(h2_uds_nosec_test
+  end2end_nosec_tests
+  grpc_test_util_unsecure
+  grpc_unsecure
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(api_fuzzer_one_entry
+  test/core/end2end/fuzzers/api_fuzzer.c
+  test/core/util/one_corpus_entry_fuzzer.c
+)
+
+target_include_directories(api_fuzzer_one_entry
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(api_fuzzer_one_entry
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(client_fuzzer_one_entry
+  test/core/end2end/fuzzers/client_fuzzer.c
+  test/core/util/one_corpus_entry_fuzzer.c
+)
+
+target_include_directories(client_fuzzer_one_entry
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(client_fuzzer_one_entry
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(hpack_parser_fuzzer_test_one_entry
+  test/core/transport/chttp2/hpack_parser_fuzzer_test.c
+  test/core/util/one_corpus_entry_fuzzer.c
+)
+
+target_include_directories(hpack_parser_fuzzer_test_one_entry
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(hpack_parser_fuzzer_test_one_entry
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(http_request_fuzzer_test_one_entry
+  test/core/http/request_fuzzer.c
+  test/core/util/one_corpus_entry_fuzzer.c
+)
+
+target_include_directories(http_request_fuzzer_test_one_entry
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(http_request_fuzzer_test_one_entry
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(http_response_fuzzer_test_one_entry
+  test/core/http/response_fuzzer.c
+  test/core/util/one_corpus_entry_fuzzer.c
+)
+
+target_include_directories(http_response_fuzzer_test_one_entry
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(http_response_fuzzer_test_one_entry
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(json_fuzzer_test_one_entry
+  test/core/json/fuzzer.c
+  test/core/util/one_corpus_entry_fuzzer.c
+)
+
+target_include_directories(json_fuzzer_test_one_entry
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(json_fuzzer_test_one_entry
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(nanopb_fuzzer_response_test_one_entry
+  test/core/nanopb/fuzzer_response.c
+  test/core/util/one_corpus_entry_fuzzer.c
+)
+
+target_include_directories(nanopb_fuzzer_response_test_one_entry
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(nanopb_fuzzer_response_test_one_entry
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(nanopb_fuzzer_serverlist_test_one_entry
+  test/core/nanopb/fuzzer_serverlist.c
+  test/core/util/one_corpus_entry_fuzzer.c
+)
+
+target_include_directories(nanopb_fuzzer_serverlist_test_one_entry
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(nanopb_fuzzer_serverlist_test_one_entry
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(percent_decode_fuzzer_one_entry
+  test/core/slice/percent_decode_fuzzer.c
+  test/core/util/one_corpus_entry_fuzzer.c
+)
+
+target_include_directories(percent_decode_fuzzer_one_entry
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(percent_decode_fuzzer_one_entry
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(percent_encode_fuzzer_one_entry
+  test/core/slice/percent_encode_fuzzer.c
+  test/core/util/one_corpus_entry_fuzzer.c
+)
+
+target_include_directories(percent_encode_fuzzer_one_entry
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(percent_encode_fuzzer_one_entry
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(server_fuzzer_one_entry
+  test/core/end2end/fuzzers/server_fuzzer.c
+  test/core/util/one_corpus_entry_fuzzer.c
+)
+
+target_include_directories(server_fuzzer_one_entry
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(server_fuzzer_one_entry
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(ssl_server_fuzzer_one_entry
+  test/core/security/ssl_server_fuzzer.c
+  test/core/util/one_corpus_entry_fuzzer.c
+)
+
+target_include_directories(ssl_server_fuzzer_one_entry
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(ssl_server_fuzzer_one_entry
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
+add_executable(uri_fuzzer_test_one_entry
+  test/core/client_channel/uri_fuzzer_test.c
+  test/core/util/one_corpus_entry_fuzzer.c
+)
+
+target_include_directories(uri_fuzzer_test_one_entry
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
+  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
+  PRIVATE ${BORINGSSL_ROOT_DIR}/include
+  PRIVATE ${PROTOBUF_ROOT_DIR}/src
+  PRIVATE ${ZLIB_ROOT_DIR}
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib
+  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(uri_fuzzer_test_one_entry
+  grpc_test_util
+  grpc
+  gpr_test_util
+  gpr
+)
+
+endif (gRPC_BUILD_TESTS)
 
 
 
diff --git a/INSTALL.md b/INSTALL.md
index 6861455..24f088e 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -61,49 +61,45 @@
 There are several ways to build under Windows, of varying complexity depending
 on experience with the tools involved.
 
-<!--
-###Visual Studio
+###Pre-generated Visual Studio solution
 
-Versions 2013 and 2015 are both supported. You can use [their respective
-community
-editions](https://www.visualstudio.com/en-us/downloads/download-visual-studio-vs.aspx).
+The pre-generated VS projects & solution are checked into the repository under the [vsprojects](/vsprojects) directory.
+  
+###Building using CMake (with BoringSSL)
+- Install [CMake](https://cmake.org/download/).
+- Install [Active State Perl](http://www.activestate.com/activeperl/) (`choco install activeperl`)
+- Install [Ninja](https://ninja-build.org/) (`choco install ninja`)
+- Install [Go](https://golang.org/dl/) (`choco install golang`)
+- Install [yasm](http://yasm.tortall.net/) and add it to `PATH` (`choco install yasm`)
+- Run these commands in the repo root directory
+```
+> md .build
+> cd .build
+> call "%VS140COMNTOOLS%..\..\VC\vcvarsall.bat" x64
+> cmake .. -GNinja -DCMAKE_BUILD_TYPE=Release
+> cmake --build .
+```
+NOTE: Currently you can only use Ninja to build using cmake on Windows (because of the boringssl dependency).
 
-Building the C Core:
-- Open [grpc.sln](https://github.com/grpc/grpc/blob/master/vsprojects/grpc.sln).
-- Select your build target.
-- Build the `grpc` project.
+###msys2 (with mingw)
 
-Building the C++ runtime:
-- You need [CMake](https://cmake.org/) on your path to build protobuf (see below
-  for building using solely CMake).
-- Run `vsprojects/build_protos.bat` (needs `cmake.exe` in your path).
-- Open [buildtests_cxx.sln]()
-- Select your build target.
-- build the `grpc++` project.
--->
-
-###msys2
+The Makefile (and source code) should support msys2's mingw32 and mingw64
+compilers. Building with msys2's native compiler is also possible, but
+difficult.
 
 This approach requires having [msys2](https://msys2.github.io/) installed.
+  
+```
+# Install prerequisites
+MSYS2$ pacman -S autoconf automake gcc libtool mingw-w64-x86_64-toolchain perl pkg-config zlib
+MSYS2$ pacman -S mingw-w64-x86_64-gflags
+```
 
-- The Makefile (and source code) should support msys2's mingw32 and mingw64
-  compilers. Building with msys2's native compiler is also possible, but
-  difficult.
-- The Makefile is expecting the Windows versions of OpenSSL (see
-  https://slproweb.com/products/Win32OpenSSL.html). It's also possible to build
-  the Windows version of OpenSSL from scratch. The output should be `libeay32`
-  and `ssleay32`.
-- If you are not installing the above files under msys2's path, you may specify
-  it, for instance, in the following way:
-  ```CPPFLAGS=”-I/c/OpenSSL-Win32/include” LDFLAGS=”-L/c/OpenSSL-Win32/lib” make static_c```
-- [protobuf3](https://github.com/google/protobuf/blob/master/src/README.md#c-installation---windows)
-  must be installed on the msys2 path.
+```
+# From mingw shell
+MINGW64$ export CPPFLAGS="-D_WIN32_WINNT=0x0600"
+MINGW64$ make
+```
 
-###Cmake (experimental)
-
-- Install [CMake](https://cmake.org/download/).
-- Run it over [grpc's
-  CMakeLists.txt](https://github.com/grpc/grpc/blob/master/CMakeLists.txt) to
-  generate "projects" for your compiler.
-- Build with your compiler of choice. The generated build files should have the
-  protobuf3 dependency baked in.
+NOTE: While most of the make targets are buildable under Mingw, some haven't been ported to Windows yet
+and may fail to build (mostly trying to include POSIX headers not available on Mingw).
diff --git a/Makefile b/Makefile
index 743cd19..a70d913 100644
--- a/Makefile
+++ b/Makefile
@@ -1134,18 +1134,23 @@
 boringssl_bio_test: $(BINDIR)/$(CONFIG)/boringssl_bio_test
 boringssl_bn_test: $(BINDIR)/$(CONFIG)/boringssl_bn_test
 boringssl_bytestring_test: $(BINDIR)/$(CONFIG)/boringssl_bytestring_test
+boringssl_chacha_test: $(BINDIR)/$(CONFIG)/boringssl_chacha_test
 boringssl_aead_test: $(BINDIR)/$(CONFIG)/boringssl_aead_test
 boringssl_cipher_test: $(BINDIR)/$(CONFIG)/boringssl_cipher_test
 boringssl_cmac_test: $(BINDIR)/$(CONFIG)/boringssl_cmac_test
 boringssl_constant_time_test: $(BINDIR)/$(CONFIG)/boringssl_constant_time_test
 boringssl_ed25519_test: $(BINDIR)/$(CONFIG)/boringssl_ed25519_test
+boringssl_spake25519_test: $(BINDIR)/$(CONFIG)/boringssl_spake25519_test
 boringssl_x25519_test: $(BINDIR)/$(CONFIG)/boringssl_x25519_test
 boringssl_dh_test: $(BINDIR)/$(CONFIG)/boringssl_dh_test
 boringssl_digest_test: $(BINDIR)/$(CONFIG)/boringssl_digest_test
 boringssl_dsa_test: $(BINDIR)/$(CONFIG)/boringssl_dsa_test
 boringssl_ec_test: $(BINDIR)/$(CONFIG)/boringssl_ec_test
 boringssl_example_mul: $(BINDIR)/$(CONFIG)/boringssl_example_mul
+boringssl_ecdh_test: $(BINDIR)/$(CONFIG)/boringssl_ecdh_test
+boringssl_ecdsa_sign_test: $(BINDIR)/$(CONFIG)/boringssl_ecdsa_sign_test
 boringssl_ecdsa_test: $(BINDIR)/$(CONFIG)/boringssl_ecdsa_test
+boringssl_ecdsa_verify_test: $(BINDIR)/$(CONFIG)/boringssl_ecdsa_verify_test
 boringssl_err_test: $(BINDIR)/$(CONFIG)/boringssl_err_test
 boringssl_evp_extra_test: $(BINDIR)/$(CONFIG)/boringssl_evp_extra_test
 boringssl_evp_test: $(BINDIR)/$(CONFIG)/boringssl_evp_test
@@ -1154,6 +1159,10 @@
 boringssl_hmac_test: $(BINDIR)/$(CONFIG)/boringssl_hmac_test
 boringssl_lhash_test: $(BINDIR)/$(CONFIG)/boringssl_lhash_test
 boringssl_gcm_test: $(BINDIR)/$(CONFIG)/boringssl_gcm_test
+boringssl_newhope_statistical_test: $(BINDIR)/$(CONFIG)/boringssl_newhope_statistical_test
+boringssl_newhope_test: $(BINDIR)/$(CONFIG)/boringssl_newhope_test
+boringssl_newhope_vectors_test: $(BINDIR)/$(CONFIG)/boringssl_newhope_vectors_test
+boringssl_obj_test: $(BINDIR)/$(CONFIG)/boringssl_obj_test
 boringssl_pkcs12_test: $(BINDIR)/$(CONFIG)/boringssl_pkcs12_test
 boringssl_pkcs8_test: $(BINDIR)/$(CONFIG)/boringssl_pkcs8_test
 boringssl_poly1305_test: $(BINDIR)/$(CONFIG)/boringssl_poly1305_test
@@ -1164,7 +1173,6 @@
 boringssl_x509_test: $(BINDIR)/$(CONFIG)/boringssl_x509_test
 boringssl_tab_test: $(BINDIR)/$(CONFIG)/boringssl_tab_test
 boringssl_v3name_test: $(BINDIR)/$(CONFIG)/boringssl_v3name_test
-boringssl_pqueue_test: $(BINDIR)/$(CONFIG)/boringssl_pqueue_test
 boringssl_ssl_test: $(BINDIR)/$(CONFIG)/boringssl_ssl_test
 badreq_bad_client_test: $(BINDIR)/$(CONFIG)/badreq_bad_client_test
 connection_prefix_bad_client_test: $(BINDIR)/$(CONFIG)/connection_prefix_bad_client_test
@@ -1274,7 +1282,7 @@
 pc_cxx_unsecure: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc++_unsecure.pc
 
 ifeq ($(EMBED_OPENSSL),true)
-privatelibs_cxx:  $(LIBDIR)/$(CONFIG)/libgrpc++_proto_reflection_desc_db.a $(LIBDIR)/$(CONFIG)/libgrpc++_test.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_cli_libs.a $(LIBDIR)/$(CONFIG)/libhttp2_client_main.a $(LIBDIR)/$(CONFIG)/libinterop_client_helper.a $(LIBDIR)/$(CONFIG)/libinterop_client_main.a $(LIBDIR)/$(CONFIG)/libinterop_server_helper.a $(LIBDIR)/$(CONFIG)/libinterop_server_lib.a $(LIBDIR)/$(CONFIG)/libinterop_server_main.a $(LIBDIR)/$(CONFIG)/libqps.a $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl_aes_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_asn1_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_base64_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_bio_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_bn_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_bytestring_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_aead_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_cipher_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_cmac_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_ed25519_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_x25519_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_dh_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_digest_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_ec_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_ecdsa_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_err_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_evp_extra_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_evp_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_pbkdf_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_hmac_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_pkcs12_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_pkcs8_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_poly1305_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_rsa_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_x509_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_ssl_test_lib.a $(LIBDIR)/$(CONFIG)/libbenchmark.a
+privatelibs_cxx:  $(LIBDIR)/$(CONFIG)/libgrpc++_proto_reflection_desc_db.a $(LIBDIR)/$(CONFIG)/libgrpc++_test.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_cli_libs.a $(LIBDIR)/$(CONFIG)/libhttp2_client_main.a $(LIBDIR)/$(CONFIG)/libinterop_client_helper.a $(LIBDIR)/$(CONFIG)/libinterop_client_main.a $(LIBDIR)/$(CONFIG)/libinterop_server_helper.a $(LIBDIR)/$(CONFIG)/libinterop_server_lib.a $(LIBDIR)/$(CONFIG)/libinterop_server_main.a $(LIBDIR)/$(CONFIG)/libqps.a $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl_aes_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_asn1_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_base64_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_bio_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_bn_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_bytestring_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_chacha_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_aead_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_cipher_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_cmac_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_ed25519_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_spake25519_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_x25519_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_dh_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_digest_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_ec_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_ecdh_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_ecdsa_sign_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_ecdsa_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_ecdsa_verify_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_err_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_evp_extra_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_evp_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_pbkdf_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_hmac_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_gcm_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_newhope_statistical_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_newhope_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_newhope_vectors_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_obj_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_pkcs12_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_pkcs8_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_poly1305_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_rsa_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_x509_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_ssl_test_lib.a $(LIBDIR)/$(CONFIG)/libbenchmark.a
 else
 privatelibs_cxx:  $(LIBDIR)/$(CONFIG)/libgrpc++_proto_reflection_desc_db.a $(LIBDIR)/$(CONFIG)/libgrpc++_test.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_cli_libs.a $(LIBDIR)/$(CONFIG)/libhttp2_client_main.a $(LIBDIR)/$(CONFIG)/libinterop_client_helper.a $(LIBDIR)/$(CONFIG)/libinterop_client_main.a $(LIBDIR)/$(CONFIG)/libinterop_server_helper.a $(LIBDIR)/$(CONFIG)/libinterop_server_lib.a $(LIBDIR)/$(CONFIG)/libinterop_server_main.a $(LIBDIR)/$(CONFIG)/libqps.a $(LIBDIR)/$(CONFIG)/libbenchmark.a
 endif
@@ -1519,18 +1527,23 @@
   $(BINDIR)/$(CONFIG)/boringssl_bio_test \
   $(BINDIR)/$(CONFIG)/boringssl_bn_test \
   $(BINDIR)/$(CONFIG)/boringssl_bytestring_test \
+  $(BINDIR)/$(CONFIG)/boringssl_chacha_test \
   $(BINDIR)/$(CONFIG)/boringssl_aead_test \
   $(BINDIR)/$(CONFIG)/boringssl_cipher_test \
   $(BINDIR)/$(CONFIG)/boringssl_cmac_test \
   $(BINDIR)/$(CONFIG)/boringssl_constant_time_test \
   $(BINDIR)/$(CONFIG)/boringssl_ed25519_test \
+  $(BINDIR)/$(CONFIG)/boringssl_spake25519_test \
   $(BINDIR)/$(CONFIG)/boringssl_x25519_test \
   $(BINDIR)/$(CONFIG)/boringssl_dh_test \
   $(BINDIR)/$(CONFIG)/boringssl_digest_test \
   $(BINDIR)/$(CONFIG)/boringssl_dsa_test \
   $(BINDIR)/$(CONFIG)/boringssl_ec_test \
   $(BINDIR)/$(CONFIG)/boringssl_example_mul \
+  $(BINDIR)/$(CONFIG)/boringssl_ecdh_test \
+  $(BINDIR)/$(CONFIG)/boringssl_ecdsa_sign_test \
   $(BINDIR)/$(CONFIG)/boringssl_ecdsa_test \
+  $(BINDIR)/$(CONFIG)/boringssl_ecdsa_verify_test \
   $(BINDIR)/$(CONFIG)/boringssl_err_test \
   $(BINDIR)/$(CONFIG)/boringssl_evp_extra_test \
   $(BINDIR)/$(CONFIG)/boringssl_evp_test \
@@ -1539,6 +1552,10 @@
   $(BINDIR)/$(CONFIG)/boringssl_hmac_test \
   $(BINDIR)/$(CONFIG)/boringssl_lhash_test \
   $(BINDIR)/$(CONFIG)/boringssl_gcm_test \
+  $(BINDIR)/$(CONFIG)/boringssl_newhope_statistical_test \
+  $(BINDIR)/$(CONFIG)/boringssl_newhope_test \
+  $(BINDIR)/$(CONFIG)/boringssl_newhope_vectors_test \
+  $(BINDIR)/$(CONFIG)/boringssl_obj_test \
   $(BINDIR)/$(CONFIG)/boringssl_pkcs12_test \
   $(BINDIR)/$(CONFIG)/boringssl_pkcs8_test \
   $(BINDIR)/$(CONFIG)/boringssl_poly1305_test \
@@ -1549,7 +1566,6 @@
   $(BINDIR)/$(CONFIG)/boringssl_x509_test \
   $(BINDIR)/$(CONFIG)/boringssl_tab_test \
   $(BINDIR)/$(CONFIG)/boringssl_v3name_test \
-  $(BINDIR)/$(CONFIG)/boringssl_pqueue_test \
   $(BINDIR)/$(CONFIG)/boringssl_ssl_test \
 
 else
@@ -2815,6 +2831,7 @@
     src/core/ext/client_channel/connector.c \
     src/core/ext/client_channel/default_initial_connect_string.c \
     src/core/ext/client_channel/http_connect_handshaker.c \
+    src/core/ext/client_channel/http_proxy.c \
     src/core/ext/client_channel/initial_connect_string.c \
     src/core/ext/client_channel/lb_policy.c \
     src/core/ext/client_channel/lb_policy_factory.c \
@@ -3094,6 +3111,7 @@
     src/core/ext/client_channel/connector.c \
     src/core/ext/client_channel/default_initial_connect_string.c \
     src/core/ext/client_channel/http_connect_handshaker.c \
+    src/core/ext/client_channel/http_proxy.c \
     src/core/ext/client_channel/initial_connect_string.c \
     src/core/ext/client_channel/lb_policy.c \
     src/core/ext/client_channel/lb_policy_factory.c \
@@ -3612,6 +3630,7 @@
     src/core/ext/client_channel/connector.c \
     src/core/ext/client_channel/default_initial_connect_string.c \
     src/core/ext/client_channel/http_connect_handshaker.c \
+    src/core/ext/client_channel/http_proxy.c \
     src/core/ext/client_channel/initial_connect_string.c \
     src/core/ext/client_channel/lb_policy.c \
     src/core/ext/client_channel/lb_policy_factory.c \
@@ -4172,6 +4191,7 @@
     src/core/ext/client_channel/connector.c \
     src/core/ext/client_channel/default_initial_connect_string.c \
     src/core/ext/client_channel/http_connect_handshaker.c \
+    src/core/ext/client_channel/http_proxy.c \
     src/core/ext/client_channel/initial_connect_string.c \
     src/core/ext/client_channel/lb_policy.c \
     src/core/ext/client_channel/lb_policy_factory.c \
@@ -5305,7 +5325,6 @@
     test/cpp/qps/client_async.cc \
     test/cpp/qps/client_sync.cc \
     test/cpp/qps/driver.cc \
-    test/cpp/qps/limit_cores.cc \
     test/cpp/qps/parse_json.cc \
     test/cpp/qps/qps_worker.cc \
     test/cpp/qps/report.cc \
@@ -5361,7 +5380,6 @@
 $(OBJDIR)/$(CONFIG)/test/cpp/qps/client_async.o: $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/services.pb.cc $(GENDIR)/src/proto/grpc/testing/services.grpc.pb.cc
 $(OBJDIR)/$(CONFIG)/test/cpp/qps/client_sync.o: $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/services.pb.cc $(GENDIR)/src/proto/grpc/testing/services.grpc.pb.cc
 $(OBJDIR)/$(CONFIG)/test/cpp/qps/driver.o: $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/services.pb.cc $(GENDIR)/src/proto/grpc/testing/services.grpc.pb.cc
-$(OBJDIR)/$(CONFIG)/test/cpp/qps/limit_cores.o: $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/services.pb.cc $(GENDIR)/src/proto/grpc/testing/services.grpc.pb.cc
 $(OBJDIR)/$(CONFIG)/test/cpp/qps/parse_json.o: $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/services.pb.cc $(GENDIR)/src/proto/grpc/testing/services.grpc.pb.cc
 $(OBJDIR)/$(CONFIG)/test/cpp/qps/qps_worker.o: $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/services.pb.cc $(GENDIR)/src/proto/grpc/testing/services.grpc.pb.cc
 $(OBJDIR)/$(CONFIG)/test/cpp/qps/report.o: $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/services.pb.cc $(GENDIR)/src/proto/grpc/testing/services.grpc.pb.cc
@@ -5434,7 +5452,6 @@
     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_bytes.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 \
@@ -5453,18 +5470,14 @@
     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/bio_asn1.c \
-    third_party/boringssl/crypto/asn1/bio_ndef.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/t_pkey.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_prn.c \
     third_party/boringssl/crypto/asn1/tasn_typ.c \
     third_party/boringssl/crypto/asn1/tasn_utl.c \
     third_party/boringssl/crypto/asn1/x_bignum.c \
@@ -5494,6 +5507,7 @@
     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 \
@@ -5505,8 +5519,7 @@
     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_generic.c \
-    third_party/boringssl/crypto/chacha/chacha_vec.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 \
@@ -5521,10 +5534,14 @@
     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 \
@@ -5533,8 +5550,6 @@
     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/directory_posix.c \
-    third_party/boringssl/crypto/directory_win.c \
     third_party/boringssl/crypto/dsa/dsa.c \
     third_party/boringssl/crypto/dsa/dsa_asn1.c \
     third_party/boringssl/crypto/ec/ec.c \
@@ -5553,7 +5568,6 @@
     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/algorithm.c \
     third_party/boringssl/crypto/evp/digestsign.c \
     third_party/boringssl/crypto/evp/evp.c \
     third_party/boringssl/crypto/evp/evp_asn1.c \
@@ -5564,6 +5578,7 @@
     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 \
@@ -5577,6 +5592,12 @@
     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/newhope/error_correction.c \
+    third_party/boringssl/crypto/newhope/newhope.c \
+    third_party/boringssl/crypto/newhope/ntt.c \
+    third_party/boringssl/crypto/newhope/poly.c \
+    third_party/boringssl/crypto/newhope/precomp.c \
+    third_party/boringssl/crypto/newhope/reduce.c \
     third_party/boringssl/crypto/obj/obj.c \
     third_party/boringssl/crypto/obj/obj_xref.c \
     third_party/boringssl/crypto/pem/pem_all.c \
@@ -5594,6 +5615,7 @@
     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/rand/deterministic.c \
     third_party/boringssl/crypto/rand/rand.c \
     third_party/boringssl/crypto/rand/urandom.c \
     third_party/boringssl/crypto/rand/windows.c \
@@ -5618,11 +5640,13 @@
     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 \
@@ -5697,21 +5721,17 @@
     third_party/boringssl/crypto/x509v3/v3_utl.c \
     third_party/boringssl/ssl/custom_extensions.c \
     third_party/boringssl/ssl/d1_both.c \
-    third_party/boringssl/ssl/d1_clnt.c \
     third_party/boringssl/ssl/d1_lib.c \
-    third_party/boringssl/ssl/d1_meth.c \
     third_party/boringssl/ssl/d1_pkt.c \
     third_party/boringssl/ssl/d1_srtp.c \
-    third_party/boringssl/ssl/d1_srvr.c \
+    third_party/boringssl/ssl/dtls_method.c \
     third_party/boringssl/ssl/dtls_record.c \
-    third_party/boringssl/ssl/pqueue/pqueue.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_clnt.c \
     third_party/boringssl/ssl/s3_enc.c \
     third_party/boringssl/ssl/s3_lib.c \
-    third_party/boringssl/ssl/s3_meth.c \
     third_party/boringssl/ssl/s3_pkt.c \
-    third_party/boringssl/ssl/s3_srvr.c \
     third_party/boringssl/ssl/ssl_aead_ctx.c \
     third_party/boringssl/ssl/ssl_asn1.c \
     third_party/boringssl/ssl/ssl_buffer.c \
@@ -5725,6 +5745,11 @@
     third_party/boringssl/ssl/ssl_stat.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 \
 
 PUBLIC_HEADERS_C += \
@@ -6019,6 +6044,44 @@
 endif
 
 
+LIBBORINGSSL_CHACHA_TEST_LIB_SRC = \
+    third_party/boringssl/crypto/chacha/chacha_test.cc \
+
+PUBLIC_HEADERS_CXX += \
+
+LIBBORINGSSL_CHACHA_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_CHACHA_TEST_LIB_SRC))))
+
+$(LIBBORINGSSL_CHACHA_TEST_LIB_OBJS): CPPFLAGS += -Ithird_party/boringssl/include -fvisibility=hidden -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX
+$(LIBBORINGSSL_CHACHA_TEST_LIB_OBJS): CFLAGS += -Wno-sign-conversion -Wno-conversion -Wno-unused-value -Wno-unknown-pragmas -Wno-implicit-function-declaration -Wno-unused-variable -Wno-sign-compare $(NO_W_EXTRA_SEMI)
+
+ifeq ($(NO_PROTOBUF),true)
+
+# You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay.
+
+$(LIBDIR)/$(CONFIG)/libboringssl_chacha_test_lib.a: protobuf_dep_error
+
+
+else
+
+$(LIBDIR)/$(CONFIG)/libboringssl_chacha_test_lib.a: $(ZLIB_DEP)  $(PROTOBUF_DEP) $(LIBBORINGSSL_CHACHA_TEST_LIB_OBJS) 
+	$(E) "[AR]      Creating $@"
+	$(Q) mkdir -p `dirname $@`
+	$(Q) rm -f $(LIBDIR)/$(CONFIG)/libboringssl_chacha_test_lib.a
+	$(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libboringssl_chacha_test_lib.a $(LIBBORINGSSL_CHACHA_TEST_LIB_OBJS) 
+ifeq ($(SYSTEM),Darwin)
+	$(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libboringssl_chacha_test_lib.a
+endif
+
+
+
+
+endif
+
+ifneq ($(NO_DEPS),true)
+-include $(LIBBORINGSSL_CHACHA_TEST_LIB_OBJS:.o=.dep)
+endif
+
+
 LIBBORINGSSL_AEAD_TEST_LIB_SRC = \
     third_party/boringssl/crypto/cipher/aead_test.cc \
 
@@ -6198,6 +6261,44 @@
 endif
 
 
+LIBBORINGSSL_SPAKE25519_TEST_LIB_SRC = \
+    third_party/boringssl/crypto/curve25519/spake25519_test.cc \
+
+PUBLIC_HEADERS_CXX += \
+
+LIBBORINGSSL_SPAKE25519_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_SPAKE25519_TEST_LIB_SRC))))
+
+$(LIBBORINGSSL_SPAKE25519_TEST_LIB_OBJS): CPPFLAGS += -Ithird_party/boringssl/include -fvisibility=hidden -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX
+$(LIBBORINGSSL_SPAKE25519_TEST_LIB_OBJS): CFLAGS += -Wno-sign-conversion -Wno-conversion -Wno-unused-value -Wno-unknown-pragmas -Wno-implicit-function-declaration -Wno-unused-variable -Wno-sign-compare $(NO_W_EXTRA_SEMI)
+
+ifeq ($(NO_PROTOBUF),true)
+
+# You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay.
+
+$(LIBDIR)/$(CONFIG)/libboringssl_spake25519_test_lib.a: protobuf_dep_error
+
+
+else
+
+$(LIBDIR)/$(CONFIG)/libboringssl_spake25519_test_lib.a: $(ZLIB_DEP)  $(PROTOBUF_DEP) $(LIBBORINGSSL_SPAKE25519_TEST_LIB_OBJS) 
+	$(E) "[AR]      Creating $@"
+	$(Q) mkdir -p `dirname $@`
+	$(Q) rm -f $(LIBDIR)/$(CONFIG)/libboringssl_spake25519_test_lib.a
+	$(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libboringssl_spake25519_test_lib.a $(LIBBORINGSSL_SPAKE25519_TEST_LIB_OBJS) 
+ifeq ($(SYSTEM),Darwin)
+	$(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libboringssl_spake25519_test_lib.a
+endif
+
+
+
+
+endif
+
+ifneq ($(NO_DEPS),true)
+-include $(LIBBORINGSSL_SPAKE25519_TEST_LIB_OBJS:.o=.dep)
+endif
+
+
 LIBBORINGSSL_X25519_TEST_LIB_SRC = \
     third_party/boringssl/crypto/curve25519/x25519_test.cc \
 
@@ -6404,6 +6505,82 @@
 endif
 
 
+LIBBORINGSSL_ECDH_TEST_LIB_SRC = \
+    third_party/boringssl/crypto/ecdh/ecdh_test.cc \
+
+PUBLIC_HEADERS_CXX += \
+
+LIBBORINGSSL_ECDH_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_ECDH_TEST_LIB_SRC))))
+
+$(LIBBORINGSSL_ECDH_TEST_LIB_OBJS): CPPFLAGS += -Ithird_party/boringssl/include -fvisibility=hidden -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX
+$(LIBBORINGSSL_ECDH_TEST_LIB_OBJS): CFLAGS += -Wno-sign-conversion -Wno-conversion -Wno-unused-value -Wno-unknown-pragmas -Wno-implicit-function-declaration -Wno-unused-variable -Wno-sign-compare $(NO_W_EXTRA_SEMI)
+
+ifeq ($(NO_PROTOBUF),true)
+
+# You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay.
+
+$(LIBDIR)/$(CONFIG)/libboringssl_ecdh_test_lib.a: protobuf_dep_error
+
+
+else
+
+$(LIBDIR)/$(CONFIG)/libboringssl_ecdh_test_lib.a: $(ZLIB_DEP)  $(PROTOBUF_DEP) $(LIBBORINGSSL_ECDH_TEST_LIB_OBJS) 
+	$(E) "[AR]      Creating $@"
+	$(Q) mkdir -p `dirname $@`
+	$(Q) rm -f $(LIBDIR)/$(CONFIG)/libboringssl_ecdh_test_lib.a
+	$(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libboringssl_ecdh_test_lib.a $(LIBBORINGSSL_ECDH_TEST_LIB_OBJS) 
+ifeq ($(SYSTEM),Darwin)
+	$(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libboringssl_ecdh_test_lib.a
+endif
+
+
+
+
+endif
+
+ifneq ($(NO_DEPS),true)
+-include $(LIBBORINGSSL_ECDH_TEST_LIB_OBJS:.o=.dep)
+endif
+
+
+LIBBORINGSSL_ECDSA_SIGN_TEST_LIB_SRC = \
+    third_party/boringssl/crypto/ecdsa/ecdsa_sign_test.cc \
+
+PUBLIC_HEADERS_CXX += \
+
+LIBBORINGSSL_ECDSA_SIGN_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_ECDSA_SIGN_TEST_LIB_SRC))))
+
+$(LIBBORINGSSL_ECDSA_SIGN_TEST_LIB_OBJS): CPPFLAGS += -Ithird_party/boringssl/include -fvisibility=hidden -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX
+$(LIBBORINGSSL_ECDSA_SIGN_TEST_LIB_OBJS): CFLAGS += -Wno-sign-conversion -Wno-conversion -Wno-unused-value -Wno-unknown-pragmas -Wno-implicit-function-declaration -Wno-unused-variable -Wno-sign-compare $(NO_W_EXTRA_SEMI)
+
+ifeq ($(NO_PROTOBUF),true)
+
+# You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay.
+
+$(LIBDIR)/$(CONFIG)/libboringssl_ecdsa_sign_test_lib.a: protobuf_dep_error
+
+
+else
+
+$(LIBDIR)/$(CONFIG)/libboringssl_ecdsa_sign_test_lib.a: $(ZLIB_DEP)  $(PROTOBUF_DEP) $(LIBBORINGSSL_ECDSA_SIGN_TEST_LIB_OBJS) 
+	$(E) "[AR]      Creating $@"
+	$(Q) mkdir -p `dirname $@`
+	$(Q) rm -f $(LIBDIR)/$(CONFIG)/libboringssl_ecdsa_sign_test_lib.a
+	$(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libboringssl_ecdsa_sign_test_lib.a $(LIBBORINGSSL_ECDSA_SIGN_TEST_LIB_OBJS) 
+ifeq ($(SYSTEM),Darwin)
+	$(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libboringssl_ecdsa_sign_test_lib.a
+endif
+
+
+
+
+endif
+
+ifneq ($(NO_DEPS),true)
+-include $(LIBBORINGSSL_ECDSA_SIGN_TEST_LIB_OBJS:.o=.dep)
+endif
+
+
 LIBBORINGSSL_ECDSA_TEST_LIB_SRC = \
     third_party/boringssl/crypto/ecdsa/ecdsa_test.cc \
 
@@ -6442,6 +6619,44 @@
 endif
 
 
+LIBBORINGSSL_ECDSA_VERIFY_TEST_LIB_SRC = \
+    third_party/boringssl/crypto/ecdsa/ecdsa_verify_test.cc \
+
+PUBLIC_HEADERS_CXX += \
+
+LIBBORINGSSL_ECDSA_VERIFY_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_ECDSA_VERIFY_TEST_LIB_SRC))))
+
+$(LIBBORINGSSL_ECDSA_VERIFY_TEST_LIB_OBJS): CPPFLAGS += -Ithird_party/boringssl/include -fvisibility=hidden -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX
+$(LIBBORINGSSL_ECDSA_VERIFY_TEST_LIB_OBJS): CFLAGS += -Wno-sign-conversion -Wno-conversion -Wno-unused-value -Wno-unknown-pragmas -Wno-implicit-function-declaration -Wno-unused-variable -Wno-sign-compare $(NO_W_EXTRA_SEMI)
+
+ifeq ($(NO_PROTOBUF),true)
+
+# You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay.
+
+$(LIBDIR)/$(CONFIG)/libboringssl_ecdsa_verify_test_lib.a: protobuf_dep_error
+
+
+else
+
+$(LIBDIR)/$(CONFIG)/libboringssl_ecdsa_verify_test_lib.a: $(ZLIB_DEP)  $(PROTOBUF_DEP) $(LIBBORINGSSL_ECDSA_VERIFY_TEST_LIB_OBJS) 
+	$(E) "[AR]      Creating $@"
+	$(Q) mkdir -p `dirname $@`
+	$(Q) rm -f $(LIBDIR)/$(CONFIG)/libboringssl_ecdsa_verify_test_lib.a
+	$(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libboringssl_ecdsa_verify_test_lib.a $(LIBBORINGSSL_ECDSA_VERIFY_TEST_LIB_OBJS) 
+ifeq ($(SYSTEM),Darwin)
+	$(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libboringssl_ecdsa_verify_test_lib.a
+endif
+
+
+
+
+endif
+
+ifneq ($(NO_DEPS),true)
+-include $(LIBBORINGSSL_ECDSA_VERIFY_TEST_LIB_OBJS:.o=.dep)
+endif
+
+
 LIBBORINGSSL_ERR_TEST_LIB_SRC = \
     third_party/boringssl/crypto/err/err_test.cc \
 
@@ -6687,16 +6902,25 @@
 
 
 LIBBORINGSSL_GCM_TEST_LIB_SRC = \
-    third_party/boringssl/crypto/modes/gcm_test.c \
+    third_party/boringssl/crypto/modes/gcm_test.cc \
 
-PUBLIC_HEADERS_C += \
+PUBLIC_HEADERS_CXX += \
 
 LIBBORINGSSL_GCM_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_GCM_TEST_LIB_SRC))))
 
 $(LIBBORINGSSL_GCM_TEST_LIB_OBJS): CPPFLAGS += -Ithird_party/boringssl/include -fvisibility=hidden -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX
 $(LIBBORINGSSL_GCM_TEST_LIB_OBJS): CFLAGS += -Wno-sign-conversion -Wno-conversion -Wno-unused-value -Wno-unknown-pragmas -Wno-implicit-function-declaration -Wno-unused-variable -Wno-sign-compare $(NO_W_EXTRA_SEMI)
 
-$(LIBDIR)/$(CONFIG)/libboringssl_gcm_test_lib.a: $(ZLIB_DEP)  $(LIBBORINGSSL_GCM_TEST_LIB_OBJS) 
+ifeq ($(NO_PROTOBUF),true)
+
+# You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay.
+
+$(LIBDIR)/$(CONFIG)/libboringssl_gcm_test_lib.a: protobuf_dep_error
+
+
+else
+
+$(LIBDIR)/$(CONFIG)/libboringssl_gcm_test_lib.a: $(ZLIB_DEP)  $(PROTOBUF_DEP) $(LIBBORINGSSL_GCM_TEST_LIB_OBJS) 
 	$(E) "[AR]      Creating $@"
 	$(Q) mkdir -p `dirname $@`
 	$(Q) rm -f $(LIBDIR)/$(CONFIG)/libboringssl_gcm_test_lib.a
@@ -6708,11 +6932,165 @@
 
 
 
+endif
+
 ifneq ($(NO_DEPS),true)
 -include $(LIBBORINGSSL_GCM_TEST_LIB_OBJS:.o=.dep)
 endif
 
 
+LIBBORINGSSL_NEWHOPE_STATISTICAL_TEST_LIB_SRC = \
+    third_party/boringssl/crypto/newhope/newhope_statistical_test.cc \
+
+PUBLIC_HEADERS_CXX += \
+
+LIBBORINGSSL_NEWHOPE_STATISTICAL_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_NEWHOPE_STATISTICAL_TEST_LIB_SRC))))
+
+$(LIBBORINGSSL_NEWHOPE_STATISTICAL_TEST_LIB_OBJS): CPPFLAGS += -Ithird_party/boringssl/include -fvisibility=hidden -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX
+$(LIBBORINGSSL_NEWHOPE_STATISTICAL_TEST_LIB_OBJS): CFLAGS += -Wno-sign-conversion -Wno-conversion -Wno-unused-value -Wno-unknown-pragmas -Wno-implicit-function-declaration -Wno-unused-variable -Wno-sign-compare $(NO_W_EXTRA_SEMI)
+
+ifeq ($(NO_PROTOBUF),true)
+
+# You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay.
+
+$(LIBDIR)/$(CONFIG)/libboringssl_newhope_statistical_test_lib.a: protobuf_dep_error
+
+
+else
+
+$(LIBDIR)/$(CONFIG)/libboringssl_newhope_statistical_test_lib.a: $(ZLIB_DEP)  $(PROTOBUF_DEP) $(LIBBORINGSSL_NEWHOPE_STATISTICAL_TEST_LIB_OBJS) 
+	$(E) "[AR]      Creating $@"
+	$(Q) mkdir -p `dirname $@`
+	$(Q) rm -f $(LIBDIR)/$(CONFIG)/libboringssl_newhope_statistical_test_lib.a
+	$(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libboringssl_newhope_statistical_test_lib.a $(LIBBORINGSSL_NEWHOPE_STATISTICAL_TEST_LIB_OBJS) 
+ifeq ($(SYSTEM),Darwin)
+	$(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libboringssl_newhope_statistical_test_lib.a
+endif
+
+
+
+
+endif
+
+ifneq ($(NO_DEPS),true)
+-include $(LIBBORINGSSL_NEWHOPE_STATISTICAL_TEST_LIB_OBJS:.o=.dep)
+endif
+
+
+LIBBORINGSSL_NEWHOPE_TEST_LIB_SRC = \
+    third_party/boringssl/crypto/newhope/newhope_test.cc \
+
+PUBLIC_HEADERS_CXX += \
+
+LIBBORINGSSL_NEWHOPE_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_NEWHOPE_TEST_LIB_SRC))))
+
+$(LIBBORINGSSL_NEWHOPE_TEST_LIB_OBJS): CPPFLAGS += -Ithird_party/boringssl/include -fvisibility=hidden -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX
+$(LIBBORINGSSL_NEWHOPE_TEST_LIB_OBJS): CFLAGS += -Wno-sign-conversion -Wno-conversion -Wno-unused-value -Wno-unknown-pragmas -Wno-implicit-function-declaration -Wno-unused-variable -Wno-sign-compare $(NO_W_EXTRA_SEMI)
+
+ifeq ($(NO_PROTOBUF),true)
+
+# You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay.
+
+$(LIBDIR)/$(CONFIG)/libboringssl_newhope_test_lib.a: protobuf_dep_error
+
+
+else
+
+$(LIBDIR)/$(CONFIG)/libboringssl_newhope_test_lib.a: $(ZLIB_DEP)  $(PROTOBUF_DEP) $(LIBBORINGSSL_NEWHOPE_TEST_LIB_OBJS) 
+	$(E) "[AR]      Creating $@"
+	$(Q) mkdir -p `dirname $@`
+	$(Q) rm -f $(LIBDIR)/$(CONFIG)/libboringssl_newhope_test_lib.a
+	$(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libboringssl_newhope_test_lib.a $(LIBBORINGSSL_NEWHOPE_TEST_LIB_OBJS) 
+ifeq ($(SYSTEM),Darwin)
+	$(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libboringssl_newhope_test_lib.a
+endif
+
+
+
+
+endif
+
+ifneq ($(NO_DEPS),true)
+-include $(LIBBORINGSSL_NEWHOPE_TEST_LIB_OBJS:.o=.dep)
+endif
+
+
+LIBBORINGSSL_NEWHOPE_VECTORS_TEST_LIB_SRC = \
+    third_party/boringssl/crypto/newhope/newhope_vectors_test.cc \
+
+PUBLIC_HEADERS_CXX += \
+
+LIBBORINGSSL_NEWHOPE_VECTORS_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_NEWHOPE_VECTORS_TEST_LIB_SRC))))
+
+$(LIBBORINGSSL_NEWHOPE_VECTORS_TEST_LIB_OBJS): CPPFLAGS += -Ithird_party/boringssl/include -fvisibility=hidden -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX
+$(LIBBORINGSSL_NEWHOPE_VECTORS_TEST_LIB_OBJS): CFLAGS += -Wno-sign-conversion -Wno-conversion -Wno-unused-value -Wno-unknown-pragmas -Wno-implicit-function-declaration -Wno-unused-variable -Wno-sign-compare $(NO_W_EXTRA_SEMI)
+
+ifeq ($(NO_PROTOBUF),true)
+
+# You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay.
+
+$(LIBDIR)/$(CONFIG)/libboringssl_newhope_vectors_test_lib.a: protobuf_dep_error
+
+
+else
+
+$(LIBDIR)/$(CONFIG)/libboringssl_newhope_vectors_test_lib.a: $(ZLIB_DEP)  $(PROTOBUF_DEP) $(LIBBORINGSSL_NEWHOPE_VECTORS_TEST_LIB_OBJS) 
+	$(E) "[AR]      Creating $@"
+	$(Q) mkdir -p `dirname $@`
+	$(Q) rm -f $(LIBDIR)/$(CONFIG)/libboringssl_newhope_vectors_test_lib.a
+	$(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libboringssl_newhope_vectors_test_lib.a $(LIBBORINGSSL_NEWHOPE_VECTORS_TEST_LIB_OBJS) 
+ifeq ($(SYSTEM),Darwin)
+	$(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libboringssl_newhope_vectors_test_lib.a
+endif
+
+
+
+
+endif
+
+ifneq ($(NO_DEPS),true)
+-include $(LIBBORINGSSL_NEWHOPE_VECTORS_TEST_LIB_OBJS:.o=.dep)
+endif
+
+
+LIBBORINGSSL_OBJ_TEST_LIB_SRC = \
+    third_party/boringssl/crypto/obj/obj_test.cc \
+
+PUBLIC_HEADERS_CXX += \
+
+LIBBORINGSSL_OBJ_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_OBJ_TEST_LIB_SRC))))
+
+$(LIBBORINGSSL_OBJ_TEST_LIB_OBJS): CPPFLAGS += -Ithird_party/boringssl/include -fvisibility=hidden -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX
+$(LIBBORINGSSL_OBJ_TEST_LIB_OBJS): CFLAGS += -Wno-sign-conversion -Wno-conversion -Wno-unused-value -Wno-unknown-pragmas -Wno-implicit-function-declaration -Wno-unused-variable -Wno-sign-compare $(NO_W_EXTRA_SEMI)
+
+ifeq ($(NO_PROTOBUF),true)
+
+# You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay.
+
+$(LIBDIR)/$(CONFIG)/libboringssl_obj_test_lib.a: protobuf_dep_error
+
+
+else
+
+$(LIBDIR)/$(CONFIG)/libboringssl_obj_test_lib.a: $(ZLIB_DEP)  $(PROTOBUF_DEP) $(LIBBORINGSSL_OBJ_TEST_LIB_OBJS) 
+	$(E) "[AR]      Creating $@"
+	$(Q) mkdir -p `dirname $@`
+	$(Q) rm -f $(LIBDIR)/$(CONFIG)/libboringssl_obj_test_lib.a
+	$(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libboringssl_obj_test_lib.a $(LIBBORINGSSL_OBJ_TEST_LIB_OBJS) 
+ifeq ($(SYSTEM),Darwin)
+	$(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libboringssl_obj_test_lib.a
+endif
+
+
+
+
+endif
+
+ifneq ($(NO_DEPS),true)
+-include $(LIBBORINGSSL_OBJ_TEST_LIB_OBJS:.o=.dep)
+endif
+
+
 LIBBORINGSSL_PKCS12_TEST_LIB_SRC = \
     third_party/boringssl/crypto/pkcs8/pkcs12_test.cc \
 
@@ -7038,33 +7416,6 @@
 endif
 
 
-LIBBORINGSSL_PQUEUE_TEST_LIB_SRC = \
-    third_party/boringssl/ssl/pqueue/pqueue_test.c \
-
-PUBLIC_HEADERS_C += \
-
-LIBBORINGSSL_PQUEUE_TEST_LIB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_PQUEUE_TEST_LIB_SRC))))
-
-$(LIBBORINGSSL_PQUEUE_TEST_LIB_OBJS): CPPFLAGS += -Ithird_party/boringssl/include -fvisibility=hidden -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX
-$(LIBBORINGSSL_PQUEUE_TEST_LIB_OBJS): CFLAGS += -Wno-sign-conversion -Wno-conversion -Wno-unused-value -Wno-unknown-pragmas -Wno-implicit-function-declaration -Wno-unused-variable -Wno-sign-compare $(NO_W_EXTRA_SEMI)
-
-$(LIBDIR)/$(CONFIG)/libboringssl_pqueue_test_lib.a: $(ZLIB_DEP)  $(LIBBORINGSSL_PQUEUE_TEST_LIB_OBJS) 
-	$(E) "[AR]      Creating $@"
-	$(Q) mkdir -p `dirname $@`
-	$(Q) rm -f $(LIBDIR)/$(CONFIG)/libboringssl_pqueue_test_lib.a
-	$(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libboringssl_pqueue_test_lib.a $(LIBBORINGSSL_PQUEUE_TEST_LIB_OBJS) 
-ifeq ($(SYSTEM),Darwin)
-	$(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libboringssl_pqueue_test_lib.a
-endif
-
-
-
-
-ifneq ($(NO_DEPS),true)
--include $(LIBBORINGSSL_PQUEUE_TEST_LIB_OBJS:.o=.dep)
-endif
-
-
 LIBBORINGSSL_SSL_TEST_LIB_SRC = \
     third_party/boringssl/ssl/ssl_test.cc \
 
@@ -13070,18 +13421,18 @@
 
 else
 
-$(BINDIR)/$(CONFIG)/grpclb_test: $(PROTOBUF_DEP) $(GRPCLB_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a
+$(BINDIR)/$(CONFIG)/grpclb_test: $(PROTOBUF_DEP) $(GRPCLB_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
 	$(E) "[LD]      Linking $@"
 	$(Q) mkdir -p `dirname $@`
-	$(Q) $(LDXX) $(LDFLAGS) $(GRPCLB_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/grpclb_test
+	$(Q) $(LDXX) $(LDFLAGS) $(GRPCLB_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/grpclb_test
 
 endif
 
 endif
 
-$(OBJDIR)/$(CONFIG)/src/proto/grpc/lb/v1/load_balancer.o:  $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a
+$(OBJDIR)/$(CONFIG)/src/proto/grpc/lb/v1/load_balancer.o:  $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
 
-$(OBJDIR)/$(CONFIG)/test/cpp/grpclb/grpclb_test.o:  $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a
+$(OBJDIR)/$(CONFIG)/test/cpp/grpclb/grpclb_test.o:  $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
 
 deps_grpclb_test: $(GRPCLB_TEST_OBJS:.o=.dep)
 
@@ -14204,10 +14555,10 @@
     $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc \
     $(GENDIR)/src/proto/grpc/testing/metrics.pb.cc $(GENDIR)/src/proto/grpc/testing/metrics.grpc.pb.cc \
     $(GENDIR)/src/proto/grpc/testing/test.pb.cc $(GENDIR)/src/proto/grpc/testing/test.grpc.pb.cc \
-    test/cpp/interop/client_helper.cc \
     test/cpp/interop/interop_client.cc \
     test/cpp/interop/stress_interop_client.cc \
     test/cpp/interop/stress_test.cc \
+    test/cpp/util/create_test_channel.cc \
     test/cpp/util/metrics_server.cc \
 
 STRESS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(STRESS_TEST_SRC))))
@@ -14247,14 +14598,14 @@
 
 $(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/test.o:  $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a
 
-$(OBJDIR)/$(CONFIG)/test/cpp/interop/client_helper.o:  $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a
-
 $(OBJDIR)/$(CONFIG)/test/cpp/interop/interop_client.o:  $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a
 
 $(OBJDIR)/$(CONFIG)/test/cpp/interop/stress_interop_client.o:  $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a
 
 $(OBJDIR)/$(CONFIG)/test/cpp/interop/stress_test.o:  $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a
 
+$(OBJDIR)/$(CONFIG)/test/cpp/util/create_test_channel.o:  $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a
+
 $(OBJDIR)/$(CONFIG)/test/cpp/util/metrics_server.o:  $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a
 
 deps_stress_test: $(STRESS_TEST_OBJS:.o=.dep)
@@ -14264,10 +14615,10 @@
 -include $(STRESS_TEST_OBJS:.o=.dep)
 endif
 endif
-$(OBJDIR)/$(CONFIG)/test/cpp/interop/client_helper.o: $(GENDIR)/src/proto/grpc/testing/empty.pb.cc $(GENDIR)/src/proto/grpc/testing/empty.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/metrics.pb.cc $(GENDIR)/src/proto/grpc/testing/metrics.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/test.pb.cc $(GENDIR)/src/proto/grpc/testing/test.grpc.pb.cc
 $(OBJDIR)/$(CONFIG)/test/cpp/interop/interop_client.o: $(GENDIR)/src/proto/grpc/testing/empty.pb.cc $(GENDIR)/src/proto/grpc/testing/empty.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/metrics.pb.cc $(GENDIR)/src/proto/grpc/testing/metrics.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/test.pb.cc $(GENDIR)/src/proto/grpc/testing/test.grpc.pb.cc
 $(OBJDIR)/$(CONFIG)/test/cpp/interop/stress_interop_client.o: $(GENDIR)/src/proto/grpc/testing/empty.pb.cc $(GENDIR)/src/proto/grpc/testing/empty.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/metrics.pb.cc $(GENDIR)/src/proto/grpc/testing/metrics.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/test.pb.cc $(GENDIR)/src/proto/grpc/testing/test.grpc.pb.cc
 $(OBJDIR)/$(CONFIG)/test/cpp/interop/stress_test.o: $(GENDIR)/src/proto/grpc/testing/empty.pb.cc $(GENDIR)/src/proto/grpc/testing/empty.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/metrics.pb.cc $(GENDIR)/src/proto/grpc/testing/metrics.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/test.pb.cc $(GENDIR)/src/proto/grpc/testing/test.grpc.pb.cc
+$(OBJDIR)/$(CONFIG)/test/cpp/util/create_test_channel.o: $(GENDIR)/src/proto/grpc/testing/empty.pb.cc $(GENDIR)/src/proto/grpc/testing/empty.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/metrics.pb.cc $(GENDIR)/src/proto/grpc/testing/metrics.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/test.pb.cc $(GENDIR)/src/proto/grpc/testing/test.grpc.pb.cc
 $(OBJDIR)/$(CONFIG)/test/cpp/util/metrics_server.o: $(GENDIR)/src/proto/grpc/testing/empty.pb.cc $(GENDIR)/src/proto/grpc/testing/empty.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/metrics.pb.cc $(GENDIR)/src/proto/grpc/testing/metrics.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/test.pb.cc $(GENDIR)/src/proto/grpc/testing/test.grpc.pb.cc
 
 
@@ -14559,6 +14910,33 @@
 # boringssl needs an override to ensure that it does not include
 # system openssl headers regardless of other configuration
 # we do so here with a target specific variable assignment
+$(BORINGSSL_CHACHA_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
+$(BORINGSSL_CHACHA_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
+$(BORINGSSL_CHACHA_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
+
+
+ifeq ($(NO_PROTOBUF),true)
+
+# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.0.0+.
+
+$(BINDIR)/$(CONFIG)/boringssl_chacha_test: protobuf_dep_error
+
+else
+
+$(BINDIR)/$(CONFIG)/boringssl_chacha_test:  $(LIBDIR)/$(CONFIG)/libboringssl_chacha_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a
+	$(E) "[LD]      Linking $@"
+	$(Q) mkdir -p `dirname $@`
+	$(Q) $(LDXX) $(LDFLAGS)  $(LIBDIR)/$(CONFIG)/libboringssl_chacha_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/boringssl_chacha_test
+
+endif
+
+
+
+
+
+# boringssl needs an override to ensure that it does not include
+# system openssl headers regardless of other configuration
+# we do so here with a target specific variable assignment
 $(BORINGSSL_AEAD_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_AEAD_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_AEAD_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
@@ -14694,6 +15072,33 @@
 # boringssl needs an override to ensure that it does not include
 # system openssl headers regardless of other configuration
 # we do so here with a target specific variable assignment
+$(BORINGSSL_SPAKE25519_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
+$(BORINGSSL_SPAKE25519_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
+$(BORINGSSL_SPAKE25519_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
+
+
+ifeq ($(NO_PROTOBUF),true)
+
+# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.0.0+.
+
+$(BINDIR)/$(CONFIG)/boringssl_spake25519_test: protobuf_dep_error
+
+else
+
+$(BINDIR)/$(CONFIG)/boringssl_spake25519_test:  $(LIBDIR)/$(CONFIG)/libboringssl_spake25519_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a
+	$(E) "[LD]      Linking $@"
+	$(Q) mkdir -p `dirname $@`
+	$(Q) $(LDXX) $(LDFLAGS)  $(LIBDIR)/$(CONFIG)/libboringssl_spake25519_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/boringssl_spake25519_test
+
+endif
+
+
+
+
+
+# boringssl needs an override to ensure that it does not include
+# system openssl headers regardless of other configuration
+# we do so here with a target specific variable assignment
 $(BORINGSSL_X25519_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_X25519_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_X25519_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
@@ -14856,6 +15261,60 @@
 # boringssl needs an override to ensure that it does not include
 # system openssl headers regardless of other configuration
 # we do so here with a target specific variable assignment
+$(BORINGSSL_ECDH_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
+$(BORINGSSL_ECDH_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
+$(BORINGSSL_ECDH_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
+
+
+ifeq ($(NO_PROTOBUF),true)
+
+# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.0.0+.
+
+$(BINDIR)/$(CONFIG)/boringssl_ecdh_test: protobuf_dep_error
+
+else
+
+$(BINDIR)/$(CONFIG)/boringssl_ecdh_test:  $(LIBDIR)/$(CONFIG)/libboringssl_ecdh_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a
+	$(E) "[LD]      Linking $@"
+	$(Q) mkdir -p `dirname $@`
+	$(Q) $(LDXX) $(LDFLAGS)  $(LIBDIR)/$(CONFIG)/libboringssl_ecdh_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/boringssl_ecdh_test
+
+endif
+
+
+
+
+
+# boringssl needs an override to ensure that it does not include
+# system openssl headers regardless of other configuration
+# we do so here with a target specific variable assignment
+$(BORINGSSL_ECDSA_SIGN_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
+$(BORINGSSL_ECDSA_SIGN_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
+$(BORINGSSL_ECDSA_SIGN_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
+
+
+ifeq ($(NO_PROTOBUF),true)
+
+# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.0.0+.
+
+$(BINDIR)/$(CONFIG)/boringssl_ecdsa_sign_test: protobuf_dep_error
+
+else
+
+$(BINDIR)/$(CONFIG)/boringssl_ecdsa_sign_test:  $(LIBDIR)/$(CONFIG)/libboringssl_ecdsa_sign_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a
+	$(E) "[LD]      Linking $@"
+	$(Q) mkdir -p `dirname $@`
+	$(Q) $(LDXX) $(LDFLAGS)  $(LIBDIR)/$(CONFIG)/libboringssl_ecdsa_sign_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/boringssl_ecdsa_sign_test
+
+endif
+
+
+
+
+
+# boringssl needs an override to ensure that it does not include
+# system openssl headers regardless of other configuration
+# we do so here with a target specific variable assignment
 $(BORINGSSL_ECDSA_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_ECDSA_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_ECDSA_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
@@ -14883,6 +15342,33 @@
 # boringssl needs an override to ensure that it does not include
 # system openssl headers regardless of other configuration
 # we do so here with a target specific variable assignment
+$(BORINGSSL_ECDSA_VERIFY_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
+$(BORINGSSL_ECDSA_VERIFY_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
+$(BORINGSSL_ECDSA_VERIFY_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
+
+
+ifeq ($(NO_PROTOBUF),true)
+
+# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.0.0+.
+
+$(BINDIR)/$(CONFIG)/boringssl_ecdsa_verify_test: protobuf_dep_error
+
+else
+
+$(BINDIR)/$(CONFIG)/boringssl_ecdsa_verify_test:  $(LIBDIR)/$(CONFIG)/libboringssl_ecdsa_verify_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a
+	$(E) "[LD]      Linking $@"
+	$(Q) mkdir -p `dirname $@`
+	$(Q) $(LDXX) $(LDFLAGS)  $(LIBDIR)/$(CONFIG)/libboringssl_ecdsa_verify_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/boringssl_ecdsa_verify_test
+
+endif
+
+
+
+
+
+# boringssl needs an override to ensure that it does not include
+# system openssl headers regardless of other configuration
+# we do so here with a target specific variable assignment
 $(BORINGSSL_ERR_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_ERR_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_ERR_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
@@ -15099,6 +15585,114 @@
 # boringssl needs an override to ensure that it does not include
 # system openssl headers regardless of other configuration
 # we do so here with a target specific variable assignment
+$(BORINGSSL_NEWHOPE_STATISTICAL_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
+$(BORINGSSL_NEWHOPE_STATISTICAL_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
+$(BORINGSSL_NEWHOPE_STATISTICAL_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
+
+
+ifeq ($(NO_PROTOBUF),true)
+
+# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.0.0+.
+
+$(BINDIR)/$(CONFIG)/boringssl_newhope_statistical_test: protobuf_dep_error
+
+else
+
+$(BINDIR)/$(CONFIG)/boringssl_newhope_statistical_test:  $(LIBDIR)/$(CONFIG)/libboringssl_newhope_statistical_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a
+	$(E) "[LD]      Linking $@"
+	$(Q) mkdir -p `dirname $@`
+	$(Q) $(LDXX) $(LDFLAGS)  $(LIBDIR)/$(CONFIG)/libboringssl_newhope_statistical_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/boringssl_newhope_statistical_test
+
+endif
+
+
+
+
+
+# boringssl needs an override to ensure that it does not include
+# system openssl headers regardless of other configuration
+# we do so here with a target specific variable assignment
+$(BORINGSSL_NEWHOPE_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
+$(BORINGSSL_NEWHOPE_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
+$(BORINGSSL_NEWHOPE_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
+
+
+ifeq ($(NO_PROTOBUF),true)
+
+# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.0.0+.
+
+$(BINDIR)/$(CONFIG)/boringssl_newhope_test: protobuf_dep_error
+
+else
+
+$(BINDIR)/$(CONFIG)/boringssl_newhope_test:  $(LIBDIR)/$(CONFIG)/libboringssl_newhope_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a
+	$(E) "[LD]      Linking $@"
+	$(Q) mkdir -p `dirname $@`
+	$(Q) $(LDXX) $(LDFLAGS)  $(LIBDIR)/$(CONFIG)/libboringssl_newhope_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/boringssl_newhope_test
+
+endif
+
+
+
+
+
+# boringssl needs an override to ensure that it does not include
+# system openssl headers regardless of other configuration
+# we do so here with a target specific variable assignment
+$(BORINGSSL_NEWHOPE_VECTORS_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
+$(BORINGSSL_NEWHOPE_VECTORS_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
+$(BORINGSSL_NEWHOPE_VECTORS_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
+
+
+ifeq ($(NO_PROTOBUF),true)
+
+# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.0.0+.
+
+$(BINDIR)/$(CONFIG)/boringssl_newhope_vectors_test: protobuf_dep_error
+
+else
+
+$(BINDIR)/$(CONFIG)/boringssl_newhope_vectors_test:  $(LIBDIR)/$(CONFIG)/libboringssl_newhope_vectors_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a
+	$(E) "[LD]      Linking $@"
+	$(Q) mkdir -p `dirname $@`
+	$(Q) $(LDXX) $(LDFLAGS)  $(LIBDIR)/$(CONFIG)/libboringssl_newhope_vectors_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/boringssl_newhope_vectors_test
+
+endif
+
+
+
+
+
+# boringssl needs an override to ensure that it does not include
+# system openssl headers regardless of other configuration
+# we do so here with a target specific variable assignment
+$(BORINGSSL_OBJ_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
+$(BORINGSSL_OBJ_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
+$(BORINGSSL_OBJ_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
+
+
+ifeq ($(NO_PROTOBUF),true)
+
+# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.0.0+.
+
+$(BINDIR)/$(CONFIG)/boringssl_obj_test: protobuf_dep_error
+
+else
+
+$(BINDIR)/$(CONFIG)/boringssl_obj_test:  $(LIBDIR)/$(CONFIG)/libboringssl_obj_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a
+	$(E) "[LD]      Linking $@"
+	$(Q) mkdir -p `dirname $@`
+	$(Q) $(LDXX) $(LDFLAGS)  $(LIBDIR)/$(CONFIG)/libboringssl_obj_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/boringssl_obj_test
+
+endif
+
+
+
+
+
+# boringssl needs an override to ensure that it does not include
+# system openssl headers regardless of other configuration
+# we do so here with a target specific variable assignment
 $(BORINGSSL_PKCS12_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_PKCS12_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_PKCS12_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
@@ -15369,33 +15963,6 @@
 # boringssl needs an override to ensure that it does not include
 # system openssl headers regardless of other configuration
 # we do so here with a target specific variable assignment
-$(BORINGSSL_PQUEUE_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
-$(BORINGSSL_PQUEUE_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
-$(BORINGSSL_PQUEUE_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
-
-
-ifeq ($(NO_PROTOBUF),true)
-
-# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.0.0+.
-
-$(BINDIR)/$(CONFIG)/boringssl_pqueue_test: protobuf_dep_error
-
-else
-
-$(BINDIR)/$(CONFIG)/boringssl_pqueue_test:  $(LIBDIR)/$(CONFIG)/libboringssl_pqueue_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a
-	$(E) "[LD]      Linking $@"
-	$(Q) mkdir -p `dirname $@`
-	$(Q) $(LDXX) $(LDFLAGS)  $(LIBDIR)/$(CONFIG)/libboringssl_pqueue_test_lib.a $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/boringssl_pqueue_test
-
-endif
-
-
-
-
-
-# boringssl needs an override to ensure that it does not include
-# system openssl headers regardless of other configuration
-# we do so here with a target specific variable assignment
 $(BORINGSSL_SSL_TEST_OBJS): CFLAGS := -Ithird_party/boringssl/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI)
 $(BORINGSSL_SSL_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl/include $(CXXFLAGS)
 $(BORINGSSL_SSL_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE
@@ -17049,7 +17616,6 @@
 test/cpp/qps/client_async.cc: $(OPENSSL_DEP)
 test/cpp/qps/client_sync.cc: $(OPENSSL_DEP)
 test/cpp/qps/driver.cc: $(OPENSSL_DEP)
-test/cpp/qps/limit_cores.cc: $(OPENSSL_DEP)
 test/cpp/qps/parse_json.cc: $(OPENSSL_DEP)
 test/cpp/qps/qps_worker.cc: $(OPENSSL_DEP)
 test/cpp/qps/report.cc: $(OPENSSL_DEP)
diff --git a/Rakefile b/Rakefile
index cfd4181..c8bca20 100755
--- a/Rakefile
+++ b/Rakefile
@@ -5,6 +5,8 @@
 require 'bundler/gem_tasks'
 require 'fileutils'
 
+require_relative 'build_config.rb'
+
 load 'tools/distrib/docker_for_windows.rb'
 
 # Add rubocop style checking tasks
@@ -83,7 +85,7 @@
   env += 'EMBED_ZLIB=true '
   env += 'BUILDDIR=/tmp '
   env += "V=#{verbose} "
-  out = '/tmp/libs/opt/grpc-1.dll'
+  out = GrpcBuildConfig::CORE_WINDOWS_DLL
 
   w64 = { cross: 'x86_64-w64-mingw32', out: 'grpc_c.64.ruby' }
   w32 = { cross: 'i686-w64-mingw32', out: 'grpc_c.32.ruby' }
diff --git a/binding.gyp b/binding.gyp
index dd6db14..9328a30 100644
--- a/binding.gyp
+++ b/binding.gyp
@@ -161,7 +161,6 @@
             '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_bytes.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',
@@ -180,18 +179,14 @@
             '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/bio_asn1.c',
-            'third_party/boringssl/crypto/asn1/bio_ndef.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/t_pkey.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_prn.c',
             'third_party/boringssl/crypto/asn1/tasn_typ.c',
             'third_party/boringssl/crypto/asn1/tasn_utl.c',
             'third_party/boringssl/crypto/asn1/x_bignum.c',
@@ -221,6 +216,7 @@
             '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',
@@ -232,8 +228,7 @@
             '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_generic.c',
-            'third_party/boringssl/crypto/chacha/chacha_vec.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',
@@ -248,10 +243,14 @@
             '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',
@@ -260,8 +259,6 @@
             '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/directory_posix.c',
-            'third_party/boringssl/crypto/directory_win.c',
             'third_party/boringssl/crypto/dsa/dsa.c',
             'third_party/boringssl/crypto/dsa/dsa_asn1.c',
             'third_party/boringssl/crypto/ec/ec.c',
@@ -280,7 +277,6 @@
             '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/algorithm.c',
             'third_party/boringssl/crypto/evp/digestsign.c',
             'third_party/boringssl/crypto/evp/evp.c',
             'third_party/boringssl/crypto/evp/evp_asn1.c',
@@ -291,6 +287,7 @@
             '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',
@@ -304,6 +301,12 @@
             '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/newhope/error_correction.c',
+            'third_party/boringssl/crypto/newhope/newhope.c',
+            'third_party/boringssl/crypto/newhope/ntt.c',
+            'third_party/boringssl/crypto/newhope/poly.c',
+            'third_party/boringssl/crypto/newhope/precomp.c',
+            'third_party/boringssl/crypto/newhope/reduce.c',
             'third_party/boringssl/crypto/obj/obj.c',
             'third_party/boringssl/crypto/obj/obj_xref.c',
             'third_party/boringssl/crypto/pem/pem_all.c',
@@ -321,6 +324,7 @@
             '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/rand/deterministic.c',
             'third_party/boringssl/crypto/rand/rand.c',
             'third_party/boringssl/crypto/rand/urandom.c',
             'third_party/boringssl/crypto/rand/windows.c',
@@ -345,11 +349,13 @@
             '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',
@@ -424,21 +430,17 @@
             'third_party/boringssl/crypto/x509v3/v3_utl.c',
             'third_party/boringssl/ssl/custom_extensions.c',
             'third_party/boringssl/ssl/d1_both.c',
-            'third_party/boringssl/ssl/d1_clnt.c',
             'third_party/boringssl/ssl/d1_lib.c',
-            'third_party/boringssl/ssl/d1_meth.c',
             'third_party/boringssl/ssl/d1_pkt.c',
             'third_party/boringssl/ssl/d1_srtp.c',
-            'third_party/boringssl/ssl/d1_srvr.c',
+            'third_party/boringssl/ssl/dtls_method.c',
             'third_party/boringssl/ssl/dtls_record.c',
-            'third_party/boringssl/ssl/pqueue/pqueue.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_clnt.c',
             'third_party/boringssl/ssl/s3_enc.c',
             'third_party/boringssl/ssl/s3_lib.c',
-            'third_party/boringssl/ssl/s3_meth.c',
             'third_party/boringssl/ssl/s3_pkt.c',
-            'third_party/boringssl/ssl/s3_srvr.c',
             'third_party/boringssl/ssl/ssl_aead_ctx.c',
             'third_party/boringssl/ssl/ssl_asn1.c',
             'third_party/boringssl/ssl/ssl_buffer.c',
@@ -452,6 +454,11 @@
             'third_party/boringssl/ssl/ssl_stat.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',
           ]
         },
@@ -768,6 +775,7 @@
         'src/core/ext/client_channel/connector.c',
         'src/core/ext/client_channel/default_initial_connect_string.c',
         'src/core/ext/client_channel/http_connect_handshaker.c',
+        'src/core/ext/client_channel/http_proxy.c',
         'src/core/ext/client_channel/initial_connect_string.c',
         'src/core/ext/client_channel/lb_policy.c',
         'src/core/ext/client_channel/lb_policy_factory.c',
diff --git a/build.yaml b/build.yaml
index ceb4cf1..a0f88de 100644
--- a/build.yaml
+++ b/build.yaml
@@ -389,6 +389,7 @@
   - src/core/ext/client_channel/client_channel_factory.h
   - src/core/ext/client_channel/connector.h
   - src/core/ext/client_channel/http_connect_handshaker.h
+  - src/core/ext/client_channel/http_proxy.h
   - src/core/ext/client_channel/initial_connect_string.h
   - src/core/ext/client_channel/lb_policy.h
   - src/core/ext/client_channel/lb_policy_factory.h
@@ -410,6 +411,7 @@
   - src/core/ext/client_channel/connector.c
   - src/core/ext/client_channel/default_initial_connect_string.c
   - src/core/ext/client_channel/http_connect_handshaker.c
+  - src/core/ext/client_channel/http_proxy.c
   - src/core/ext/client_channel/initial_connect_string.c
   - src/core/ext/client_channel/lb_policy.c
   - src/core/ext/client_channel/lb_policy_factory.c
@@ -688,7 +690,7 @@
   - include/grpc/grpc_security.h
   - include/grpc/grpc_security_constants.h
   headers:
-  - third_party/objective_c/Cronet/cronet_c_for_grpc.h
+  - third_party/Cronet/bidirectional_stream_c.h
   src:
   - src/core/ext/transport/cronet/client/secure/cronet_channel_create.c
   - src/core/ext/transport/cronet/transport/cronet_api_dummy.c
@@ -1317,7 +1319,6 @@
   - test/cpp/qps/driver.h
   - test/cpp/qps/histogram.h
   - test/cpp/qps/interarrival.h
-  - test/cpp/qps/limit_cores.h
   - test/cpp/qps/parse_json.h
   - test/cpp/qps/qps_worker.h
   - test/cpp/qps/report.h
@@ -1334,7 +1335,6 @@
   - test/cpp/qps/client_async.cc
   - test/cpp/qps/client_sync.cc
   - test/cpp/qps/driver.cc
-  - test/cpp/qps/limit_cores.cc
   - test/cpp/qps/parse_json.cc
   - test/cpp/qps/qps_worker.cc
   - test/cpp/qps/report.cc
@@ -3244,12 +3244,12 @@
   - src/proto/grpc/lb/v1/load_balancer.proto
   - test/cpp/grpclb/grpclb_test.cc
   deps:
-  - gpr
-  - gpr_test_util
-  - grpc
-  - grpc++
   - grpc++_test_util
   - grpc_test_util
+  - grpc++
+  - grpc
+  - gpr_test_util
+  - gpr
 - name: http2_client
   build: test
   run: false
@@ -3652,16 +3652,17 @@
   - test/cpp/interop/client_helper.h
   - test/cpp/interop/interop_client.h
   - test/cpp/interop/stress_interop_client.h
+  - test/cpp/util/create_test_channel.h
   - test/cpp/util/metrics_server.h
   src:
   - src/proto/grpc/testing/empty.proto
   - src/proto/grpc/testing/messages.proto
   - src/proto/grpc/testing/metrics.proto
   - src/proto/grpc/testing/test.proto
-  - test/cpp/interop/client_helper.cc
   - test/cpp/interop/interop_client.cc
   - test/cpp/interop/stress_interop_client.cc
   - test/cpp/interop/stress_test.cc
+  - test/cpp/util/create_test_channel.cc
   - test/cpp/util/metrics_server.cc
   deps:
   - grpc++_test_util
diff --git a/src/ruby/tools/os_check.rb b/build_config.rb
similarity index 81%
copy from src/ruby/tools/os_check.rb
copy to build_config.rb
index 2677306..35e887e 100644
--- a/src/ruby/tools/os_check.rb
+++ b/build_config.rb
@@ -1,4 +1,4 @@
-# Copyright 2016, Google Inc.
+# Copyright 2017, Google Inc.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -27,19 +27,6 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-# This is based on http://stackoverflow.com/a/171011/159388 by Aaron Hinni
-
-require 'rbconfig'
-
-module OS
-  def OS.os_name
-    case RbConfig::CONFIG['host_os']
-    when /cygwin|mswin|mingw|bccwin|wince|emx/
-      'windows'
-    when /darwin/
-      'macos'
-    else
-      'linux'
-    end
-  end
+module GrpcBuildConfig
+  CORE_WINDOWS_DLL = '/tmp/libs/opt/grpc-2.dll'
 end
diff --git a/config.m4 b/config.m4
index 62bd1f6..9b2d819 100644
--- a/config.m4
+++ b/config.m4
@@ -254,6 +254,7 @@
     src/core/ext/client_channel/connector.c \
     src/core/ext/client_channel/default_initial_connect_string.c \
     src/core/ext/client_channel/http_connect_handshaker.c \
+    src/core/ext/client_channel/http_proxy.c \
     src/core/ext/client_channel/initial_connect_string.c \
     src/core/ext/client_channel/lb_policy.c \
     src/core/ext/client_channel/lb_policy_factory.c \
@@ -304,7 +305,6 @@
     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_bytes.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 \
@@ -323,18 +323,14 @@
     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/bio_asn1.c \
-    third_party/boringssl/crypto/asn1/bio_ndef.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/t_pkey.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_prn.c \
     third_party/boringssl/crypto/asn1/tasn_typ.c \
     third_party/boringssl/crypto/asn1/tasn_utl.c \
     third_party/boringssl/crypto/asn1/x_bignum.c \
@@ -364,6 +360,7 @@
     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 \
@@ -375,8 +372,7 @@
     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_generic.c \
-    third_party/boringssl/crypto/chacha/chacha_vec.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 \
@@ -391,10 +387,14 @@
     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 \
@@ -403,8 +403,6 @@
     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/directory_posix.c \
-    third_party/boringssl/crypto/directory_win.c \
     third_party/boringssl/crypto/dsa/dsa.c \
     third_party/boringssl/crypto/dsa/dsa_asn1.c \
     third_party/boringssl/crypto/ec/ec.c \
@@ -423,7 +421,6 @@
     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/algorithm.c \
     third_party/boringssl/crypto/evp/digestsign.c \
     third_party/boringssl/crypto/evp/evp.c \
     third_party/boringssl/crypto/evp/evp_asn1.c \
@@ -434,6 +431,7 @@
     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 \
@@ -447,6 +445,12 @@
     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/newhope/error_correction.c \
+    third_party/boringssl/crypto/newhope/newhope.c \
+    third_party/boringssl/crypto/newhope/ntt.c \
+    third_party/boringssl/crypto/newhope/poly.c \
+    third_party/boringssl/crypto/newhope/precomp.c \
+    third_party/boringssl/crypto/newhope/reduce.c \
     third_party/boringssl/crypto/obj/obj.c \
     third_party/boringssl/crypto/obj/obj_xref.c \
     third_party/boringssl/crypto/pem/pem_all.c \
@@ -464,6 +468,7 @@
     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/rand/deterministic.c \
     third_party/boringssl/crypto/rand/rand.c \
     third_party/boringssl/crypto/rand/urandom.c \
     third_party/boringssl/crypto/rand/windows.c \
@@ -488,11 +493,13 @@
     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 \
@@ -567,21 +574,17 @@
     third_party/boringssl/crypto/x509v3/v3_utl.c \
     third_party/boringssl/ssl/custom_extensions.c \
     third_party/boringssl/ssl/d1_both.c \
-    third_party/boringssl/ssl/d1_clnt.c \
     third_party/boringssl/ssl/d1_lib.c \
-    third_party/boringssl/ssl/d1_meth.c \
     third_party/boringssl/ssl/d1_pkt.c \
     third_party/boringssl/ssl/d1_srtp.c \
-    third_party/boringssl/ssl/d1_srvr.c \
+    third_party/boringssl/ssl/dtls_method.c \
     third_party/boringssl/ssl/dtls_record.c \
-    third_party/boringssl/ssl/pqueue/pqueue.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_clnt.c \
     third_party/boringssl/ssl/s3_enc.c \
     third_party/boringssl/ssl/s3_lib.c \
-    third_party/boringssl/ssl/s3_meth.c \
     third_party/boringssl/ssl/s3_pkt.c \
-    third_party/boringssl/ssl/s3_srvr.c \
     third_party/boringssl/ssl/ssl_aead_ctx.c \
     third_party/boringssl/ssl/ssl_asn1.c \
     third_party/boringssl/ssl/ssl_buffer.c \
@@ -595,6 +598,11 @@
     third_party/boringssl/ssl/ssl_stat.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 \
     , $ext_shared, , -Wall -Werror \
     -Wno-parentheses-equality -Wno-unused-value -std=c11 \
@@ -677,6 +685,7 @@
   PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl/crypto/md4)
   PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl/crypto/md5)
   PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl/crypto/modes)
+  PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl/crypto/newhope)
   PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl/crypto/obj)
   PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl/crypto/pem)
   PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl/crypto/pkcs8)
@@ -689,6 +698,5 @@
   PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl/crypto/x509)
   PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl/crypto/x509v3)
   PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl/ssl)
-  PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl/ssl/pqueue)
   PHP_ADD_BUILD_DIR($ext_builddir/third_party/nanopb)
 fi
diff --git a/doc/PROTOCOL-HTTP2.md b/doc/PROTOCOL-HTTP2.md
index 18803f2..2df1c74 100644
--- a/doc/PROTOCOL-HTTP2.md
+++ b/doc/PROTOCOL-HTTP2.md
@@ -153,6 +153,7 @@
 HEADERS (flags = END_HEADERS)
 :status = 200
 grpc-encoding = gzip
+content-type = application/grpc+proto
 
 DATA
 <Length-Prefixed Message>
diff --git a/doc/environment_variables.md b/doc/environment_variables.md
index d02801b..832762a 100644
--- a/doc/environment_variables.md
+++ b/doc/environment_variables.md
@@ -55,10 +55,12 @@
   - secure_endpoint - traces bytes flowing through encrypted channels
   - transport_security - traces metadata about secure channel establishment
   - tcp - traces bytes in and out of a channel
+  
   'all' can additionally be used to turn all traces on.
   Individual traces can be disabled by prefixing them with '-'.
+ 
   Example:
-   export GRPC_TRACE=all,-pending_tags
+  export GRPC_TRACE=all,-pending_tags
 
 * GRPC_VERBOSITY
   Default gRPC logging verbosity - one of:
diff --git a/doc/images/load-balancing.png b/doc/images/load-balancing.png
new file mode 100644
index 0000000..7c70465
--- /dev/null
+++ b/doc/images/load-balancing.png
Binary files differ
diff --git a/doc/images/load-balancing.svg b/doc/images/load-balancing.svg
new file mode 100644
index 0000000..18d836d
--- /dev/null
+++ b/doc/images/load-balancing.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" standalone="yes"?>
+
+<svg version="1.1" viewBox="0.0 0.0 960.0 720.0" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><clipPath id="p.0"><path d="m0 0l960.0 0l0 720.0l-960.0 0l0 -720.0z" clip-rule="nonzero"></path></clipPath><g clip-path="url(#p.0)"><path fill="#000000" fill-opacity="0.0" d="m0 0l960.0 0l0 720.0l-960.0 0z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m7.624672 117.129105l0 0c0 -13.695778 11.102621 -24.798393 24.798397 -24.798393l572.00946 0c6.5769653 0 12.8845215 2.6126785 17.535156 7.263283c4.6505737 4.6505966 7.2632446 10.958168 7.2632446 17.53511l0 99.19061c0 13.69577 -11.1026 24.798386 -24.7984 24.798386l-572.00946 0c-13.695776 0 -24.798397 -11.102615 -24.798397 -24.798386z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" stroke-dasharray="8.0,3.0" d="m7.624672 117.129105l0 0c0 -13.695778 11.102621 -24.798393 24.798397 -24.798393l572.00946 0c6.5769653 0 12.8845215 2.6126785 17.535156 7.263283c4.6505737 4.6505966 7.2632446 10.958168 7.2632446 17.53511l0 99.19061c0 13.69577 -11.1026 24.798386 -24.7984 24.798386l-572.00946 0c-13.695776 0 -24.798397 -11.102615 -24.798397 -24.798386z" fill-rule="nonzero"></path><path fill="#000000" d="m268.05804 127.32641l1.609375 0.25q0.109375 0.7500076 0.578125 1.0937576q0.609375 0.453125 1.6875 0.453125q1.171875 0 1.796875 -0.46875q0.625 -0.453125 0.859375 -1.2812576q0.125 -0.515625 0.109375 -2.15625q-1.09375 1.296875 -2.71875 1.296875q-2.03125 0 -3.15625 -1.46875q-1.109375 -1.46875 -1.109375 -3.515625q0 -1.40625 0.515625 -2.59375q0.515625 -1.203125 1.484375 -1.84375q0.96875 -0.65625 2.265625 -0.65625q1.75 0 2.875 1.40625l0 -1.1875l1.546875 0l0 8.515625q0 2.3125 -0.46875 3.2656326q-0.46875 0.96875 -1.484375 1.515625q-1.015625 0.5625 -2.5 0.5625q-1.765625 0 -2.859375 -0.796875q-1.078125 -0.796875 -1.03125 -2.3906326zm1.375 -5.921875q0 1.953125 0.765625 2.84375q0.78125 0.890625 1.9375 0.890625q1.140625 0 1.921875 -0.890625q0.78125 -0.890625 0.78125 -2.78125q0 -1.8125 -0.8125 -2.71875q-0.796875 -0.921875 -1.921875 -0.921875q-1.109375 0 -1.890625 0.90625q-0.78125 0.890625 -0.78125 2.671875zm9.547607 5.109375l0 -13.59375l6.03125 0q1.8125 0 2.75 0.359375q0.953125 0.359375 1.515625 1.296875q0.5625 0.921875 0.5625 2.046875q0 1.453125 -0.9375 2.453125q-0.921875 0.984375 -2.890625 1.25q0.71875 0.34375 1.09375 0.671875q0.78125 0.734375 1.484375 1.8125l2.375 3.703125l-2.265625 0l-1.796875 -2.828125q-0.796875 -1.21875 -1.3125 -1.875q-0.5 -0.65625 -0.90625 -0.90625q-0.40625 -0.265625 -0.8125 -0.359375q-0.3125 -0.078125 -1.015625 -0.078125l-2.078125 0l0 6.046875l-1.796875 0zm1.796875 -7.59375l3.859375 0q1.234375 0 1.921875 -0.25q0.703125 -0.265625 1.0625 -0.828125q0.375 -0.5625 0.375 -1.21875q0 -0.96875 -0.703125 -1.578125q-0.703125 -0.625 -2.21875 -0.625l-4.296875 0l0 4.5zm11.644806 7.59375l0 -13.59375l5.125 0q1.359375 0 2.078125 0.125q1.0 0.171875 1.671875 0.640625q0.671875 0.46875 1.078125 1.3125q0.421875 0.84375 0.421875 1.84375q0 1.734375 -1.109375 2.9375q-1.09375 1.203125 -3.984375 1.203125l-3.484375 0l0 5.53125l-1.796875 0zm1.796875 -7.140625l3.515625 0q1.75 0 2.46875 -0.640625q0.734375 -0.65625 0.734375 -1.828125q0 -0.859375 -0.4375 -1.46875q-0.421875 -0.609375 -1.125 -0.796875q-0.453125 -0.125 -1.671875 -0.125l-3.484375 0l0 4.859375zm20.349823 2.375l1.796875 0.453125q-0.5625 2.21875 -2.03125 3.390625q-1.46875 1.15625 -3.59375 1.15625q-2.203125 0 -3.578125 -0.890625q-1.375 -0.90625 -2.09375 -2.59375q-0.71875 -1.703125 -0.71875 -3.65625q0 -2.125 0.796875 -3.703125q0.8125 -1.578125 2.3125 -2.390625q1.5 -0.828125 3.296875 -0.828125q2.046875 0 3.4375 1.046875q1.390625 1.03125 1.9375 2.90625l-1.765625 0.421875q-0.46875 -1.484375 -1.375 -2.15625q-0.90625 -0.6875 -2.265625 -0.6875q-1.5625 0 -2.625 0.75q-1.046875 0.75 -1.484375 2.03125q-0.421875 1.265625 -0.421875 2.609375q0 1.734375 0.5 3.03125q0.515625 1.28125 1.578125 1.921875q1.078125 0.640625 2.3125 0.640625q1.515625 0 2.5625 -0.859375q1.046875 -0.875 1.421875 -2.59375zm18.65625 0l1.796875 0.453125q-0.5625 2.21875 -2.03125 3.390625q-1.46875 1.15625 -3.59375 1.15625q-2.203125 0 -3.578125 -0.890625q-1.375 -0.90625 -2.09375 -2.59375q-0.71875 -1.703125 -0.71875 -3.65625q0 -2.125 0.796875 -3.703125q0.8125 -1.578125 2.3125 -2.390625q1.5 -0.828125 3.296875 -0.828125q2.046875 0 3.4375 1.046875q1.390625 1.03125 1.9375 2.90625l-1.765625 0.421875q-0.46875 -1.484375 -1.375 -2.15625q-0.90625 -0.6875 -2.265625 -0.6875q-1.5625 0 -2.625 0.75q-1.046875 0.75 -1.484375 2.03125q-0.421875 1.265625 -0.421875 2.609375q0 1.734375 0.5 3.03125q0.515625 1.28125 1.578125 1.921875q1.078125 0.640625 2.3125 0.640625q1.515625 0 2.5625 -0.859375q1.046875 -0.875 1.421875 -2.59375zm3.5198364 4.765625l0 -13.59375l1.671875 0l0 13.59375l-1.671875 0zm4.191681 -11.6875l0 -1.90625l1.671875 0l0 1.90625l-1.671875 0zm0 11.6875l0 -9.859375l1.671875 0l0 9.859375l-1.671875 0zm10.879181 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.110107 5.875l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm14.031982 -1.5l0.234375 1.484375q-0.703125 0.140625 -1.265625 0.140625q-0.90625 0 -1.40625 -0.28125q-0.5 -0.296875 -0.703125 -0.75q-0.203125 -0.46875 -0.203125 -1.984375l0 -5.65625l-1.234375 0l0 -1.3125l1.234375 0l0 -2.4375l1.65625 -1.0l0 3.4375l1.6875 0l0 1.3125l-1.6875 0l0 5.75q0 0.71875 0.078125 0.921875q0.09375 0.203125 0.296875 0.328125q0.203125 0.125 0.578125 0.125q0.265625 0 0.734375 -0.078125z" fill-rule="nonzero"></path><path fill="#93c47d" d="m248.70341 158.99738l143.99998 0l0 61.007874l-143.99998 0z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m248.70341 158.99738l143.99998 0l0 61.007874l-143.99998 0z" fill-rule="nonzero"></path><path fill="#000000" d="m273.87787 196.37569l1.453125 0.21875q0.09375 0.671875 0.515625 0.96875q0.546875 0.421875 1.515625 0.421875q1.03125 0 1.59375 -0.421875q0.5625 -0.40625 0.765625 -1.15625q0.125 -0.453125 0.109375 -1.921875q-0.984375 1.15625 -2.4375 1.15625q-1.8125 0 -2.8125 -1.3125q-1.0 -1.3125 -1.0 -3.140625q0 -1.265625 0.453125 -2.328125q0.46875 -1.078125 1.328125 -1.65625q0.875 -0.578125 2.03125 -0.578125q1.5625 0 2.578125 1.265625l0 -1.0625l1.375 0l0 7.609375q0 2.0625 -0.421875 2.921875q-0.40625 0.859375 -1.328125 1.359375q-0.90625 0.5 -2.234375 0.5q-1.578125 0 -2.546875 -0.71875q-0.96875 -0.703125 -0.9375 -2.125zm1.234375 -5.296875q0 1.734375 0.6875 2.53125q0.703125 0.796875 1.734375 0.796875q1.03125 0 1.71875 -0.796875q0.703125 -0.796875 0.703125 -2.484375q0 -1.625 -0.71875 -2.4375q-0.71875 -0.828125 -1.734375 -0.828125q-0.984375 0 -1.6875 0.8125q-0.703125 0.8125 -0.703125 2.40625zm8.90271 4.5625l0 -12.171875l5.390625 0q1.625 0 2.46875 0.328125q0.84375 0.328125 1.34375 1.15625q0.515625 0.828125 0.515625 1.84375q0 1.296875 -0.84375 2.1875q-0.828125 0.875 -2.578125 1.125q0.640625 0.296875 0.96875 0.59375q0.703125 0.65625 1.328125 1.625l2.125 3.3125l-2.03125 0l-1.609375 -2.53125q-0.703125 -1.09375 -1.15625 -1.671875q-0.453125 -0.59375 -0.828125 -0.8125q-0.359375 -0.234375 -0.71875 -0.328125q-0.28125 -0.0625 -0.90625 -0.0625l-1.859375 0l0 5.40625l-1.609375 0zm1.609375 -6.796875l3.453125 0q1.109375 0 1.71875 -0.21875q0.625 -0.234375 0.953125 -0.734375q0.328125 -0.515625 0.328125 -1.09375q0 -0.875 -0.625 -1.421875q-0.625 -0.5625 -1.984375 -0.5625l-3.84375 0l0 4.03125zm10.873199 6.796875l0 -12.171875l4.59375 0q1.203125 0 1.84375 0.125q0.90625 0.140625 1.5 0.5625q0.609375 0.421875 0.96875 1.1875q0.375 0.75 0.375 1.640625q0 1.5625 -0.984375 2.640625q-0.984375 1.0625 -3.5625 1.0625l-3.125 0l0 4.953125l-1.609375 0zm1.609375 -6.390625l3.140625 0q1.5625 0 2.21875 -0.578125q0.65625 -0.578125 0.65625 -1.625q0 -0.765625 -0.390625 -1.3125q-0.375 -0.546875 -1.015625 -0.71875q-0.40625 -0.109375 -1.5 -0.109375l-3.109375 0l0 4.34375zm18.635834 2.125l1.609375 0.40625q-0.515625 1.984375 -1.828125 3.03125q-1.3125 1.03125 -3.21875 1.03125q-1.96875 0 -3.203125 -0.796875q-1.21875 -0.796875 -1.875 -2.3125q-0.640625 -1.53125 -0.640625 -3.265625q0 -1.90625 0.71875 -3.3125q0.734375 -1.421875 2.078125 -2.15625q1.34375 -0.734375 2.953125 -0.734375q1.828125 0 3.0625 0.9375q1.25 0.921875 1.734375 2.609375l-1.578125 0.375q-0.421875 -1.328125 -1.234375 -1.9375q-0.796875 -0.609375 -2.015625 -0.609375q-1.40625 0 -2.359375 0.671875q-0.9375 0.671875 -1.328125 1.8125q-0.375 1.125 -0.375 2.328125q0 1.5625 0.453125 2.71875q0.453125 1.15625 1.40625 1.734375q0.96875 0.5625 2.078125 0.5625q1.34375 0 2.28125 -0.78125q0.9375 -0.78125 1.28125 -2.3125zm17.328156 0l1.609375 0.40625q-0.515625 1.984375 -1.828125 3.03125q-1.3125 1.03125 -3.21875 1.03125q-1.96875 0 -3.203125 -0.796875q-1.21875 -0.796875 -1.875 -2.3125q-0.640625 -1.53125 -0.640625 -3.265625q0 -1.90625 0.71875 -3.3125q0.734375 -1.421875 2.078125 -2.15625q1.34375 -0.734375 2.953125 -0.734375q1.828125 0 3.0625 0.9375q1.25 0.921875 1.734375 2.609375l-1.578125 0.375q-0.421875 -1.328125 -1.234375 -1.9375q-0.796875 -0.609375 -2.015625 -0.609375q-1.40625 0 -2.359375 0.671875q-0.9375 0.671875 -1.328125 1.8125q-0.375 1.125 -0.375 2.328125q0 1.5625 0.453125 2.71875q0.453125 1.15625 1.40625 1.734375q0.96875 0.5625 2.078125 0.5625q1.34375 0 2.28125 -0.78125q0.9375 -0.78125 1.28125 -2.3125zm3.6075745 4.265625l0 -12.171875l1.484375 0l0 12.171875l-1.484375 0zm3.881012 -10.453125l0 -1.71875l1.5 0l0 1.71875l-1.5 0zm0 10.453125l0 -8.8125l1.5 0l0 8.8125l-1.5 0zm9.881012 -2.84375l1.546875 0.203125q-0.375 1.34375 -1.359375 2.09375q-0.984375 0.75 -2.515625 0.75q-1.9375 0 -3.078125 -1.1875q-1.125 -1.203125 -1.125 -3.34375q0 -2.234375 1.140625 -3.453125q1.140625 -1.234375 2.96875 -1.234375q1.78125 0 2.890625 1.203125q1.125 1.203125 1.125 3.390625q0 0.125 -0.015625 0.390625l-6.5625 0q0.078125 1.453125 0.8125 2.234375q0.75 0.765625 1.84375 0.765625q0.828125 0 1.40625 -0.421875q0.578125 -0.4375 0.921875 -1.390625zm-4.90625 -2.40625l4.921875 0q-0.09375 -1.109375 -0.5625 -1.671875q-0.71875 -0.859375 -1.859375 -0.859375q-1.015625 0 -1.71875 0.6875q-0.703125 0.6875 -0.78125 1.84375zm8.512085 5.25l0 -8.8125l1.34375 0l0 1.25q0.96875 -1.453125 2.796875 -1.453125q0.796875 0 1.46875 0.296875q0.671875 0.28125 1.0 0.75q0.328125 0.453125 0.46875 1.09375q0.078125 0.421875 0.078125 1.453125l0 5.421875l-1.484375 0l0 -5.359375q0 -0.921875 -0.1875 -1.375q-0.171875 -0.453125 -0.625 -0.71875q-0.4375 -0.265625 -1.03125 -0.265625q-0.953125 0 -1.65625 0.609375q-0.6875 0.59375 -0.6875 2.296875l0 4.8125l-1.484375 0zm12.90271 -1.34375l0.203125 1.328125q-0.625 0.125 -1.125 0.125q-0.8125 0 -1.265625 -0.25q-0.4375 -0.265625 -0.625 -0.671875q-0.1875 -0.421875 -0.1875 -1.765625l0 -5.078125l-1.09375 0l0 -1.15625l1.09375 0l0 -2.1875l1.484375 -0.890625l0 3.078125l1.515625 0l0 1.15625l-1.515625 0l0 5.15625q0 0.640625 0.078125 0.828125q0.078125 0.171875 0.25 0.28125q0.1875 0.109375 0.53125 0.109375q0.234375 0 0.65625 -0.0625z" fill-rule="nonzero"></path><path fill="#f1c232" d="m30.199474 154.00525l156.18898 0l0 70.99213l-156.18898 0z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m30.199474 154.00525l156.18898 0l0 70.99213l-156.18898 0z" fill-rule="nonzero"></path><path fill="#000000" d="m45.465923 185.42131l0 -13.59375l1.84375 0l7.140625 10.671875l0 -10.671875l1.71875 0l0 13.59375l-1.84375 0l-7.140625 -10.6875l0 10.6875l-1.71875 0zm19.707325 -1.21875q-0.9375 0.796875 -1.7968788 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.0312538 -0.25 2.9843788 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.6406288 -0.5625 -1.9062538 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.2656288 0 2.0468788 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.7343788 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.7500038 -0.4375 1.1093788 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm4.078842 4.9375l0 -9.859375l1.5 0l0 1.390625q0.453125 -0.71875 1.21875 -1.15625q0.78125 -0.453125 1.765625 -0.453125q1.09375 0 1.796875 0.453125q0.703125 0.453125 0.984375 1.28125q1.171875 -1.734375 3.046875 -1.734375q1.46875 0 2.25 0.8125q0.796875 0.8125 0.796875 2.5l0 6.765625l-1.671875 0l0 -6.203125q0 -1.0 -0.15625 -1.4375q-0.15625 -0.453125 -0.59375 -0.71875q-0.421875 -0.265625 -1.0 -0.265625q-1.03125 0 -1.71875 0.6875q-0.6875 0.6875 -0.6875 2.21875l0 5.71875l-1.671875 0l0 -6.40625q0 -1.109375 -0.40625 -1.65625q-0.40625 -0.5625 -1.34375 -0.5625q-0.703125 0 -1.3125 0.375q-0.59375 0.359375 -0.859375 1.078125q-0.265625 0.71875 -0.265625 2.0625l0 5.109375l-1.671875 0zm22.290802 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm14.543396 5.875l0 -13.59375l6.03125 0q1.8125 0 2.75 0.359375q0.953125 0.359375 1.515625 1.296875q0.5625 0.921875 0.5625 2.046875q0 1.453125 -0.9375 2.453125q-0.921875 0.984375 -2.890625 1.25q0.71875 0.34375 1.09375 0.671875q0.78125 0.734375 1.484375 1.8125l2.375 3.703125l-2.265625 0l-1.796875 -2.828125q-0.796875 -1.21875 -1.3125 -1.875q-0.5 -0.65625 -0.90625 -0.90625q-0.40625 -0.265625 -0.8125 -0.359375q-0.3125 -0.078125 -1.015625 -0.078125l-2.078125 0l0 6.046875l-1.796875 0zm1.796875 -7.59375l3.859375 0q1.234375 0 1.921875 -0.25q0.703125 -0.265625 1.0625 -0.828125q0.375 -0.5625 0.375 -1.21875q0 -0.96875 -0.703125 -1.578125q-0.703125 -0.625 -2.21875 -0.625l-4.296875 0l0 4.5zm18.176071 4.421875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm8.438217 2.9375l1.65625 -0.265625q0.140625 1.0 0.765625 1.53125q0.640625 0.515625 1.78125 0.515625q1.15625 0 1.703125 -0.46875q0.5625 -0.46875 0.5625 -1.09375q0 -0.5625 -0.484375 -0.890625q-0.34375 -0.21875 -1.703125 -0.5625q-1.84375 -0.46875 -2.5625 -0.796875q-0.703125 -0.34375 -1.078125 -0.9375q-0.359375 -0.609375 -0.359375 -1.328125q0 -0.65625 0.296875 -1.21875q0.3125 -0.5625 0.828125 -0.9375q0.390625 -0.28125 1.0625 -0.484375q0.671875 -0.203125 1.4375 -0.203125q1.171875 0 2.046875 0.34375q0.875 0.328125 1.28125 0.90625q0.421875 0.5625 0.578125 1.515625l-1.625 0.21875q-0.109375 -0.75 -0.65625 -1.171875q-0.53125 -0.4375 -1.5 -0.4375q-1.15625 0 -1.640625 0.390625q-0.484375 0.375 -0.484375 0.875q0 0.328125 0.203125 0.59375q0.203125 0.265625 0.640625 0.4375q0.25 0.09375 1.46875 0.4375q1.765625 0.46875 2.46875 0.765625q0.703125 0.296875 1.09375 0.875q0.40625 0.578125 0.40625 1.4375q0 0.828125 -0.484375 1.578125q-0.484375 0.734375 -1.40625 1.140625q-0.921875 0.390625 -2.078125 0.390625q-1.921875 0 -2.9375 -0.796875q-1.0 -0.796875 -1.28125 -2.359375zm9.375 -1.984375q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm9.250717 4.921875l0 -13.59375l1.671875 0l0 13.59375l-1.671875 0zm6.910446 0l-3.75 -9.859375l1.765625 0l2.125 5.90625q0.34375 0.953125 0.625 1.984375q0.21875 -0.78125 0.625 -1.875l2.1875 -6.015625l1.71875 0l-3.734375 9.859375l-1.5625 0zm13.34375 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.094467 5.875l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0z" fill-rule="nonzero"></path><path fill="#000000" d="m73.85669 211.42131q-1.375 -1.75 -2.328125 -4.078125q-0.953125 -2.34375 -0.953125 -4.84375q0 -2.21875 0.703125 -4.234375q0.84375 -2.34375 2.578125 -4.671875l1.203125 0q-1.125 1.921875 -1.484375 2.75q-0.5625 1.28125 -0.890625 2.671875q-0.40625 1.734375 -0.40625 3.484375q0 4.46875 2.78125 8.921875l-1.203125 0zm9.775177 -7.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm8.813217 6.6875l1.609375 0.25q0.109375 0.75 0.578125 1.09375q0.609375 0.453125 1.6875 0.453125q1.171875 0 1.796875 -0.46875q0.625 -0.453125 0.859375 -1.28125q0.125 -0.515625 0.109375 -2.15625q-1.09375 1.296875 -2.71875 1.296875q-2.03125 0 -3.15625 -1.46875q-1.109375 -1.46875 -1.109375 -3.515625q0 -1.40625 0.515625 -2.59375q0.515625 -1.203125 1.484375 -1.84375q0.96875 -0.65625 2.265625 -0.65625q1.75 0 2.875 1.40625l0 -1.1875l1.546875 0l0 8.515625q0 2.3125 -0.46875 3.265625q-0.46875 0.96875 -1.484375 1.515625q-1.015625 0.5625 -2.5 0.5625q-1.765625 0 -2.859375 -0.796875q-1.078125 -0.796875 -1.03125 -2.390625zm1.375 -5.921875q0 1.953125 0.765625 2.84375q0.78125 0.890625 1.9375 0.890625q1.140625 0 1.921875 -0.890625q0.78125 -0.890625 0.78125 -2.78125q0 -1.8125 -0.8125 -2.71875q-0.796875 -0.921875 -1.921875 -0.921875q-1.109375 0 -1.890625 0.90625q-0.78125 0.890625 -0.78125 2.671875zm14.699646 5.109375l0 -13.59375l4.6875 0q1.578125 0 2.421875 0.1875q1.15625 0.265625 1.984375 0.96875q1.078125 0.921875 1.609375 2.34375q0.53125 1.40625 0.53125 3.21875q0 1.546875 -0.359375 2.75q-0.359375 1.1875 -0.921875 1.984375q-0.5625 0.78125 -1.234375 1.234375q-0.671875 0.4375 -1.625 0.671875q-0.953125 0.234375 -2.1875 0.234375l-4.90625 0zm1.796875 -1.609375l2.90625 0q1.34375 0 2.109375 -0.25q0.765625 -0.25 1.21875 -0.703125q0.640625 -0.640625 1.0 -1.71875q0.359375 -1.078125 0.359375 -2.625q0 -2.125 -0.703125 -3.265625q-0.703125 -1.15625 -1.703125 -1.546875q-0.71875 -0.28125 -2.328125 -0.28125l-2.859375 0l0 10.390625zm11.660446 1.609375l0 -13.59375l1.84375 0l7.140625 10.671875l0 -10.671875l1.71875 0l0 13.59375l-1.84375 0l-7.140625 -10.6875l0 10.6875l-1.71875 0zm12.879196 -4.375l1.6875 -0.140625q0.125 1.015625 0.5625 1.671875q0.4375 0.65625 1.359375 1.0625q0.9375 0.40625 2.09375 0.40625q1.03125 0 1.8125 -0.3125q0.796875 -0.3125 1.1875 -0.84375q0.390625 -0.53125 0.390625 -1.15625q0 -0.640625 -0.375 -1.109375q-0.375 -0.484375 -1.234375 -0.8125q-0.546875 -0.21875 -2.421875 -0.65625q-1.875 -0.453125 -2.625 -0.859375q-0.96875 -0.515625 -1.453125 -1.265625q-0.46875 -0.75 -0.46875 -1.6875q0 -1.03125 0.578125 -1.921875q0.59375 -0.90625 1.703125 -1.359375q1.125 -0.46875 2.5 -0.46875q1.515625 0 2.671875 0.484375q1.15625 0.484375 1.765625 1.4375q0.625 0.9375 0.671875 2.140625l-1.71875 0.125q-0.140625 -1.28125 -0.953125 -1.9375q-0.796875 -0.671875 -2.359375 -0.671875q-1.625 0 -2.375 0.609375q-0.75 0.59375 -0.75 1.4375q0 0.734375 0.53125 1.203125q0.515625 0.46875 2.703125 0.96875q2.203125 0.5 3.015625 0.875q1.1875 0.546875 1.75 1.390625q0.578125 0.828125 0.578125 1.921875q0 1.09375 -0.625 2.0625q-0.625 0.953125 -1.796875 1.484375q-1.15625 0.53125 -2.609375 0.53125q-1.84375 0 -3.09375 -0.53125q-1.25 -0.546875 -1.96875 -1.625q-0.703125 -1.078125 -0.734375 -2.453125zm13.927948 8.375l-1.1875 0q2.765625 -4.453125 2.765625 -8.921875q0 -1.734375 -0.390625 -3.453125q-0.328125 -1.390625 -0.890625 -2.671875q-0.359375 -0.84375 -1.484375 -2.78125l1.1875 0q1.75 2.328125 2.578125 4.671875q0.71875 2.015625 0.71875 4.234375q0 2.5 -0.96875 4.84375q-0.953125 2.328125 -2.328125 4.078125z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m248.70341 189.50131l-62.29921 0" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m236.70341 189.50131l-38.29921 0" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m236.70341 192.80478l9.076187 -3.3034668l-9.076187 -3.3034668z" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m198.4042 186.19785l-9.076202 3.3034668l9.076202 3.3034668z" fill-rule="evenodd"></path><path fill="#e06666" d="m475.08136 158.99738l136.37793 0l0 61.007874l-136.37793 0z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m475.08136 158.99738l136.37793 0l0 61.007874l-136.37793 0z" fill-rule="nonzero"></path><path fill="#000000" d="m492.37677 197.23381l1.609375 0.25q0.109375 0.75 0.578125 1.09375q0.609375 0.453125 1.6875 0.453125q1.171875 0 1.796875 -0.46875q0.625 -0.453125 0.859375 -1.28125q0.125 -0.515625 0.109375 -2.15625q-1.09375 1.296875 -2.71875 1.296875q-2.03125 0 -3.15625 -1.46875q-1.109375 -1.46875 -1.109375 -3.515625q0 -1.40625 0.515625 -2.59375q0.515625 -1.203125 1.484375 -1.84375q0.96875 -0.65625 2.265625 -0.65625q1.75 0 2.875 1.40625l0 -1.1875l1.546875 0l0 8.515625q0 2.3125 -0.46875 3.265625q-0.46875 0.96875 -1.484375 1.515625q-1.015625 0.5625 -2.5 0.5625q-1.765625 0 -2.859375 -0.796875q-1.078125 -0.796875 -1.03125 -2.390625zm1.375 -5.921875q0 1.953125 0.765625 2.84375q0.78125 0.890625 1.9375 0.890625q1.140625 0 1.921875 -0.890625q0.78125 -0.890625 0.78125 -2.78125q0 -1.8125 -0.8125 -2.71875q-0.796875 -0.921875 -1.921875 -0.921875q-1.109375 0 -1.890625 0.90625q-0.78125 0.890625 -0.78125 2.671875zm9.281952 5.109375l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm6.228302 3.78125l0 -13.640625l1.53125 0l0 1.28125q0.53125 -0.75 1.203125 -1.125q0.6875 -0.375 1.640625 -0.375q1.265625 0 2.234375 0.65625q0.96875 0.640625 1.453125 1.828125q0.5 1.1875 0.5 2.59375q0 1.515625 -0.546875 2.734375q-0.546875 1.203125 -1.578125 1.84375q-1.03125 0.640625 -2.171875 0.640625q-0.84375 0 -1.515625 -0.34375q-0.65625 -0.359375 -1.078125 -0.890625l0 4.796875l-1.671875 0zm1.515625 -8.65625q0 1.90625 0.765625 2.8125q0.78125 0.90625 1.875 0.90625q1.109375 0 1.890625 -0.9375q0.796875 -0.9375 0.796875 -2.921875q0 -1.875 -0.78125 -2.8125q-0.765625 -0.9375 -1.84375 -0.9375q-1.0625 0 -1.890625 1.0q-0.8125 1.0 -0.8125 2.890625zm15.297607 1.265625l1.640625 0.21875q-0.265625 1.6875 -1.375 2.65625q-1.109375 0.953125 -2.734375 0.953125q-2.015625 0 -3.25 -1.3125q-1.21875 -1.328125 -1.21875 -3.796875q0 -1.59375 0.515625 -2.78125q0.53125 -1.203125 1.609375 -1.796875q1.09375 -0.609375 2.359375 -0.609375q1.609375 0 2.625 0.8125q1.015625 0.8125 1.3125 2.3125l-1.625 0.25q-0.234375 -1.0 -0.828125 -1.5q-0.59375 -0.5 -1.421875 -0.5q-1.265625 0 -2.0625 0.90625q-0.78125 0.90625 -0.78125 2.859375q0 1.984375 0.765625 2.890625q0.765625 0.890625 1.984375 0.890625q0.984375 0 1.640625 -0.59375q0.65625 -0.609375 0.84375 -1.859375zm2.859375 3.609375l0 -13.59375l1.671875 0l0 13.59375l-1.671875 0zm5.7229614 0l-1.546875 0l0 -13.59375l1.65625 0l0 4.84375q1.0625 -1.328125 2.703125 -1.328125q0.90625 0 1.71875 0.375q0.8125 0.359375 1.328125 1.03125q0.53125 0.65625 0.828125 1.59375q0.296875 0.9375 0.296875 2.0q0 2.53125 -1.25 3.921875q-1.25 1.375 -3.0 1.375q-1.75 0 -2.734375 -1.453125l0 1.234375zm-0.015625 -5.0q0 1.765625 0.46875 2.5625q0.796875 1.28125 2.140625 1.28125q1.09375 0 1.890625 -0.9375q0.796875 -0.953125 0.796875 -2.84375q0 -1.921875 -0.765625 -2.84375q-0.765625 -0.921875 -1.84375 -0.921875q-1.09375 0 -1.890625 0.953125q-0.796875 0.953125 -0.796875 2.75zm14.027771 8.78125l0 -13.640625l1.53125 0l0 1.28125q0.53125 -0.75 1.203125 -1.125q0.6875 -0.375 1.640625 -0.375q1.265625 0 2.234375 0.65625q0.96875 0.640625 1.453125 1.828125q0.5 1.1875 0.5 2.59375q0 1.515625 -0.546875 2.734375q-0.546875 1.203125 -1.578125 1.84375q-1.03125 0.640625 -2.171875 0.640625q-0.84375 0 -1.515625 -0.34375q-0.65625 -0.359375 -1.078125 -0.890625l0 4.796875l-1.671875 0zm1.515625 -8.65625q0 1.90625 0.765625 2.8125q0.78125 0.90625 1.875 0.90625q1.109375 0 1.890625 -0.9375q0.796875 -0.9375 0.796875 -2.921875q0 -1.875 -0.78125 -2.8125q-0.765625 -0.9375 -1.84375 -0.9375q-1.0625 0 -1.890625 1.0q-0.8125 1.0 -0.8125 2.890625zm8.235046 -0.046875q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.03125 0 3.3125 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.25 0 2.0625 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.0625 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm9.250732 4.921875l0 -13.59375l1.671875 0l0 13.59375l-1.671875 0zm4.1917114 -11.6875l0 -1.90625l1.671875 0l0 1.90625l-1.671875 0zm0 11.6875l0 -9.859375l1.671875 0l0 9.859375l-1.671875 0zm10.566711 -3.609375l1.640625 0.21875q-0.265625 1.6875 -1.375 2.65625q-1.109375 0.953125 -2.734375 0.953125q-2.015625 0 -3.25 -1.3125q-1.21875 -1.328125 -1.21875 -3.796875q0 -1.59375 0.515625 -2.78125q0.53125 -1.203125 1.609375 -1.796875q1.09375 -0.609375 2.359375 -0.609375q1.609375 0 2.625 0.8125q1.015625 0.8125 1.3125 2.3125l-1.625 0.25q-0.234375 -1.0 -0.828125 -1.5q-0.59375 -0.5 -1.421875 -0.5q-1.265625 0 -2.0625 0.90625q-0.78125 0.90625 -0.78125 2.859375q0 1.984375 0.765625 2.890625q0.765625 0.890625 1.984375 0.890625q0.984375 0 1.640625 -0.59375q0.65625 -0.609375 0.84375 -1.859375zm2.8125 7.40625l-0.171875 -1.5625q0.546875 0.140625 0.953125 0.140625q0.546875 0 0.875 -0.1875q0.34375 -0.1875 0.5625 -0.515625q0.15625 -0.25 0.5 -1.25q0.046875 -0.140625 0.15625 -0.40625l-3.734375 -9.875l1.796875 0l2.046875 5.71875q0.40625 1.078125 0.71875 2.28125q0.28125 -1.15625 0.6875 -2.25l2.09375 -5.75l1.671875 0l-3.75 10.03125q-0.59375 1.625 -0.9375 2.234375q-0.4375 0.828125 -1.015625 1.203125q-0.578125 0.390625 -1.375 0.390625q-0.484375 0 -1.078125 -0.203125z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m195.75066 158.99738l27.716537 0l0 32.53543l-27.716537 0z" fill-rule="nonzero"></path><path fill="#000000" d="m210.74643 180.79738l-1.140625 0l0 -7.28125q-0.421875 0.390625 -1.09375 0.796875q-0.65625 0.390625 -1.1875 0.578125l0 -1.109375q0.953125 -0.4375 1.671875 -1.078125q0.71875 -0.640625 1.015625 -1.25l0.734375 0l0 9.34375z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m392.7034 189.50131l82.39371 0" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m404.7034 189.50131l58.393707 0" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m404.7034 186.19785l-9.076172 3.3034668l9.076172 3.3034668z" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m463.0971 192.80478l9.076202 -3.3034668l-9.076202 -3.3034668z" fill-rule="evenodd"></path><path fill="#cfe2f3" d="m475.0819 388.34384l136.37793 0l0 61.007874l-136.37793 0z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m475.0819 388.34384l136.37793 0l0 61.007874l-136.37793 0z" fill-rule="nonzero"></path><path fill="#000000" d="m489.2755 426.58026l1.609375 0.25q0.109375 0.75 0.578125 1.09375q0.609375 0.453125 1.6875 0.453125q1.171875 0 1.796875 -0.46875q0.625 -0.453125 0.859375 -1.28125q0.125 -0.515625 0.109375 -2.15625q-1.09375 1.296875 -2.71875 1.296875q-2.03125 0 -3.15625 -1.46875q-1.109375 -1.46875 -1.109375 -3.515625q0 -1.40625 0.515625 -2.59375q0.515625 -1.203125 1.484375 -1.84375q0.96875 -0.65625 2.265625 -0.65625q1.75 0 2.875 1.40625l0 -1.1875l1.546875 0l0 8.515625q0 2.3125 -0.46875 3.265625q-0.46875 0.96875 -1.484375 1.515625q-1.015625 0.5625 -2.5 0.5625q-1.765625 0 -2.859375 -0.796875q-1.078125 -0.796875 -1.03125 -2.390625zm1.375 -5.921875q0 1.953125 0.765625 2.84375q0.78125 0.890625 1.9375 0.890625q1.140625 0 1.921875 -0.890625q0.78125 -0.890625 0.78125 -2.78125q0 -1.8125 -0.8125 -2.71875q-0.796875 -0.921875 -1.921875 -0.921875q-1.109375 0 -1.890625 0.90625q-0.78125 0.890625 -0.78125 2.671875zm9.547607 5.109375l0 -13.59375l6.03125 0q1.8125 0 2.75 0.359375q0.953125 0.359375 1.515625 1.296875q0.5625 0.921875 0.5625 2.046875q0 1.453125 -0.9375 2.453125q-0.921875 0.984375 -2.890625 1.25q0.71875 0.34375 1.09375 0.671875q0.78125 0.734375 1.484375 1.8125l2.375 3.703125l-2.265625 0l-1.796875 -2.828125q-0.796875 -1.21875 -1.3125 -1.875q-0.5 -0.65625 -0.90625 -0.90625q-0.40625 -0.265625 -0.8125 -0.359375q-0.3125 -0.078125 -1.015625 -0.078125l-2.078125 0l0 6.046875l-1.796875 0zm1.796875 -7.59375l3.859375 0q1.234375 0 1.921875 -0.25q0.703125 -0.265625 1.0625 -0.828125q0.375 -0.5625 0.375 -1.21875q0 -0.96875 -0.703125 -1.578125q-0.703125 -0.625 -2.21875 -0.625l-4.296875 0l0 4.5zm11.644836 7.59375l0 -13.59375l5.125 0q1.359375 0 2.078125 0.125q1.0 0.171875 1.671875 0.640625q0.671875 0.46875 1.078125 1.3125q0.421875 0.84375 0.421875 1.84375q0 1.734375 -1.109375 2.9375q-1.09375 1.203125 -3.984375 1.203125l-3.484375 0l0 5.53125l-1.796875 0zm1.796875 -7.140625l3.515625 0q1.75 0 2.46875 -0.640625q0.734375 -0.65625 0.734375 -1.828125q0 -0.859375 -0.4375 -1.46875q-0.421875 -0.609375 -1.125 -0.796875q-0.453125 -0.125 -1.671875 -0.125l-3.484375 0l0 4.859375zm20.349792 2.375l1.796875 0.453125q-0.5625 2.21875 -2.03125 3.390625q-1.46875 1.15625 -3.59375 1.15625q-2.203125 0 -3.578125 -0.890625q-1.375 -0.90625 -2.09375 -2.59375q-0.71875 -1.703125 -0.71875 -3.65625q0 -2.125 0.796875 -3.703125q0.8125 -1.578125 2.3125 -2.390625q1.5 -0.828125 3.296875 -0.828125q2.046875 0 3.4375 1.046875q1.390625 1.03125 1.9375 2.90625l-1.765625 0.421875q-0.46875 -1.484375 -1.375 -2.15625q-0.90625 -0.6875 -2.265625 -0.6875q-1.5625 0 -2.625 0.75q-1.046875 0.75 -1.484375 2.03125q-0.421875 1.265625 -0.421875 2.609375q0 1.734375 0.5 3.03125q0.515625 1.28125 1.578125 1.921875q1.078125 0.640625 2.3125 0.640625q1.515625 0 2.5625 -0.859375q1.046875 -0.875 1.421875 -2.59375zm8.34375 0.390625l1.6875 -0.140625q0.125 1.015625 0.5625 1.671875q0.4375 0.65625 1.359375 1.0625q0.9375 0.40625 2.09375 0.40625q1.03125 0 1.8125 -0.3125q0.796875 -0.3125 1.1875 -0.84375q0.390625 -0.53125 0.390625 -1.15625q0 -0.640625 -0.375 -1.109375q-0.375 -0.484375 -1.234375 -0.8125q-0.546875 -0.21875 -2.421875 -0.65625q-1.875 -0.453125 -2.625 -0.859375q-0.96875 -0.515625 -1.453125 -1.265625q-0.46875 -0.75 -0.46875 -1.6875q0 -1.03125 0.578125 -1.921875q0.59375 -0.90625 1.703125 -1.359375q1.125 -0.46875 2.5 -0.46875q1.515625 0 2.671875 0.484375q1.15625 0.484375 1.765625 1.4375q0.625 0.9375 0.671875 2.140625l-1.71875 0.125q-0.140625 -1.28125 -0.953125 -1.9375q-0.796875 -0.671875 -2.359375 -0.671875q-1.625 0 -2.375 0.609375q-0.75 0.59375 -0.75 1.4375q0 0.734375 0.53125 1.203125q0.515625 0.46875 2.703125 0.96875q2.203125 0.5 3.015625 0.875q1.1875 0.546875 1.75 1.390625q0.578125 0.828125 0.578125 1.921875q0 1.09375 -0.625 2.0625q-0.625 0.953125 -1.796875 1.484375q-1.15625 0.53125 -2.609375 0.53125q-1.84375 0 -3.09375 -0.53125q-1.25 -0.546875 -1.96875 -1.625q-0.703125 -1.078125 -0.734375 -2.453125zm19.584229 1.203125l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.094421 5.875l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm8.9627075 0l-3.75 -9.859375l1.765625 0l2.125 5.90625q0.34375 0.953125 0.625 1.984375q0.21875 -0.78125 0.625 -1.875l2.1875 -6.015625l1.71875 0l-3.734375 9.859375l-1.5625 0zm13.34375 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.094482 5.875l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0z" fill-rule="nonzero"></path><path fill="#cfe2f3" d="m252.63937 388.34384l136.37796 0l0 61.007874l-136.37796 0z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m252.63937 388.34384l136.37796 0l0 61.007874l-136.37796 0z" fill-rule="nonzero"></path><path fill="#000000" d="m266.83298 426.58026l1.609375 0.25q0.109375 0.75 0.578125 1.09375q0.609375 0.453125 1.6875 0.453125q1.171875 0 1.796875 -0.46875q0.625 -0.453125 0.859375 -1.28125q0.125 -0.515625 0.109375 -2.15625q-1.09375 1.296875 -2.71875 1.296875q-2.03125 0 -3.15625 -1.46875q-1.109375 -1.46875 -1.109375 -3.515625q0 -1.40625 0.515625 -2.59375q0.515625 -1.203125 1.484375 -1.84375q0.96875 -0.65625 2.265625 -0.65625q1.75 0 2.875 1.40625l0 -1.1875l1.546875 0l0 8.515625q0 2.3125 -0.46875 3.265625q-0.46875 0.96875 -1.484375 1.515625q-1.015625 0.5625 -2.5 0.5625q-1.765625 0 -2.859375 -0.796875q-1.078125 -0.796875 -1.03125 -2.390625zm1.375 -5.921875q0 1.953125 0.765625 2.84375q0.78125 0.890625 1.9375 0.890625q1.140625 0 1.921875 -0.890625q0.78125 -0.890625 0.78125 -2.78125q0 -1.8125 -0.8125 -2.71875q-0.796875 -0.921875 -1.921875 -0.921875q-1.109375 0 -1.890625 0.90625q-0.78125 0.890625 -0.78125 2.671875zm9.547607 5.109375l0 -13.59375l6.03125 0q1.8125 0 2.75 0.359375q0.953125 0.359375 1.515625 1.296875q0.5625 0.921875 0.5625 2.046875q0 1.453125 -0.9375 2.453125q-0.921875 0.984375 -2.890625 1.25q0.71875 0.34375 1.09375 0.671875q0.78125 0.734375 1.484375 1.8125l2.375 3.703125l-2.265625 0l-1.796875 -2.828125q-0.796875 -1.21875 -1.3125 -1.875q-0.5 -0.65625 -0.90625 -0.90625q-0.40625 -0.265625 -0.8125 -0.359375q-0.3125 -0.078125 -1.015625 -0.078125l-2.078125 0l0 6.046875l-1.796875 0zm1.796875 -7.59375l3.859375 0q1.234375 0 1.921875 -0.25q0.703125 -0.265625 1.0625 -0.828125q0.375 -0.5625 0.375 -1.21875q0 -0.96875 -0.703125 -1.578125q-0.703125 -0.625 -2.21875 -0.625l-4.296875 0l0 4.5zm11.644806 7.59375l0 -13.59375l5.125 0q1.359375 0 2.078125 0.125q1.0 0.171875 1.671875 0.640625q0.671875 0.46875 1.078125 1.3125q0.421875 0.84375 0.421875 1.84375q0 1.734375 -1.109375 2.9375q-1.09375 1.203125 -3.984375 1.203125l-3.484375 0l0 5.53125l-1.796875 0zm1.796875 -7.140625l3.515625 0q1.75 0 2.46875 -0.640625q0.734375 -0.65625 0.734375 -1.828125q0 -0.859375 -0.4375 -1.46875q-0.421875 -0.609375 -1.125 -0.796875q-0.453125 -0.125 -1.671875 -0.125l-3.484375 0l0 4.859375zm20.349823 2.375l1.796875 0.453125q-0.5625 2.21875 -2.03125 3.390625q-1.46875 1.15625 -3.59375 1.15625q-2.203125 0 -3.578125 -0.890625q-1.375 -0.90625 -2.09375 -2.59375q-0.71875 -1.703125 -0.71875 -3.65625q0 -2.125 0.796875 -3.703125q0.8125 -1.578125 2.3125 -2.390625q1.5 -0.828125 3.296875 -0.828125q2.046875 0 3.4375 1.046875q1.390625 1.03125 1.9375 2.90625l-1.765625 0.421875q-0.46875 -1.484375 -1.375 -2.15625q-0.90625 -0.6875 -2.265625 -0.6875q-1.5625 0 -2.625 0.75q-1.046875 0.75 -1.484375 2.03125q-0.421875 1.265625 -0.421875 2.609375q0 1.734375 0.5 3.03125q0.515625 1.28125 1.578125 1.921875q1.078125 0.640625 2.3125 0.640625q1.515625 0 2.5625 -0.859375q1.046875 -0.875 1.421875 -2.59375zm8.3437805 0.390625l1.6875 -0.140625q0.125 1.015625 0.5625 1.671875q0.4375 0.65625 1.359375 1.0625q0.9375 0.40625 2.09375 0.40625q1.03125 0 1.8125 -0.3125q0.796875 -0.3125 1.1875 -0.84375q0.390625 -0.53125 0.390625 -1.15625q0 -0.640625 -0.375 -1.109375q-0.375 -0.484375 -1.234375 -0.8125q-0.546875 -0.21875 -2.421875 -0.65625q-1.875 -0.453125 -2.625 -0.859375q-0.96875 -0.515625 -1.453125 -1.265625q-0.46875 -0.75 -0.46875 -1.6875q0 -1.03125 0.578125 -1.921875q0.59375 -0.90625 1.703125 -1.359375q1.125 -0.46875 2.5 -0.46875q1.515625 0 2.671875 0.484375q1.15625 0.484375 1.765625 1.4375q0.625 0.9375 0.671875 2.140625l-1.71875 0.125q-0.140625 -1.28125 -0.953125 -1.9375q-0.796875 -0.671875 -2.359375 -0.671875q-1.625 0 -2.375 0.609375q-0.75 0.59375 -0.75 1.4375q0 0.734375 0.53125 1.203125q0.515625 0.46875 2.703125 0.96875q2.203125 0.5 3.015625 0.875q1.1875 0.546875 1.75 1.390625q0.578125 0.828125 0.578125 1.921875q0 1.09375 -0.625 2.0625q-0.625 0.953125 -1.796875 1.484375q-1.15625 0.53125 -2.609375 0.53125q-1.84375 0 -3.09375 -0.53125q-1.25 -0.546875 -1.96875 -1.625q-0.703125 -1.078125 -0.734375 -2.453125zm19.584198 1.203125l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.094452 5.875l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm8.962677 0l-3.75 -9.859375l1.765625 0l2.125 5.90625q0.34375 0.953125 0.625 1.984375q0.21875 -0.78125 0.625 -1.875l2.1875 -6.015625l1.71875 0l-3.734375 9.859375l-1.5625 0zm13.34375 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.094482 5.875l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m320.7034 220.00525l-215.08661 168.34647" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" stroke-dasharray="8.0,6.0" d="m311.25372 227.40143l-196.18726 153.55408" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m313.28983 230.00282l5.1111755 -8.195496l-9.18335 2.9927216z" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m113.030396 378.35413l-5.111183 8.195496l9.18335 -2.9927063z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m320.7034 220.00525l0.12600708 168.34647" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" stroke-dasharray="8.0,6.0" d="m320.7124 232.00525l0.10800171 144.34647" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m324.01587 232.00278l-3.3102722 -9.07373l-3.2966614 9.078674z" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m317.51694 376.3542l3.3102722 9.07373l3.2966614 -9.078674z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m320.7034 220.00525l222.58267 168.34647" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" stroke-dasharray="8.0,6.0" d="m330.27423 227.24397l203.44104 153.869" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m332.267 224.60924l-9.231659 -2.840271l5.246155 8.109756z" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m531.72253 383.7477l9.231628 2.840271l-5.246155 -8.109741z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m412.22308 158.99738l39.653564 0l0 32.53543l-39.653564 0z" fill-rule="nonzero"></path><path fill="#000000" d="m429.33276 179.70363l0 1.09375l-6.15625 0q-0.015625 -0.40625 0.140625 -0.796875q0.234375 -0.625 0.75 -1.234375q0.515625 -0.609375 1.5 -1.40625q1.515625 -1.25 2.046875 -1.96875q0.53125 -0.734375 0.53125 -1.375q0 -0.6875 -0.484375 -1.140625q-0.484375 -0.46875 -1.265625 -0.46875q-0.828125 0 -1.328125 0.5q-0.484375 0.484375 -0.5 1.359375l-1.171875 -0.125q0.125 -1.3125 0.90625 -2.0q0.78125 -0.6875 2.109375 -0.6875q1.34375 0 2.125 0.75q0.78125 0.734375 0.78125 1.828125q0 0.5625 -0.234375 1.109375q-0.21875 0.53125 -0.75 1.140625q-0.53125 0.59375 -1.765625 1.625q-1.03125 0.859375 -1.328125 1.171875q-0.28125 0.3125 -0.46875 0.625l4.5625 0zm2.0218506 1.09375l0 -1.296875l1.296875 0l0 1.296875q0 0.71875 -0.25 1.15625q-0.25 0.4375 -0.8125 0.6875l-0.3125 -0.484375q0.359375 -0.171875 0.53125 -0.484375q0.171875 -0.296875 0.1875 -0.875l-0.640625 0zm3.093628 -2.453125l1.140625 -0.15625q0.203125 0.96875 0.671875 1.40625q0.46875 0.421875 1.15625 0.421875q0.796875 0 1.34375 -0.546875q0.5625 -0.5625 0.5625 -1.390625q0 -0.796875 -0.515625 -1.296875q-0.5 -0.515625 -1.296875 -0.515625q-0.328125 0 -0.8125 0.125l0.125 -1.0q0.125 0.015625 0.1875 0.015625q0.734375 0 1.3125 -0.375q0.59375 -0.390625 0.59375 -1.1875q0 -0.625 -0.4375 -1.03125q-0.421875 -0.421875 -1.09375 -0.421875q-0.671875 0 -1.109375 0.421875q-0.4375 0.421875 -0.578125 1.25l-1.140625 -0.203125q0.21875 -1.140625 0.953125 -1.765625q0.75 -0.640625 1.84375 -0.640625q0.765625 0 1.40625 0.328125q0.640625 0.328125 0.984375 0.890625q0.34375 0.5625 0.34375 1.203125q0 0.59375 -0.328125 1.09375q-0.328125 0.5 -0.953125 0.78125q0.8125 0.203125 1.265625 0.796875q0.46875 0.59375 0.46875 1.5q0 1.21875 -0.890625 2.078125q-0.890625 0.84375 -2.25 0.84375q-1.21875 0 -2.03125 -0.734375q-0.8125 -0.734375 -0.921875 -1.890625z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m287.22308 247.99738l39.653564 0l0 32.53543l-39.653564 0z" fill-rule="nonzero"></path><path fill="#000000" d="m307.54675 269.79736l0 -2.234375l-4.03125 0l0 -1.046875l4.234375 -6.03125l0.9375 0l0 6.03125l1.265625 0l0 1.046875l-1.265625 0l0 2.234375l-1.140625 0zm0 -3.28125l0 -4.1875l-2.921875 4.1875l2.921875 0z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m629.2467 241.13911l53.480347 0l0 32.535416l-53.480347 0z" fill-rule="nonzero"></path><path fill="#000000" d="m638.7936 260.486l1.140625 -0.15625q0.203125 0.96875 0.671875 1.40625q0.46875 0.421875 1.15625 0.421875q0.796875 0 1.34375 -0.546875q0.5625 -0.5625 0.5625 -1.390625q0 -0.796875 -0.515625 -1.296875q-0.5 -0.515625 -1.296875 -0.515625q-0.328125 0 -0.8125 0.125l0.125 -1.0q0.125 0.015625 0.1875 0.015625q0.734375 0 1.3125 -0.375q0.59375 -0.390625 0.59375 -1.1875153q0 -0.625 -0.4375 -1.03125q-0.421875 -0.421875 -1.09375 -0.421875q-0.671875 0 -1.109375 0.421875q-0.4375 0.421875 -0.578125 1.2500153l-1.140625 -0.203125q0.21875 -1.1406403 0.953125 -1.7656403q0.75 -0.640625 1.84375 -0.640625q0.765625 0 1.40625 0.328125q0.640625 0.328125 0.984375 0.890625q0.34375 0.5625 0.34375 1.2031403q0 0.59375 -0.328125 1.09375q-0.328125 0.5 -0.953125 0.78125q0.8125 0.203125 1.265625 0.796875q0.46875 0.59375 0.46875 1.5q0 1.21875 -0.890625 2.078125q-0.890625 0.84375 -2.25 0.84375q-1.21875 0 -2.03125 -0.734375q-0.8125 -0.734375 -0.921875 -1.890625zm12.115601 1.625q-0.625 0.53125 -1.21875 0.765625q-0.578125 0.21875 -1.25 0.21875q-1.125 0 -1.71875 -0.546875q-0.59375 -0.546875 -0.59375 -1.390625q0 -0.484375 0.21875 -0.890625q0.234375 -0.421875 0.59375 -0.671875q0.375 -0.25 0.828125 -0.375q0.328125 -0.078125 1.015625 -0.171875q1.375 -0.15625 2.03125 -0.390625q0.015625 -0.234375 0.015625 -0.296875q0 -0.703125 -0.328125 -0.984375q-0.4375 -0.390625 -1.296875 -0.390625q-0.8125 0 -1.203125 0.28125q-0.375 0.28125 -0.5625 1.0l-1.109375 -0.140625q0.140625 -0.71875 0.484375 -1.15625q0.359375 -0.453125 1.015625 -0.6875q0.671875 -0.234375 1.53125 -0.234375q0.875 0 1.40625 0.203125q0.546875 0.203125 0.796875 0.515625q0.25 0.296875 0.359375 0.765625q0.046875 0.296875 0.046875 1.0625l0 1.515625q0 1.59375 0.078125 2.015625q0.078125 0.421875 0.28125 0.8125l-1.1875 0q-0.171875 -0.359375 -0.234375 -0.828125zm-0.09375 -2.5625q-0.625 0.265625 -1.859375 0.4375q-0.703125 0.109375 -1.0 0.234375q-0.296875 0.125 -0.453125 0.375q-0.15625 0.234375 -0.15625 0.53125q0 0.453125 0.34375 0.765625q0.34375 0.296875 1.015625 0.296875q0.65625 0 1.171875 -0.28125q0.515625 -0.296875 0.765625 -0.796875q0.171875 -0.375 0.171875 -1.140625l0 -0.421875zm3.4124756 3.390625l0 -1.296875l1.296875 0l0 1.296875q0 0.71875 -0.25 1.15625q-0.25 0.4375 -0.8125 0.6875l-0.3125 -0.484375q0.359375 -0.171875 0.53125 -0.484375q0.171875 -0.296875 0.1875 -0.875l-0.640625 0zm3.093628 -2.453125l1.140625 -0.15625q0.203125 0.96875 0.671875 1.40625q0.46875 0.421875 1.15625 0.421875q0.796875 0 1.34375 -0.546875q0.5625 -0.5625 0.5625 -1.390625q0 -0.796875 -0.515625 -1.296875q-0.5 -0.515625 -1.296875 -0.515625q-0.328125 0 -0.8125 0.125l0.125 -1.0q0.125 0.015625 0.1875 0.015625q0.734375 0 1.3125 -0.375q0.59375 -0.390625 0.59375 -1.1875153q0 -0.625 -0.4375 -1.03125q-0.421875 -0.421875 -1.09375 -0.421875q-0.671875 0 -1.109375 0.421875q-0.4375 0.421875 -0.578125 1.2500153l-1.140625 -0.203125q0.21875 -1.1406403 0.953125 -1.7656403q0.75 -0.640625 1.84375 -0.640625q0.765625 0 1.40625 0.328125q0.640625 0.328125 0.984375 0.890625q0.34375 0.5625 0.34375 1.2031403q0 0.59375 -0.328125 1.09375q-0.328125 0.5 -0.953125 0.78125q0.8125 0.203125 1.265625 0.796875q0.46875 0.59375 0.46875 1.5q0 1.21875 -0.890625 2.078125q-0.890625 0.84375 -2.25 0.84375q-1.21875 0 -2.03125 -0.734375q-0.8125 -0.734375 -0.921875 -1.890625zm12.115601 -0.015625l1.125 0.140625q-0.171875 1.171875 -0.9375 1.828125q-0.765625 0.65625 -1.859375 0.65625q-1.390625 0 -2.234375 -0.90625q-0.828125 -0.90625 -0.828125 -2.59375q0 -1.09375 0.359375 -1.90625q0.359375 -0.828125 1.09375 -1.234375q0.734375 -0.40625 1.609375 -0.40625q1.09375 0 1.796875 0.5625q0.703125 0.546875 0.890625 1.5625l-1.109375 0.171875q-0.15625 -0.671875 -0.5625 -1.015625q-0.390625 -0.34375 -0.96875 -0.34375q-0.859375 0 -1.40625 0.625q-0.53125 0.609375 -0.53125 1.953125q0 1.359375 0.515625 1.984375q0.515625 0.609375 1.359375 0.609375q0.671875 0 1.125 -0.40625q0.453125 -0.421875 0.5625 -1.28125z" fill-rule="nonzero"></path><path fill="#cfe2f3" d="m30.19843 388.34384l136.37796 0l0 61.007874l-136.37796 0z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m30.19843 388.34384l136.37796 0l0 61.007874l-136.37796 0z" fill-rule="nonzero"></path><path fill="#000000" d="m44.392044 426.58026l1.609375 0.25q0.109375 0.75 0.578125 1.09375q0.609375 0.453125 1.6875 0.453125q1.171875 0 1.796875 -0.46875q0.625 -0.453125 0.859375 -1.28125q0.125 -0.515625 0.109375 -2.15625q-1.09375 1.296875 -2.71875 1.296875q-2.03125 0 -3.15625 -1.46875q-1.109375 -1.46875 -1.109375 -3.515625q0 -1.40625 0.515625 -2.59375q0.515625 -1.203125 1.484375 -1.84375q0.96875 -0.65625 2.265625 -0.65625q1.75 0 2.875 1.40625l0 -1.1875l1.546875 0l0 8.515625q0 2.3125 -0.46875 3.265625q-0.46875 0.96875 -1.484375 1.515625q-1.015625 0.5625 -2.5 0.5625q-1.765625 0 -2.859375 -0.796875q-1.078125 -0.796875 -1.03125 -2.390625zm1.375 -5.921875q0 1.953125 0.765625 2.84375q0.78125 0.890625 1.9375 0.890625q1.140625 0 1.921875 -0.890625q0.78125 -0.890625 0.78125 -2.78125q0 -1.8125 -0.8125 -2.71875q-0.796875 -0.921875 -1.921875 -0.921875q-1.109375 0 -1.890625 0.90625q-0.78125 0.890625 -0.78125 2.671875zm9.547592 5.109375l0 -13.59375l6.03125 0q1.8125 0 2.75 0.359375q0.953125 0.359375 1.515625 1.296875q0.5625 0.921875 0.5625 2.046875q0 1.453125 -0.9375 2.453125q-0.921875 0.984375 -2.890625 1.25q0.71875 0.34375 1.09375 0.671875q0.78125 0.734375 1.484375 1.8125l2.375 3.703125l-2.265625 0l-1.796875 -2.828125q-0.796875 -1.21875 -1.3125 -1.875q-0.5 -0.65625 -0.90625 -0.90625q-0.40625 -0.265625 -0.8125 -0.359375q-0.3125 -0.078125 -1.015625 -0.078125l-2.078125 0l0 6.046875l-1.796875 0zm1.796875 -7.59375l3.859375 0q1.234375 0 1.921875 -0.25q0.703125 -0.265625 1.0625 -0.828125q0.375 -0.5625 0.375 -1.21875q0 -0.96875 -0.703125 -1.578125q-0.703125 -0.625 -2.21875 -0.625l-4.296875 0l0 4.5zm11.644821 7.59375l0 -13.59375l5.125 0q1.359375 0 2.078125 0.125q1.0 0.171875 1.671875 0.640625q0.671875 0.46875 1.078125 1.3125q0.421875 0.84375 0.421875 1.84375q0 1.734375 -1.109375 2.9375q-1.09375 1.203125 -3.984375 1.203125l-3.484375 0l0 5.53125l-1.796875 0zm1.796875 -7.140625l3.515625 0q1.75 0 2.46875 -0.640625q0.734375 -0.65625 0.734375 -1.828125q0 -0.859375 -0.4375 -1.46875q-0.421875 -0.609375 -1.125 -0.796875q-0.453125 -0.125 -1.671875 -0.125l-3.484375 0l0 4.859375zm20.349823 2.375l1.796875 0.453125q-0.5625 2.21875 -2.03125 3.390625q-1.46875 1.15625 -3.59375 1.15625q-2.203125 0 -3.578125 -0.890625q-1.375 -0.90625 -2.09375 -2.59375q-0.71875 -1.703125 -0.71875 -3.65625q0 -2.125 0.796875 -3.703125q0.8125 -1.578125 2.3125 -2.390625q1.5 -0.828125 3.296875 -0.828125q2.046875 0 3.4375 1.046875q1.390625 1.03125 1.9375 2.90625l-1.765625 0.421875q-0.46875 -1.484375 -1.375 -2.15625q-0.90625 -0.6875 -2.265625 -0.6875q-1.5625 0 -2.625 0.75q-1.046875 0.75 -1.484375 2.03125q-0.421875 1.265625 -0.421875 2.609375q0 1.734375 0.5 3.03125q0.515625 1.28125 1.578125 1.921875q1.078125 0.640625 2.3125 0.640625q1.515625 0 2.5625 -0.859375q1.046875 -0.875 1.421875 -2.59375zm8.343758 0.390625l1.6875 -0.140625q0.125 1.015625 0.5625 1.671875q0.4375 0.65625 1.359375 1.0625q0.9375 0.40625 2.09375 0.40625q1.03125 0 1.8125 -0.3125q0.796875 -0.3125 1.1875 -0.84375q0.390625 -0.53125 0.390625 -1.15625q0 -0.640625 -0.375 -1.109375q-0.375 -0.484375 -1.234375 -0.8125q-0.546875 -0.21875 -2.421875 -0.65625q-1.875 -0.453125 -2.625 -0.859375q-0.96875 -0.515625 -1.453125 -1.265625q-0.46875 -0.75 -0.46875 -1.6875q0 -1.03125 0.578125 -1.921875q0.59375 -0.90625 1.703125 -1.359375q1.125 -0.46875 2.5 -0.46875q1.515625 0 2.671875 0.484375q1.15625 0.484375 1.765625 1.4375q0.625 0.9375 0.671875 2.140625l-1.71875 0.125q-0.140625 -1.28125 -0.953125 -1.9375q-0.796875 -0.671875 -2.359375 -0.671875q-1.625 0 -2.375 0.609375q-0.75 0.59375 -0.75 1.4375q0 0.734375 0.53125 1.203125q0.515625 0.46875 2.703125 0.96875q2.203125 0.5 3.015625 0.875q1.1875 0.546875 1.75 1.390625q0.578125 0.828125 0.578125 1.921875q0 1.09375 -0.625 2.0625q-0.625 0.953125 -1.796875 1.484375q-1.15625 0.53125 -2.609375 0.53125q-1.84375 0 -3.09375 -0.53125q-1.25 -0.546875 -1.96875 -1.625q-0.703125 -1.078125 -0.734375 -2.453125zm19.584198 1.203125l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.094467 5.875l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0zm8.962669 0l-3.7499924 -9.859375l1.7656174 0l2.125 5.90625q0.34375 0.953125 0.625 1.984375q0.21875 -0.78125 0.625 -1.875l2.1875 -6.015625l1.71875 0l-3.734375 9.859375l-1.5625 0zm13.34375 -3.171875l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.094467 5.875l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0z" fill-rule="nonzero"></path><path fill="#6d9eeb" d="m711.31287 273.67322l136.37793 0l0 61.007874l-136.37793 0z" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m711.31287 273.67322l136.37793 0l0 61.007874l-136.37793 0z" fill-rule="nonzero"></path><path fill="#000000" d="m760.14105 300.09717l0 -13.59375l1.796875 0l0 11.984375l6.703125 0l0 1.609375l-8.5 0zm9.610046 -4.921875q0 -2.734375 1.53125 -4.0625q1.265625 -1.09375 3.09375 -1.09375q2.031311 0 3.312561 1.34375q1.296875 1.328125 1.296875 3.671875q0 1.90625 -0.578125 3.0q-0.5625 1.078125 -1.65625 1.6875q-1.078125 0.59375 -2.375061 0.59375q-2.0625 0 -3.34375 -1.328125q-1.28125 -1.328125 -1.28125 -3.8125zm1.71875 0q0 1.890625 0.828125 2.828125q0.828125 0.9375 2.078125 0.9375q1.250061 0 2.062561 -0.9375q0.828125 -0.953125 0.828125 -2.890625q0 -1.828125 -0.828125 -2.765625q-0.828125 -0.9375 -2.062561 -0.9375q-1.25 0 -2.078125 0.9375q-0.828125 0.9375 -0.828125 2.828125zm15.719482 3.703125q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm10.469482 4.9375l0 -1.25q-0.9375 1.46875 -2.75 1.46875q-1.171875 0 -2.171875 -0.640625q-0.984375 -0.65625 -1.53125 -1.8125q-0.53125 -1.171875 -0.53125 -2.6875q0 -1.46875 0.484375 -2.671875q0.5 -1.203125 1.46875 -1.84375q0.984375 -0.640625 2.203125 -0.640625q0.890625 0 1.578125 0.375q0.703125 0.375 1.140625 0.984375l0 -4.875l1.65625 0l0 13.59375l-1.546875 0zm-5.28125 -4.921875q0 1.890625 0.796875 2.828125q0.8125 0.9375 1.890625 0.9375q1.09375 0 1.859375 -0.890625q0.765625 -0.890625 0.765625 -2.734375q0 -2.015625 -0.78125 -2.953125q-0.78125 -0.953125 -1.921875 -0.953125q-1.109375 0 -1.859375 0.90625q-0.75 0.90625 -0.75 2.859375z" fill-rule="nonzero"></path><path fill="#000000" d="m744.0764 322.09717l0 -13.59375l5.109375 0q1.546875 0 2.484375 0.40625q0.953125 0.40625 1.484375 1.265625q0.53125 0.859375 0.53125 1.796875q0 0.875 -0.46875 1.65625q-0.46875 0.765625 -1.4375 1.234375q1.234375 0.359375 1.890625 1.234375q0.671875 0.875 0.671875 2.0625q0 0.953125 -0.40625 1.78125q-0.390625 0.8125 -0.984375 1.265625q-0.59375 0.4375 -1.5 0.671875q-0.890625 0.21875 -2.1875 0.21875l-5.1875 0zm1.796875 -7.890625l2.9375 0q1.203125 0 1.71875 -0.15625q0.6875 -0.203125 1.03125 -0.671875q0.359375 -0.46875 0.359375 -1.1875q0 -0.671875 -0.328125 -1.1875q-0.328125 -0.515625 -0.9375 -0.703125q-0.59375 -0.203125 -2.0625 -0.203125l-2.71875 0l0 4.109375zm0 6.28125l3.390625 0q0.875 0 1.21875 -0.0625q0.625 -0.109375 1.046875 -0.359375q0.421875 -0.265625 0.6875 -0.765625q0.265625 -0.5 0.265625 -1.140625q0 -0.765625 -0.390625 -1.328125q-0.390625 -0.5625 -1.078125 -0.78125q-0.6875 -0.234375 -1.984375 -0.234375l-3.15625 0l0 4.671875zm16.943604 0.390625q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm4.0476074 4.9375l0 -13.59375l1.671875 0l0 13.59375l-1.671875 0zm10.613525 -1.21875q-0.9375 0.796875 -1.796875 1.125q-0.859375 0.3125 -1.84375 0.3125q-1.609375 0 -2.484375 -0.78125q-0.875 -0.796875 -0.875 -2.03125q0 -0.734375 0.328125 -1.328125q0.328125 -0.59375 0.859375 -0.953125q0.53125 -0.359375 1.203125 -0.546875q0.5 -0.140625 1.484375 -0.25q2.03125 -0.25 2.984375 -0.578125q0 -0.34375 0 -0.4375q0 -1.015625 -0.46875 -1.4375q-0.640625 -0.5625 -1.90625 -0.5625q-1.171875 0 -1.734375 0.40625q-0.5625 0.40625 -0.828125 1.46875l-1.640625 -0.234375q0.234375 -1.046875 0.734375 -1.6875q0.515625 -0.640625 1.46875 -0.984375q0.96875 -0.359375 2.25 -0.359375q1.265625 0 2.046875 0.296875q0.78125 0.296875 1.15625 0.75q0.375 0.453125 0.515625 1.140625q0.09375 0.421875 0.09375 1.53125l0 2.234375q0 2.328125 0.09375 2.953125q0.109375 0.609375 0.4375 1.171875l-1.75 0q-0.265625 -0.515625 -0.328125 -1.21875zm-0.140625 -3.71875q-0.90625 0.359375 -2.734375 0.625q-1.03125 0.140625 -1.453125 0.328125q-0.421875 0.1875 -0.65625 0.546875q-0.234375 0.359375 -0.234375 0.796875q0 0.671875 0.5 1.125q0.515625 0.4375 1.484375 0.4375q0.96875 0 1.71875 -0.421875q0.75 -0.4375 1.109375 -1.15625q0.265625 -0.578125 0.265625 -1.671875l0 -0.609375zm4.0788574 4.9375l0 -9.859375l1.5 0l0 1.40625q1.09375 -1.625 3.140625 -1.625q0.890625 0 1.640625 0.328125q0.75 0.3125 1.109375 0.84375q0.375 0.515625 0.53125 1.21875q0.09375 0.46875 0.09375 1.625l0 6.0625l-1.671875 0l0 -6.0q0 -1.015625 -0.203125 -1.515625q-0.1875 -0.515625 -0.6875 -0.8125q-0.5 -0.296875 -1.171875 -0.296875q-1.0625 0 -1.84375 0.671875q-0.765625 0.671875 -0.765625 2.578125l0 5.375l-1.671875 0zm16.813232 -3.609375l1.640625 0.21875q-0.265625 1.6875 -1.375 2.65625q-1.109375 0.953125 -2.734375 0.953125q-2.015625 0 -3.25 -1.3125q-1.21875 -1.328125 -1.21875 -3.796875q0 -1.59375 0.515625 -2.78125q0.53125 -1.203125 1.609375 -1.796875q1.09375 -0.609375 2.359375 -0.609375q1.609375 0 2.625 0.8125q1.015625 0.8125 1.3125 2.3125l-1.625 0.25q-0.234375 -1.0 -0.828125 -1.5q-0.59375 -0.5 -1.421875 -0.5q-1.265625 0 -2.0625 0.90625q-0.78125 0.90625 -0.78125 2.859375q0 1.984375 0.765625 2.890625q0.765625 0.890625 1.984375 0.890625q0.984375 0 1.640625 -0.59375q0.65625 -0.609375 0.84375 -1.859375zm9.640625 0.4375l1.71875 0.21875q-0.40625 1.5 -1.515625 2.34375q-1.09375 0.828125 -2.8125 0.828125q-2.15625 0 -3.421875 -1.328125q-1.265625 -1.328125 -1.265625 -3.734375q0 -2.484375 1.265625 -3.859375q1.28125 -1.375 3.328125 -1.375q1.984375 0 3.234375 1.34375q1.25 1.34375 1.25 3.796875q0 0.140625 -0.015625 0.4375l-7.34375 0q0.09375 1.625 0.921875 2.484375q0.828125 0.859375 2.0625 0.859375q0.90625 0 1.546875 -0.46875q0.65625 -0.484375 1.046875 -1.546875zm-5.484375 -2.703125l5.5 0q-0.109375 -1.234375 -0.625 -1.859375q-0.796875 -0.96875 -2.078125 -0.96875q-1.140625 0 -1.9375 0.78125q-0.78125 0.765625 -0.859375 2.046875zm9.094482 5.875l0 -9.859375l1.5 0l0 1.5q0.578125 -1.046875 1.0625 -1.375q0.484375 -0.34375 1.078125 -0.34375q0.84375 0 1.71875 0.546875l-0.578125 1.546875q-0.609375 -0.359375 -1.234375 -0.359375q-0.546875 0 -0.984375 0.328125q-0.421875 0.328125 -0.609375 0.90625q-0.28125 0.890625 -0.28125 1.953125l0 5.15625l-1.671875 0z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m711.31287 304.17715l-168.0315 -84.15747" fill-rule="nonzero"></path><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m700.5833 298.80334l-146.57245 -73.40985" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m699.104 301.75708l9.5946045 1.1107483l-6.6359253 -7.0181885z" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m555.49023 222.43977l-9.5946045 -1.1107635l6.6359253 7.0181885z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m711.31287 304.17715l-612.9134 84.1575" fill-rule="nonzero"></path><path stroke="#999999" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" stroke-dasharray="8.0,6.0" d="m699.4244 305.80954l-589.1365 80.89273" fill-rule="evenodd"></path><path fill="#999999" stroke="#999999" stroke-width="2.0" stroke-linecap="butt" d="m699.8737 309.0823l8.54248 -4.507416l-9.441223 -2.0381165z" fill-rule="evenodd"></path><path fill="#999999" stroke="#999999" stroke-width="2.0" stroke-linecap="butt" d="m109.83856 383.4295l-8.54245 4.507416l9.4412 2.0381165z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m711.31287 304.17715l-390.4882 84.1575" fill-rule="nonzero"></path><path stroke="#999999" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" stroke-dasharray="8.0,6.0" d="m699.5822 306.70535l-367.02686 79.101105" fill-rule="evenodd"></path><path fill="#999999" stroke="#999999" stroke-width="2.0" stroke-linecap="butt" d="m700.27814 309.93466l8.176514 -5.14151l-9.568481 -1.3171387z" fill-rule="evenodd"></path><path fill="#999999" stroke="#999999" stroke-width="2.0" stroke-linecap="butt" d="m331.85934 382.57715l-8.176483 5.14151l9.568451 1.3171387z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m711.31287 304.17715l-168.0315 84.1575" fill-rule="nonzero"></path><path stroke="#999999" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" stroke-dasharray="8.0,6.0" d="m700.5833 309.55096l-146.57245 73.40988" fill-rule="evenodd"></path><path fill="#999999" stroke="#999999" stroke-width="2.0" stroke-linecap="butt" d="m702.0627 312.50467l6.6359253 -7.0181885l-9.5946045 1.1107788z" fill-rule="evenodd"></path><path fill="#999999" stroke="#999999" stroke-width="2.0" stroke-linecap="butt" d="m552.53156 380.00714l-6.6359253 7.0181885l9.5946045 -1.1107788z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m538.70605 294.4908l39.653503 0l0 32.53543l-39.653503 0z" fill-rule="nonzero"></path><path fill="#000000" d="m551.66724 313.83768l1.140625 -0.15625q0.203125 0.96875 0.671875 1.40625q0.46875 0.421875 1.15625 0.421875q0.796875 0 1.34375 -0.546875q0.5625 -0.5625 0.5625 -1.390625q0 -0.796875 -0.515625 -1.296875q-0.5 -0.515625 -1.296875 -0.515625q-0.328125 0 -0.8125 0.125l0.125 -1.0q0.125 0.015625 0.1875 0.015625q0.734375 0 1.3125 -0.375q0.59375 -0.390625 0.59375 -1.1875q0 -0.625 -0.4375 -1.03125q-0.421875 -0.421875 -1.09375 -0.421875q-0.671875 0 -1.109375 0.421875q-0.4375 0.421875 -0.578125 1.25l-1.140625 -0.203125q0.21875 -1.140625 0.953125 -1.765625q0.75 -0.640625 1.84375 -0.640625q0.765625 0 1.40625 0.328125q0.640625 0.328125 0.984375 0.890625q0.34375 0.5625 0.34375 1.203125q0 0.59375 -0.328125 1.09375q-0.328125 0.5 -0.953125 0.78125q0.8125 0.203125 1.265625 0.796875q0.46875 0.59375 0.46875 1.5q0 1.21875 -0.890625 2.078125q-0.890625 0.84375 -2.25 0.84375q-1.21875 0 -2.03125 -0.734375q-0.8125 -0.734375 -0.921875 -1.890625zm8.771851 2.453125l-1.0625 0l0 -9.3125l1.15625 0l0 3.328125q0.71875 -0.90625 1.84375 -0.90625q0.625 0 1.171875 0.25q0.5625 0.25 0.921875 0.703125q0.359375 0.453125 0.5625 1.09375q0.203125 0.640625 0.203125 1.375q0 1.734375 -0.859375 2.6875q-0.859375 0.9375 -2.0625 0.9375q-1.1875 0 -1.875 -1.0l0 0.84375zm-0.015625 -3.421875q0 1.21875 0.34375 1.75q0.53125 0.890625 1.453125 0.890625q0.75 0 1.296875 -0.65625q0.546875 -0.65625 0.546875 -1.9375q0 -1.328125 -0.53125 -1.953125q-0.515625 -0.625 -1.265625 -0.625q-0.75 0 -1.296875 0.65625q-0.546875 0.640625 -0.546875 1.875z" fill-rule="nonzero"></path></g></svg>
+
diff --git a/doc/images/load_balancing_design.png b/doc/images/load_balancing_design.png
deleted file mode 100644
index 8618396..0000000
--- a/doc/images/load_balancing_design.png
+++ /dev/null
Binary files differ
diff --git a/doc/load-balancing.md b/doc/load-balancing.md
index dfaa7a7..f56d2b0 100644
--- a/doc/load-balancing.md
+++ b/doc/load-balancing.md
@@ -1,13 +1,21 @@
 Load Balancing in gRPC
-=======================
+======================
 
-# Objective
+# Scope
 
-To design a load balancing API between a gRPC client and a Load Balancer to
-instruct the client how to send load to multiple backend servers.
+This document explains the design for load balancing within gRPC.
 
 # Background
 
+## Per-Call Load Balancing
+
+It is worth noting that load-balancing within gRPC happens on a per-call
+basis, not a per-connection basis.  In other words, even if all requests
+come from a single client, we still want them to be load-balanced across
+all servers.
+
+## Approaches to Load Balancing
+
 Prior to any gRPC specifics, we explore some usual ways to approach load
 balancing.
 
@@ -44,30 +52,31 @@
 ### External Load Balancing Service
 
 The client load balancing code is kept simple and portable, implementing
-well-known algorithms (ie, Round Robin) for server selection.
-Complex load balancing algorithms are instead provided by the load balancer. The
-client relies on the load balancer to provide _load balancing configuration_ and
-_the list of servers_ to which the client should send requests. The balancer
-updates the server list as needed to balance the load as well as handle server
+well-known algorithms (e.g., Round Robin) for server selection.
+Complex load balancing algorithms are instead provided by the load
+balancer. The client relies on the load balancer to provide _load
+balancing configuration_ and _the list of servers_ to which the client
+should send requests. The balancer updates the server list as needed
+to balance the load as well as handle server unavailability or health
+issues. The load balancer will make any necessary complex decisions and
+inform the client. The load balancer may communicate with the backend
+servers to collect load and health information.
+
+# Requirements
+
+## Simple API and client
+
+The gRPC client load balancing code must be simple and portable. The
+client should only contain simple algorithms (e.g., Round Robin) for
+server selection.  For complex algorithms, the client should rely on
+a load balancer to provide load balancing configuration and the list of
+servers to which the client should send requests. The balancer will update
+the server list as needed to balance the load as well as handle server
 unavailability or health issues. The load balancer will make any necessary
-complex decisions and inform the client. The load balancer may communicate with
-the backend servers to collect load and health information.
+complex decisions and inform the client. The load balancer may communicate
+with the backend servers to collect load and health information.
 
-
-## Requirements
-
-#### Simple API and client
-
-The gRPC client load balancing code must be simple and portable. The client
-should only contain simple algorithms (ie Round Robin) for server selection. For
-complex algorithms, the client should rely on a load balancer to provide load
-balancing configuration and the list of servers to which the client should send
-requests. The balancer will update the server list as needed to balance the load
-as well as handle server unavailability or health issues. The load balancer will
-make any necessary complex decisions and inform the client. The load balancer
-may communicate with the backend servers to collect load and health information.
-
-#### Security
+## Security
 
 The load balancer may be separate from the actual server backends and a
 compromise of the load balancer should only lead to a compromise of the
@@ -75,70 +84,64 @@
 not be able to cause a client to trust a (potentially malicious) backend server
 any more than in a comparable situation without loadbalancing.
 
-# Proposed Architecture
+# Architecture
 
-The gRPC load balancing implements the external load balancing server approach:
-an external load balancer provides simple clients with an up-to-date list of
-servers.
+## Overview
 
-![image](images/load_balancing_design.png)
+The primary mechanism for load-balancing in gRPC is external
+load-balancing, where an external load balancer provides simple clients
+with an up-to-date list of servers.
 
-1. On startup, the gRPC client issues a name resolution request for the service.
-   The name will resolve to one or more IP addresses to gRPC servers, a hint on
-   whether the IP address(es) point to a load balancer or not, and also return a
-   client config.
-2. The gRPC client connects to a gRPC Server.
-   1. If the name resolution has hinted that the endpoint is a load balancer,
-      the client's gRPC LB policy will attempt to open a stream to the load
-      balancer service. The server may respond in only one of the following
-      ways.
-      1. `status::UNIMPLEMENTED`. There is no loadbalancing in use. The client
-         call will fail.
-      2. "I am a Load Balancer and here is the server list." (Goto Step 4.)
-      3. "Please contact Load Balancer X" (See Step 3.) The client will close
-         this connection and cancel the stream.
-      4. If the server fails to respond, the client will wait for some timeout
-         and then re-resolve the name (process to Step 1 above).
-   2. If the name resolution has not hinted that the endpoint is a load
-      balancer, the client connects directly to the service it wants to talk to.
-3. The gRPC client's gRPC LB policy opens a separate connection to the Load
-   Balancer. If this fails, it will go back to step 1 and try another address.
-   1. During channel initialization to the Load Balancer, the client will
-      attempt to open a stream to the Load Balancer service.
-   2. The Load Balancer will return a server list to the gRPC client. If the
-      server list is empty, the call will wait until a non-empty one is
-      received. Optional: The Load Balancer will also open channels to the gRPC
-      servers if load reporting is needed.
-4. The gRPC client will send RPCs to the gRPC servers contained in the server
-   list from the Load Balancer.
-5. Optional: The gRPC servers may periodically report load to the Load Balancer.
+The gRPC client does support an API for built-in load balancing policies.
+However, there are only a small number of these (one of which is the
+`grpclb` policy, which implements external load balancing), and users
+are discouraged from trying to extend gRPC by adding more.  Instead, new
+load balancing policies should be implemented in external load balancers.
 
-## Client
+## Workflow
 
-When establishing a gRPC _stream_ to the balancer, the client will send an initial
-request to the load balancer (via a regular gRPC message). The load balancer
-will respond with client config (including, for example, settings for flow
-control, RPC deadlines, etc.) or a redirect to another load balancer. If the
-balancer did not redirect the client, it will then send a list of servers to the
-client. The client will contain simple load balancing logic for choosing the
-next server when it needs to send a request.
+Load-balancing policies fit into the gRPC client workflow in between
+name resolution and the connection to the server.  Here's how it all
+works:
 
-## Load Balancer
+![image](images/load-balancing.png)
 
-The Load Balancer is responsible for providing the client with a list of servers
-and client RPC parameters. The balancer chooses when to update the list of
-servers and can decide whether to provide a complete list, a subset, or a
-specific list of “picked” servers in a particular order. The balancer can
-optionally provide an expiration interval after which the server list should no
-longer be trusted and should be updated by the balancer.
-
-The load balancer may open reporting streams to each server contained in the
-server list. These streams are primarily used for load reporting. For example,
-Weighted Round Robin requires that the servers report utilization to the load
-balancer in order to compute the next list of servers.
-
-## Server
-
-The gRPC Server is responsible for answering RPC requests and providing
-responses to the client. The server will also report load to the load balancer
-if a reporting stream was opened for this purpose.
+1. On startup, the gRPC client issues a [name resolution](naming.md) request
+   for the server name.  The name will resolve to one or more IP addresses,
+   each of which will indicate whether it is a server address or
+   a load balancer address, and a [service config](service_config.md)
+   that indicates which client-side load-balancing policy to use (e.g.,
+   `round_robin` or `grpclb`).
+2. The client instantiates the load balancing policy.
+   - Note: If all addresses returned by the resolver are balancer
+     addresses, then the client will use the `grpclb` policy, regardless
+     of what load-balancing policy was requested by the service config.
+     Otherwise, the client will use the load-balancing policy requested
+     by the service config.  If no load-balancing policy is requested
+     by the service config, then the client will default to a policy
+     that picks the first available server address.
+3. The load balancing policy creates a subchannel to each server address.
+   - For all policies *except* `grpclb`, this means one subchannel for each
+     address returned by the resolver. Note that these policies
+     ignore any balancer addresses returned by the resolver.
+   - In the case of the `grpclb` policy, the workflow is as follows:
+     1. The policy opens a stream to one of the balancer addresses returned
+        by the resolver. It asks the balancer for the server addresses to
+        use for the server name originally requested by the client (i.e.,
+        the same one originally passed to the name resolver).
+        - Note: The `grpclb` policy currently ignores any non-balancer
+          addresses returned by the resolver. However, in the future, it
+          may be changed to use these addresses as a fallback in case no
+          balancers can be contacted.
+     2. The gRPC servers to which the load balancer is directing the client
+        may report load to the load balancers, if that information is needed
+        by the load balancer's configuration.
+     3. The load balancer returns a server list to the gRPC client's `grpclb`
+        policy. The `grpclb` policy will then create a subchannel to each of
+        server in the list.
+4. For each RPC sent, the load balancing policy decides which
+   subchannel (i.e., which server) the RPC should be sent to.
+   - In the case of the `grpclb` policy, the client will send requests
+     to the servers in the order in which they were returned by the load
+     balancer.  If the server list is empty, the call will block until a
+     non-empty one is received.
diff --git a/doc/naming.md b/doc/naming.md
index d0c892e..676aa9f 100644
--- a/doc/naming.md
+++ b/doc/naming.md
@@ -1,30 +1,65 @@
-#gRPC Naming and Discovery Support
+# gRPC Name Resolution
 
 ## Overview
 
-gRPC supports DNS as the default name-system. A number of alternative name-systems are used in various deployments. We propose an API that is general enough to support a range of name-systems and the corresponding syntax for names. The gRPC client library in various languages will provide a plugin mechanism so resolvers for different name-systems can be plugged in.
+gRPC supports DNS as the default name-system. A number of alternative
+name-systems are used in various deployments. We support an API that is
+general enough to support a range of name-systems and the corresponding
+syntax for names. The gRPC client library in various languages will
+provide a plugin mechanism so resolvers for different name-systems can
+be plugged in.
 
-## Detailed Proposal
+## Detailed Design
 
- A fully qualified, self contained name used for gRPC channel construction uses the syntax:
+### Name Syntax
+
+A fully qualified, self contained name used for gRPC channel construction
+uses the syntax:
 
 ```
 scheme://authority/endpoint_name
 ```
 
-Here, scheme indicates the name-system to be used. Example schemes to be supported include: 
+Here, `scheme` indicates the name-system to be used. Currently, we
+support the following schemes:
 
-* `dns`
+- `dns`
 
-* `etcd`
+- `ipv4` (IPv4 address)
 
-Authority indicates some scheme-specific bootstrap information, e.g., for DNS, the authority may include the IP[:port] of the DNS server to use. Often, a DNS name may used as the authority, since the ability to resolve DNS names is already built into all gRPC client libraries.
+- `ipv6` (IPv6 address)
 
-Finally, the  endpoint_name indicates a concrete name to be looked up in a given name-system identified by the scheme and the authority. The syntax of endpoint name is dictated by the scheme in use.
+- `unix` (path to unix domain socket -- unix systems only)
 
-### Plugins
+In the future, additional schemes such as `etcd` could be added.
 
-The gRPC client library will switch on the scheme to pick the right resolver plugin and pass it the fully qualified name string.
+The `authority` indicates some scheme-specific bootstrap information, e.g.,
+for DNS, the authority may include the IP[:port] of the DNS server to
+use. Often, a DNS name may be used as the authority, since the ability to
+resolve DNS names is already built into all gRPC client libraries.
 
-Resolvers should be able to contact the authority and get a resolution that they return back to the gRPC client library. The returned contents include a list of IP:port, an optional config and optional auth config data to be used for channel authentication. The plugin API allows the resolvers to continuously watch an endpoint_name and return updated resolutions as needed. 
+Finally, the `endpoint_name` indicates a concrete name to be looked up
+in a given name-system identified by the scheme and the authority. The
+syntax of the endpoint name is dictated by the scheme in use.
 
+### Resolver Plugins
+
+The gRPC client library will use the specified scheme to pick the right
+resolver plugin and pass it the fully qualified name string.
+
+Resolvers should be able to contact the authority and get a resolution
+that they return back to the gRPC client library. The returned contents
+include:
+
+- A list of resolved addresses, each of which has three attributes:
+  - The address itself, including both IP address and port.
+  - A boolean indicating whether the address is a backend address (i.e.,
+    the address to use to contact the server directly) or a balancer
+    address (for cases where [external load balancing](load-balancing.md)
+    is in use).
+  - The name of the balancer, if the address is a balancer address.
+    This will be used to perform peer authorization.
+- A [service config](service_config.md).
+
+The plugin API allows the resolvers to continuously watch an endpoint
+and return updated resolutions as needed.
diff --git a/doc/service_config.md b/doc/service_config.md
new file mode 100644
index 0000000..7318b69
--- /dev/null
+++ b/doc/service_config.md
@@ -0,0 +1,147 @@
+Service Config in gRPC
+======================
+
+# Objective
+
+The service config is a mechanism that allows service owners to publish
+parameters to be automatically used by all clients of their service.
+
+# Format
+
+The service config is a JSON string of the following form:
+
+```
+{
+  # Load balancing policy name.
+  # Supported values are 'round_robin' and 'grpclb'.
+  # Optional; if unset, the default behavior is pick the first available
+  # backend.
+  # Note that if the resolver returns only balancer addresses and no
+  # backend addresses, gRPC will always use the 'grpclb' policy,
+  # regardless of what this field is set to.
+  'loadBalancingPolicy': string,
+
+  # Per-method configuration.  Optional.
+  'methodConfig': [
+    {
+      # The names of the methods to which this method config applies. There
+      # must be at least one name. Each name entry must be unique across the
+      # entire service config. If the 'method' field is empty, then this
+      # method config specifies the defaults for all methods for the specified
+      # service.
+      #
+      # For example, let's say that the service config contains the following
+      # method config entries:
+      #
+      # 'methodConfig': [
+      #   { 'name': [ { 'service': 'MyService' } ] ... },
+      #   { 'name': [ { 'service': 'MyService', 'method': 'Foo' } ] ... }
+      # ]
+      #
+      # For a request for MyService/Foo, we will use the second entry, because
+      # it exactly matches the service and method name.
+      # For a request for MyService/Bar, we will use the first entry, because
+      # it provides the default for all methods of MyService.
+      'name': [
+        {
+          # RPC service name.  Required.
+          # If using gRPC with protobuf as the IDL, then this will be of
+          # the form "pkg.service_name", where "pkg" is the package name
+          # defined in the proto file.
+          'service': string,
+
+          # RPC method name.  Optional (see above).
+          'method': string,
+        }
+      ],
+
+      # Whether RPCs sent to this method should wait until the connection is
+      # ready by default. If false, the RPC will abort immediately if there
+      # is a transient failure connecting to the server. Otherwise, gRPC will
+      # attempt to connect until the deadline is exceeded.
+      #
+      # The value specified via the gRPC client API will override the value
+      # set here. However, note that setting the value in the client API will
+      # also affect transient errors encountered during name resolution,
+      # which cannot be caught by the value here, since the service config
+      # is obtained by the gRPC client via name resolution.
+      'waitForReady': bool,
+
+      # The default timeout in seconds for RPCs sent to this method. This can
+      # be overridden in code. If no reply is received in the specified amount
+      # of time, the request is aborted and a deadline-exceeded error status
+      # is returned to the caller.
+      #
+      # The actual deadline used will be the minimum of the value specified
+      # here and the value set by the application via the gRPC client API.
+      # If either one is not set, then the other will be used.
+      # If neither is set, then the request has no deadline.
+      #
+      # The format of the value is that of the 'Duration' type defined here:
+      # https://developers.google.com/protocol-buffers/docs/proto3#json
+      'timeout': string,
+
+      # The maximum allowed payload size for an individual request or object
+      # in a stream (client->server) in bytes. The size which is measured is
+      # the serialized, uncompressed payload in bytes. This applies both
+      # to streaming and non-streaming requests.
+      #
+      # The actual value used is the minimum of the value specified here and
+      # the value set by the application via the gRPC client API.
+      # If either one is not set, then the other will be used.
+      # If neither is set, then the built-in default is used.
+      #
+      # If a client attempts to send an object larger than this value, it
+      # will not be sent and the client will see an error.
+      # Note that 0 is a valid value, meaning that the request message must
+      # be empty.
+      #
+      # The format of the value is that of the 'uint64' type defined here:
+      # https://developers.google.com/protocol-buffers/docs/proto3#json
+      'maxRequestMessageBytes': string,
+
+      # The maximum allowed payload size for an individual response or object
+      # in a stream (server->client) in bytes. The size which is measured is
+      # the serialized, uncompressed payload in bytes. This applies both
+      # to streaming and non-streaming requests.
+      #
+      # The actual value used is the minimum of the value specified here and
+      # the value set by the application via the gRPC client API.
+      # If either one is not set, then the other will be used.
+      # If neither is set, then the built-in default is used.
+      #
+      # If a server attempts to send an object larger than this value, it
+      # will not be sent, and the client will see an error.
+      # Note that 0 is a valid value, meaning that the response message must
+      # be empty.
+      #
+      # The format of the value is that of the 'uint64' type defined here:
+      # https://developers.google.com/protocol-buffers/docs/proto3#json
+      'maxResponseMessageBytes': string
+    }
+  ]
+}
+```
+
+Note that new per-method parameters may be added in the future as new
+functionality is introduced.
+
+# Architecture
+
+A service config is associated with a server name.  The [name
+resolver](naming.md) plugin, when asked to resolve a particular server
+name, will return both the resolved addresses and the service config.
+
+TODO(roth): Design how the service config will be encoded in DNS.
+
+# APIs
+
+The service config is used in the following APIs:
+
+- In the resolver API, used by resolver plugins to return the service
+  config to the gRPC client.
+- In the gRPC client API, where users can query the channel to obtain
+  the service config associated with the channel (for debugging
+  purposes).
+- In the gRPC client API, where users can set the service config
+  explicitly.  This is intended for use in unit tests.
diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec
index bd0e0e2..d9d0f10 100644
--- a/gRPC-Core.podspec
+++ b/gRPC-Core.podspec
@@ -400,6 +400,7 @@
                       'src/core/ext/client_channel/client_channel_factory.h',
                       'src/core/ext/client_channel/connector.h',
                       'src/core/ext/client_channel/http_connect_handshaker.h',
+                      'src/core/ext/client_channel/http_proxy.h',
                       'src/core/ext/client_channel/initial_connect_string.h',
                       'src/core/ext/client_channel/lb_policy.h',
                       'src/core/ext/client_channel/lb_policy_factory.h',
@@ -608,6 +609,7 @@
                       'src/core/ext/client_channel/connector.c',
                       'src/core/ext/client_channel/default_initial_connect_string.c',
                       'src/core/ext/client_channel/http_connect_handshaker.c',
+                      'src/core/ext/client_channel/http_proxy.c',
                       'src/core/ext/client_channel/initial_connect_string.c',
                       'src/core/ext/client_channel/lb_policy.c',
                       'src/core/ext/client_channel/lb_policy_factory.c',
@@ -816,6 +818,7 @@
                               'src/core/ext/client_channel/client_channel_factory.h',
                               'src/core/ext/client_channel/connector.h',
                               'src/core/ext/client_channel/http_connect_handshaker.h',
+                              'src/core/ext/client_channel/http_proxy.h',
                               'src/core/ext/client_channel/initial_connect_string.h',
                               'src/core/ext/client_channel/lb_policy.h',
                               'src/core/ext/client_channel/lb_policy_factory.h',
diff --git a/grpc.def b/grpc.def
index 0162863..ff856e7 100644
--- a/grpc.def
+++ b/grpc.def
@@ -164,7 +164,9 @@
     grpc_slice_buffer_move_into
     grpc_slice_buffer_trim_end
     grpc_slice_buffer_move_first
+    grpc_slice_buffer_move_first_into_buffer
     grpc_slice_buffer_take_first
+    grpc_slice_buffer_undo_take_first
     gpr_malloc
     gpr_free
     gpr_realloc
diff --git a/grpc.gemspec b/grpc.gemspec
index 8131198..2d84682 100755
--- a/grpc.gemspec
+++ b/grpc.gemspec
@@ -317,6 +317,7 @@
   s.files += %w( src/core/ext/client_channel/client_channel_factory.h )
   s.files += %w( src/core/ext/client_channel/connector.h )
   s.files += %w( src/core/ext/client_channel/http_connect_handshaker.h )
+  s.files += %w( src/core/ext/client_channel/http_proxy.h )
   s.files += %w( src/core/ext/client_channel/initial_connect_string.h )
   s.files += %w( src/core/ext/client_channel/lb_policy.h )
   s.files += %w( src/core/ext/client_channel/lb_policy_factory.h )
@@ -525,6 +526,7 @@
   s.files += %w( src/core/ext/client_channel/connector.c )
   s.files += %w( src/core/ext/client_channel/default_initial_connect_string.c )
   s.files += %w( src/core/ext/client_channel/http_connect_handshaker.c )
+  s.files += %w( src/core/ext/client_channel/http_proxy.c )
   s.files += %w( src/core/ext/client_channel/initial_connect_string.c )
   s.files += %w( src/core/ext/client_channel/lb_policy.c )
   s.files += %w( src/core/ext/client_channel/lb_policy_factory.c )
@@ -581,23 +583,22 @@
   s.files += %w( third_party/boringssl/crypto/conf/internal.h )
   s.files += %w( third_party/boringssl/crypto/curve25519/internal.h )
   s.files += %w( third_party/boringssl/crypto/des/internal.h )
-  s.files += %w( third_party/boringssl/crypto/dh/internal.h )
   s.files += %w( third_party/boringssl/crypto/digest/internal.h )
   s.files += %w( third_party/boringssl/crypto/digest/md32_common.h )
-  s.files += %w( third_party/boringssl/crypto/directory.h )
   s.files += %w( third_party/boringssl/crypto/ec/internal.h )
   s.files += %w( third_party/boringssl/crypto/ec/p256-x86_64-table.h )
   s.files += %w( third_party/boringssl/crypto/evp/internal.h )
   s.files += %w( third_party/boringssl/crypto/internal.h )
   s.files += %w( third_party/boringssl/crypto/modes/internal.h )
+  s.files += %w( third_party/boringssl/crypto/newhope/internal.h )
   s.files += %w( third_party/boringssl/crypto/obj/obj_dat.h )
   s.files += %w( third_party/boringssl/crypto/obj/obj_xref.h )
   s.files += %w( third_party/boringssl/crypto/pkcs8/internal.h )
+  s.files += %w( third_party/boringssl/crypto/poly1305/internal.h )
   s.files += %w( third_party/boringssl/crypto/rand/internal.h )
   s.files += %w( third_party/boringssl/crypto/rsa/internal.h )
-  s.files += %w( third_party/boringssl/crypto/test/scoped_types.h )
-  s.files += %w( third_party/boringssl/crypto/test/test_util.h )
   s.files += %w( third_party/boringssl/crypto/x509/charmap.h )
+  s.files += %w( third_party/boringssl/crypto/x509/internal.h )
   s.files += %w( third_party/boringssl/crypto/x509/vpm_int.h )
   s.files += %w( third_party/boringssl/crypto/x509v3/ext_dat.h )
   s.files += %w( third_party/boringssl/crypto/x509v3/pcy_int.h )
@@ -643,10 +644,12 @@
   s.files += %w( third_party/boringssl/include/openssl/md4.h )
   s.files += %w( third_party/boringssl/include/openssl/md5.h )
   s.files += %w( third_party/boringssl/include/openssl/mem.h )
+  s.files += %w( third_party/boringssl/include/openssl/newhope.h )
+  s.files += %w( third_party/boringssl/include/openssl/nid.h )
   s.files += %w( third_party/boringssl/include/openssl/obj.h )
   s.files += %w( third_party/boringssl/include/openssl/obj_mac.h )
   s.files += %w( third_party/boringssl/include/openssl/objects.h )
-  s.files += %w( third_party/boringssl/include/openssl/opensslfeatures.h )
+  s.files += %w( third_party/boringssl/include/openssl/opensslconf.h )
   s.files += %w( third_party/boringssl/include/openssl/opensslv.h )
   s.files += %w( third_party/boringssl/include/openssl/ossl_typ.h )
   s.files += %w( third_party/boringssl/include/openssl/pem.h )
@@ -654,9 +657,9 @@
   s.files += %w( third_party/boringssl/include/openssl/pkcs7.h )
   s.files += %w( third_party/boringssl/include/openssl/pkcs8.h )
   s.files += %w( third_party/boringssl/include/openssl/poly1305.h )
-  s.files += %w( third_party/boringssl/include/openssl/pqueue.h )
   s.files += %w( third_party/boringssl/include/openssl/rand.h )
   s.files += %w( third_party/boringssl/include/openssl/rc4.h )
+  s.files += %w( third_party/boringssl/include/openssl/ripemd.h )
   s.files += %w( third_party/boringssl/include/openssl/rsa.h )
   s.files += %w( third_party/boringssl/include/openssl/safestack.h )
   s.files += %w( third_party/boringssl/include/openssl/sha.h )
@@ -673,16 +676,11 @@
   s.files += %w( third_party/boringssl/include/openssl/x509_vfy.h )
   s.files += %w( third_party/boringssl/include/openssl/x509v3.h )
   s.files += %w( third_party/boringssl/ssl/internal.h )
-  s.files += %w( third_party/boringssl/ssl/test/async_bio.h )
-  s.files += %w( third_party/boringssl/ssl/test/packeted_bio.h )
-  s.files += %w( third_party/boringssl/ssl/test/scoped_types.h )
-  s.files += %w( third_party/boringssl/ssl/test/test_config.h )
   s.files += %w( src/boringssl/err_data.c )
   s.files += %w( third_party/boringssl/crypto/aes/aes.c )
   s.files += %w( third_party/boringssl/crypto/aes/mode_wrappers.c )
   s.files += %w( third_party/boringssl/crypto/asn1/a_bitstr.c )
   s.files += %w( third_party/boringssl/crypto/asn1/a_bool.c )
-  s.files += %w( third_party/boringssl/crypto/asn1/a_bytes.c )
   s.files += %w( third_party/boringssl/crypto/asn1/a_d2i_fp.c )
   s.files += %w( third_party/boringssl/crypto/asn1/a_dup.c )
   s.files += %w( third_party/boringssl/crypto/asn1/a_enum.c )
@@ -701,18 +699,14 @@
   s.files += %w( third_party/boringssl/crypto/asn1/asn1_lib.c )
   s.files += %w( third_party/boringssl/crypto/asn1/asn1_par.c )
   s.files += %w( third_party/boringssl/crypto/asn1/asn_pack.c )
-  s.files += %w( third_party/boringssl/crypto/asn1/bio_asn1.c )
-  s.files += %w( third_party/boringssl/crypto/asn1/bio_ndef.c )
   s.files += %w( third_party/boringssl/crypto/asn1/f_enum.c )
   s.files += %w( third_party/boringssl/crypto/asn1/f_int.c )
   s.files += %w( third_party/boringssl/crypto/asn1/f_string.c )
   s.files += %w( third_party/boringssl/crypto/asn1/t_bitst.c )
-  s.files += %w( third_party/boringssl/crypto/asn1/t_pkey.c )
   s.files += %w( third_party/boringssl/crypto/asn1/tasn_dec.c )
   s.files += %w( third_party/boringssl/crypto/asn1/tasn_enc.c )
   s.files += %w( third_party/boringssl/crypto/asn1/tasn_fre.c )
   s.files += %w( third_party/boringssl/crypto/asn1/tasn_new.c )
-  s.files += %w( third_party/boringssl/crypto/asn1/tasn_prn.c )
   s.files += %w( third_party/boringssl/crypto/asn1/tasn_typ.c )
   s.files += %w( third_party/boringssl/crypto/asn1/tasn_utl.c )
   s.files += %w( third_party/boringssl/crypto/asn1/x_bignum.c )
@@ -742,6 +736,7 @@
   s.files += %w( third_party/boringssl/crypto/bn/generic.c )
   s.files += %w( third_party/boringssl/crypto/bn/kronecker.c )
   s.files += %w( third_party/boringssl/crypto/bn/montgomery.c )
+  s.files += %w( third_party/boringssl/crypto/bn/montgomery_inv.c )
   s.files += %w( third_party/boringssl/crypto/bn/mul.c )
   s.files += %w( third_party/boringssl/crypto/bn/prime.c )
   s.files += %w( third_party/boringssl/crypto/bn/random.c )
@@ -753,8 +748,7 @@
   s.files += %w( third_party/boringssl/crypto/bytestring/ber.c )
   s.files += %w( third_party/boringssl/crypto/bytestring/cbb.c )
   s.files += %w( third_party/boringssl/crypto/bytestring/cbs.c )
-  s.files += %w( third_party/boringssl/crypto/chacha/chacha_generic.c )
-  s.files += %w( third_party/boringssl/crypto/chacha/chacha_vec.c )
+  s.files += %w( third_party/boringssl/crypto/chacha/chacha.c )
   s.files += %w( third_party/boringssl/crypto/cipher/aead.c )
   s.files += %w( third_party/boringssl/crypto/cipher/cipher.c )
   s.files += %w( third_party/boringssl/crypto/cipher/derive_key.c )
@@ -769,10 +763,14 @@
   s.files += %w( third_party/boringssl/crypto/cipher/tls_cbc.c )
   s.files += %w( third_party/boringssl/crypto/cmac/cmac.c )
   s.files += %w( third_party/boringssl/crypto/conf/conf.c )
+  s.files += %w( third_party/boringssl/crypto/cpu-aarch64-linux.c )
+  s.files += %w( third_party/boringssl/crypto/cpu-arm-linux.c )
   s.files += %w( third_party/boringssl/crypto/cpu-arm.c )
   s.files += %w( third_party/boringssl/crypto/cpu-intel.c )
+  s.files += %w( third_party/boringssl/crypto/cpu-ppc64le.c )
   s.files += %w( third_party/boringssl/crypto/crypto.c )
   s.files += %w( third_party/boringssl/crypto/curve25519/curve25519.c )
+  s.files += %w( third_party/boringssl/crypto/curve25519/spake25519.c )
   s.files += %w( third_party/boringssl/crypto/curve25519/x25519-x86_64.c )
   s.files += %w( third_party/boringssl/crypto/des/des.c )
   s.files += %w( third_party/boringssl/crypto/dh/check.c )
@@ -781,8 +779,6 @@
   s.files += %w( third_party/boringssl/crypto/dh/params.c )
   s.files += %w( third_party/boringssl/crypto/digest/digest.c )
   s.files += %w( third_party/boringssl/crypto/digest/digests.c )
-  s.files += %w( third_party/boringssl/crypto/directory_posix.c )
-  s.files += %w( third_party/boringssl/crypto/directory_win.c )
   s.files += %w( third_party/boringssl/crypto/dsa/dsa.c )
   s.files += %w( third_party/boringssl/crypto/dsa/dsa_asn1.c )
   s.files += %w( third_party/boringssl/crypto/ec/ec.c )
@@ -801,7 +797,6 @@
   s.files += %w( third_party/boringssl/crypto/ecdsa/ecdsa_asn1.c )
   s.files += %w( third_party/boringssl/crypto/engine/engine.c )
   s.files += %w( third_party/boringssl/crypto/err/err.c )
-  s.files += %w( third_party/boringssl/crypto/evp/algorithm.c )
   s.files += %w( third_party/boringssl/crypto/evp/digestsign.c )
   s.files += %w( third_party/boringssl/crypto/evp/evp.c )
   s.files += %w( third_party/boringssl/crypto/evp/evp_asn1.c )
@@ -812,6 +807,7 @@
   s.files += %w( third_party/boringssl/crypto/evp/p_rsa.c )
   s.files += %w( third_party/boringssl/crypto/evp/p_rsa_asn1.c )
   s.files += %w( third_party/boringssl/crypto/evp/pbkdf.c )
+  s.files += %w( third_party/boringssl/crypto/evp/print.c )
   s.files += %w( third_party/boringssl/crypto/evp/sign.c )
   s.files += %w( third_party/boringssl/crypto/ex_data.c )
   s.files += %w( third_party/boringssl/crypto/hkdf/hkdf.c )
@@ -825,6 +821,12 @@
   s.files += %w( third_party/boringssl/crypto/modes/ctr.c )
   s.files += %w( third_party/boringssl/crypto/modes/gcm.c )
   s.files += %w( third_party/boringssl/crypto/modes/ofb.c )
+  s.files += %w( third_party/boringssl/crypto/newhope/error_correction.c )
+  s.files += %w( third_party/boringssl/crypto/newhope/newhope.c )
+  s.files += %w( third_party/boringssl/crypto/newhope/ntt.c )
+  s.files += %w( third_party/boringssl/crypto/newhope/poly.c )
+  s.files += %w( third_party/boringssl/crypto/newhope/precomp.c )
+  s.files += %w( third_party/boringssl/crypto/newhope/reduce.c )
   s.files += %w( third_party/boringssl/crypto/obj/obj.c )
   s.files += %w( third_party/boringssl/crypto/obj/obj_xref.c )
   s.files += %w( third_party/boringssl/crypto/pem/pem_all.c )
@@ -842,6 +844,7 @@
   s.files += %w( third_party/boringssl/crypto/poly1305/poly1305.c )
   s.files += %w( third_party/boringssl/crypto/poly1305/poly1305_arm.c )
   s.files += %w( third_party/boringssl/crypto/poly1305/poly1305_vec.c )
+  s.files += %w( third_party/boringssl/crypto/rand/deterministic.c )
   s.files += %w( third_party/boringssl/crypto/rand/rand.c )
   s.files += %w( third_party/boringssl/crypto/rand/urandom.c )
   s.files += %w( third_party/boringssl/crypto/rand/windows.c )
@@ -866,11 +869,13 @@
   s.files += %w( third_party/boringssl/crypto/x509/a_sign.c )
   s.files += %w( third_party/boringssl/crypto/x509/a_strex.c )
   s.files += %w( third_party/boringssl/crypto/x509/a_verify.c )
+  s.files += %w( third_party/boringssl/crypto/x509/algorithm.c )
   s.files += %w( third_party/boringssl/crypto/x509/asn1_gen.c )
   s.files += %w( third_party/boringssl/crypto/x509/by_dir.c )
   s.files += %w( third_party/boringssl/crypto/x509/by_file.c )
   s.files += %w( third_party/boringssl/crypto/x509/i2d_pr.c )
   s.files += %w( third_party/boringssl/crypto/x509/pkcs7.c )
+  s.files += %w( third_party/boringssl/crypto/x509/rsa_pss.c )
   s.files += %w( third_party/boringssl/crypto/x509/t_crl.c )
   s.files += %w( third_party/boringssl/crypto/x509/t_req.c )
   s.files += %w( third_party/boringssl/crypto/x509/t_x509.c )
@@ -945,21 +950,17 @@
   s.files += %w( third_party/boringssl/crypto/x509v3/v3_utl.c )
   s.files += %w( third_party/boringssl/ssl/custom_extensions.c )
   s.files += %w( third_party/boringssl/ssl/d1_both.c )
-  s.files += %w( third_party/boringssl/ssl/d1_clnt.c )
   s.files += %w( third_party/boringssl/ssl/d1_lib.c )
-  s.files += %w( third_party/boringssl/ssl/d1_meth.c )
   s.files += %w( third_party/boringssl/ssl/d1_pkt.c )
   s.files += %w( third_party/boringssl/ssl/d1_srtp.c )
-  s.files += %w( third_party/boringssl/ssl/d1_srvr.c )
+  s.files += %w( third_party/boringssl/ssl/dtls_method.c )
   s.files += %w( third_party/boringssl/ssl/dtls_record.c )
-  s.files += %w( third_party/boringssl/ssl/pqueue/pqueue.c )
+  s.files += %w( third_party/boringssl/ssl/handshake_client.c )
+  s.files += %w( third_party/boringssl/ssl/handshake_server.c )
   s.files += %w( third_party/boringssl/ssl/s3_both.c )
-  s.files += %w( third_party/boringssl/ssl/s3_clnt.c )
   s.files += %w( third_party/boringssl/ssl/s3_enc.c )
   s.files += %w( third_party/boringssl/ssl/s3_lib.c )
-  s.files += %w( third_party/boringssl/ssl/s3_meth.c )
   s.files += %w( third_party/boringssl/ssl/s3_pkt.c )
-  s.files += %w( third_party/boringssl/ssl/s3_srvr.c )
   s.files += %w( third_party/boringssl/ssl/ssl_aead_ctx.c )
   s.files += %w( third_party/boringssl/ssl/ssl_asn1.c )
   s.files += %w( third_party/boringssl/ssl/ssl_buffer.c )
@@ -973,6 +974,11 @@
   s.files += %w( third_party/boringssl/ssl/ssl_stat.c )
   s.files += %w( third_party/boringssl/ssl/t1_enc.c )
   s.files += %w( third_party/boringssl/ssl/t1_lib.c )
+  s.files += %w( third_party/boringssl/ssl/tls13_both.c )
+  s.files += %w( third_party/boringssl/ssl/tls13_client.c )
+  s.files += %w( third_party/boringssl/ssl/tls13_enc.c )
+  s.files += %w( third_party/boringssl/ssl/tls13_server.c )
+  s.files += %w( third_party/boringssl/ssl/tls_method.c )
   s.files += %w( third_party/boringssl/ssl/tls_record.c )
   s.files += %w( third_party/zlib/crc32.h )
   s.files += %w( third_party/zlib/deflate.h )
diff --git a/include/grpc++/impl/codegen/config.h b/include/grpc++/impl/codegen/config.h
index af3ee5a..a43bf65 100644
--- a/include/grpc++/impl/codegen/config.h
+++ b/include/grpc++/impl/codegen/config.h
@@ -39,6 +39,12 @@
 #define GRPC_CUSTOM_STRING std::string
 #endif
 
+// The following macros are deprecated and appear only for users
+// with PB files generated using gRPC 1.0.x plugins. They should
+// not be used in new code
+#define GRPC_OVERRIDE override  // deprecated
+#define GRPC_FINAL final        // deprecated
+
 namespace grpc {
 
 typedef GRPC_CUSTOM_STRING string;
diff --git a/include/grpc++/support/channel_arguments.h b/include/grpc++/support/channel_arguments.h
index d43f7c6..efdf777 100644
--- a/include/grpc++/support/channel_arguments.h
+++ b/include/grpc++/support/channel_arguments.h
@@ -88,6 +88,10 @@
   /// The given buffer pool will be attached to the constructed channel
   void SetResourceQuota(const ResourceQuota& resource_quota);
 
+  /// Sets the max receive and send message sizes.
+  void SetMaxReceiveMessageSize(int size);
+  void SetMaxSendMessageSize(int size);
+
   /// Set LB policy name.
   /// Note that if the name resolver returns only balancer addresses, the
   /// grpclb LB policy will be used, regardless of what is specified here.
diff --git a/include/grpc/impl/codegen/slice.h b/include/grpc/impl/codegen/slice.h
index 00781bb..0352604 100644
--- a/include/grpc/impl/codegen/slice.h
+++ b/include/grpc/impl/codegen/slice.h
@@ -93,11 +93,16 @@
 /* Represents an expandable array of slices, to be interpreted as a
    single item. */
 typedef struct {
-  /* slices in the array */
+  /* This is for internal use only. External users (i.e any code outside grpc
+   * core) MUST NOT use this field */
+  grpc_slice *base_slices;
+
+  /* slices in the array (Points to the first valid grpc_slice in the array) */
   grpc_slice *slices;
   /* the number of slices in the array */
   size_t count;
-  /* the number of slices allocated in the array */
+  /* the number of slices allocated in the array. External users (i.e any code
+   * outside grpc core) MUST NOT use this field */
   size_t capacity;
   /* the combined length of all slices in the array */
   size_t length;
diff --git a/include/grpc/slice_buffer.h b/include/grpc/slice_buffer.h
index f1de653..2ed8966 100644
--- a/include/grpc/slice_buffer.h
+++ b/include/grpc/slice_buffer.h
@@ -77,8 +77,15 @@
 /* move the first n bytes of src into dst */
 GPRAPI void grpc_slice_buffer_move_first(grpc_slice_buffer *src, size_t n,
                                          grpc_slice_buffer *dst);
+/* move the first n bytes of src into dst (copying them) */
+GPRAPI void grpc_slice_buffer_move_first_into_buffer(grpc_exec_ctx *exec_ctx,
+                                                     grpc_slice_buffer *src,
+                                                     size_t n, void *dst);
 /* take the first slice in the slice buffer */
 GPRAPI grpc_slice grpc_slice_buffer_take_first(grpc_slice_buffer *src);
+/* undo the above with (a possibly different) \a slice */
+GPRAPI void grpc_slice_buffer_undo_take_first(grpc_slice_buffer *src,
+                                              grpc_slice slice);
 
 #ifdef __cplusplus
 }
diff --git a/package.xml b/package.xml
index fce06ce..06ce67a 100644
--- a/package.xml
+++ b/package.xml
@@ -326,6 +326,7 @@
     <file baseinstalldir="/" name="src/core/ext/client_channel/client_channel_factory.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/client_channel/connector.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/client_channel/http_connect_handshaker.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/client_channel/http_proxy.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/client_channel/initial_connect_string.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/client_channel/lb_policy.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/client_channel/lb_policy_factory.h" role="src" />
@@ -534,6 +535,7 @@
     <file baseinstalldir="/" name="src/core/ext/client_channel/connector.c" role="src" />
     <file baseinstalldir="/" name="src/core/ext/client_channel/default_initial_connect_string.c" role="src" />
     <file baseinstalldir="/" name="src/core/ext/client_channel/http_connect_handshaker.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/client_channel/http_proxy.c" role="src" />
     <file baseinstalldir="/" name="src/core/ext/client_channel/initial_connect_string.c" role="src" />
     <file baseinstalldir="/" name="src/core/ext/client_channel/lb_policy.c" role="src" />
     <file baseinstalldir="/" name="src/core/ext/client_channel/lb_policy_factory.c" role="src" />
@@ -590,23 +592,22 @@
     <file baseinstalldir="/" name="third_party/boringssl/crypto/conf/internal.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/curve25519/internal.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/des/internal.h" role="src" />
-    <file baseinstalldir="/" name="third_party/boringssl/crypto/dh/internal.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/digest/internal.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/digest/md32_common.h" role="src" />
-    <file baseinstalldir="/" name="third_party/boringssl/crypto/directory.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/ec/internal.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/ec/p256-x86_64-table.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/evp/internal.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/internal.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/modes/internal.h" role="src" />
+    <file baseinstalldir="/" name="third_party/boringssl/crypto/newhope/internal.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/obj/obj_dat.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/obj/obj_xref.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/pkcs8/internal.h" role="src" />
+    <file baseinstalldir="/" name="third_party/boringssl/crypto/poly1305/internal.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/rand/internal.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/rsa/internal.h" role="src" />
-    <file baseinstalldir="/" name="third_party/boringssl/crypto/test/scoped_types.h" role="src" />
-    <file baseinstalldir="/" name="third_party/boringssl/crypto/test/test_util.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/charmap.h" role="src" />
+    <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/internal.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/vpm_int.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/ext_dat.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/pcy_int.h" role="src" />
@@ -652,10 +653,12 @@
     <file baseinstalldir="/" name="third_party/boringssl/include/openssl/md4.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/include/openssl/md5.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/include/openssl/mem.h" role="src" />
+    <file baseinstalldir="/" name="third_party/boringssl/include/openssl/newhope.h" role="src" />
+    <file baseinstalldir="/" name="third_party/boringssl/include/openssl/nid.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/include/openssl/obj.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/include/openssl/obj_mac.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/include/openssl/objects.h" role="src" />
-    <file baseinstalldir="/" name="third_party/boringssl/include/openssl/opensslfeatures.h" role="src" />
+    <file baseinstalldir="/" name="third_party/boringssl/include/openssl/opensslconf.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/include/openssl/opensslv.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/include/openssl/ossl_typ.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/include/openssl/pem.h" role="src" />
@@ -663,9 +666,9 @@
     <file baseinstalldir="/" name="third_party/boringssl/include/openssl/pkcs7.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/include/openssl/pkcs8.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/include/openssl/poly1305.h" role="src" />
-    <file baseinstalldir="/" name="third_party/boringssl/include/openssl/pqueue.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/include/openssl/rand.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/include/openssl/rc4.h" role="src" />
+    <file baseinstalldir="/" name="third_party/boringssl/include/openssl/ripemd.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/include/openssl/rsa.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/include/openssl/safestack.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/include/openssl/sha.h" role="src" />
@@ -682,16 +685,11 @@
     <file baseinstalldir="/" name="third_party/boringssl/include/openssl/x509_vfy.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/include/openssl/x509v3.h" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/ssl/internal.h" role="src" />
-    <file baseinstalldir="/" name="third_party/boringssl/ssl/test/async_bio.h" role="src" />
-    <file baseinstalldir="/" name="third_party/boringssl/ssl/test/packeted_bio.h" role="src" />
-    <file baseinstalldir="/" name="third_party/boringssl/ssl/test/scoped_types.h" role="src" />
-    <file baseinstalldir="/" name="third_party/boringssl/ssl/test/test_config.h" role="src" />
     <file baseinstalldir="/" name="src/boringssl/err_data.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/aes/aes.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/aes/mode_wrappers.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/a_bitstr.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/a_bool.c" role="src" />
-    <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/a_bytes.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/a_d2i_fp.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/a_dup.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/a_enum.c" role="src" />
@@ -710,18 +708,14 @@
     <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/asn1_lib.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/asn1_par.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/asn_pack.c" role="src" />
-    <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/bio_asn1.c" role="src" />
-    <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/bio_ndef.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/f_enum.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/f_int.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/f_string.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/t_bitst.c" role="src" />
-    <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/t_pkey.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/tasn_dec.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/tasn_enc.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/tasn_fre.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/tasn_new.c" role="src" />
-    <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/tasn_prn.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/tasn_typ.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/tasn_utl.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/x_bignum.c" role="src" />
@@ -751,6 +745,7 @@
     <file baseinstalldir="/" name="third_party/boringssl/crypto/bn/generic.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/bn/kronecker.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/bn/montgomery.c" role="src" />
+    <file baseinstalldir="/" name="third_party/boringssl/crypto/bn/montgomery_inv.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/bn/mul.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/bn/prime.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/bn/random.c" role="src" />
@@ -762,8 +757,7 @@
     <file baseinstalldir="/" name="third_party/boringssl/crypto/bytestring/ber.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/bytestring/cbb.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/bytestring/cbs.c" role="src" />
-    <file baseinstalldir="/" name="third_party/boringssl/crypto/chacha/chacha_generic.c" role="src" />
-    <file baseinstalldir="/" name="third_party/boringssl/crypto/chacha/chacha_vec.c" role="src" />
+    <file baseinstalldir="/" name="third_party/boringssl/crypto/chacha/chacha.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/cipher/aead.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/cipher/cipher.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/cipher/derive_key.c" role="src" />
@@ -778,10 +772,14 @@
     <file baseinstalldir="/" name="third_party/boringssl/crypto/cipher/tls_cbc.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/cmac/cmac.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/conf/conf.c" role="src" />
+    <file baseinstalldir="/" name="third_party/boringssl/crypto/cpu-aarch64-linux.c" role="src" />
+    <file baseinstalldir="/" name="third_party/boringssl/crypto/cpu-arm-linux.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/cpu-arm.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/cpu-intel.c" role="src" />
+    <file baseinstalldir="/" name="third_party/boringssl/crypto/cpu-ppc64le.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/crypto.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/curve25519/curve25519.c" role="src" />
+    <file baseinstalldir="/" name="third_party/boringssl/crypto/curve25519/spake25519.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/curve25519/x25519-x86_64.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/des/des.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/dh/check.c" role="src" />
@@ -790,8 +788,6 @@
     <file baseinstalldir="/" name="third_party/boringssl/crypto/dh/params.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/digest/digest.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/digest/digests.c" role="src" />
-    <file baseinstalldir="/" name="third_party/boringssl/crypto/directory_posix.c" role="src" />
-    <file baseinstalldir="/" name="third_party/boringssl/crypto/directory_win.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/dsa/dsa.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/dsa/dsa_asn1.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/ec/ec.c" role="src" />
@@ -810,7 +806,6 @@
     <file baseinstalldir="/" name="third_party/boringssl/crypto/ecdsa/ecdsa_asn1.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/engine/engine.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/err/err.c" role="src" />
-    <file baseinstalldir="/" name="third_party/boringssl/crypto/evp/algorithm.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/evp/digestsign.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/evp/evp.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/evp/evp_asn1.c" role="src" />
@@ -821,6 +816,7 @@
     <file baseinstalldir="/" name="third_party/boringssl/crypto/evp/p_rsa.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/evp/p_rsa_asn1.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/evp/pbkdf.c" role="src" />
+    <file baseinstalldir="/" name="third_party/boringssl/crypto/evp/print.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/evp/sign.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/ex_data.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/hkdf/hkdf.c" role="src" />
@@ -834,6 +830,12 @@
     <file baseinstalldir="/" name="third_party/boringssl/crypto/modes/ctr.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/modes/gcm.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/modes/ofb.c" role="src" />
+    <file baseinstalldir="/" name="third_party/boringssl/crypto/newhope/error_correction.c" role="src" />
+    <file baseinstalldir="/" name="third_party/boringssl/crypto/newhope/newhope.c" role="src" />
+    <file baseinstalldir="/" name="third_party/boringssl/crypto/newhope/ntt.c" role="src" />
+    <file baseinstalldir="/" name="third_party/boringssl/crypto/newhope/poly.c" role="src" />
+    <file baseinstalldir="/" name="third_party/boringssl/crypto/newhope/precomp.c" role="src" />
+    <file baseinstalldir="/" name="third_party/boringssl/crypto/newhope/reduce.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/obj/obj.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/obj/obj_xref.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/pem/pem_all.c" role="src" />
@@ -851,6 +853,7 @@
     <file baseinstalldir="/" name="third_party/boringssl/crypto/poly1305/poly1305.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/poly1305/poly1305_arm.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/poly1305/poly1305_vec.c" role="src" />
+    <file baseinstalldir="/" name="third_party/boringssl/crypto/rand/deterministic.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/rand/rand.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/rand/urandom.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/rand/windows.c" role="src" />
@@ -875,11 +878,13 @@
     <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/a_sign.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/a_strex.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/a_verify.c" role="src" />
+    <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/algorithm.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/asn1_gen.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/by_dir.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/by_file.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/i2d_pr.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/pkcs7.c" role="src" />
+    <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/rsa_pss.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/t_crl.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/t_req.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/t_x509.c" role="src" />
@@ -954,21 +959,17 @@
     <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/v3_utl.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/ssl/custom_extensions.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/ssl/d1_both.c" role="src" />
-    <file baseinstalldir="/" name="third_party/boringssl/ssl/d1_clnt.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/ssl/d1_lib.c" role="src" />
-    <file baseinstalldir="/" name="third_party/boringssl/ssl/d1_meth.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/ssl/d1_pkt.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/ssl/d1_srtp.c" role="src" />
-    <file baseinstalldir="/" name="third_party/boringssl/ssl/d1_srvr.c" role="src" />
+    <file baseinstalldir="/" name="third_party/boringssl/ssl/dtls_method.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/ssl/dtls_record.c" role="src" />
-    <file baseinstalldir="/" name="third_party/boringssl/ssl/pqueue/pqueue.c" role="src" />
+    <file baseinstalldir="/" name="third_party/boringssl/ssl/handshake_client.c" role="src" />
+    <file baseinstalldir="/" name="third_party/boringssl/ssl/handshake_server.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/ssl/s3_both.c" role="src" />
-    <file baseinstalldir="/" name="third_party/boringssl/ssl/s3_clnt.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/ssl/s3_enc.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/ssl/s3_lib.c" role="src" />
-    <file baseinstalldir="/" name="third_party/boringssl/ssl/s3_meth.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/ssl/s3_pkt.c" role="src" />
-    <file baseinstalldir="/" name="third_party/boringssl/ssl/s3_srvr.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/ssl/ssl_aead_ctx.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/ssl/ssl_asn1.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/ssl/ssl_buffer.c" role="src" />
@@ -982,6 +983,11 @@
     <file baseinstalldir="/" name="third_party/boringssl/ssl/ssl_stat.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/ssl/t1_enc.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/ssl/t1_lib.c" role="src" />
+    <file baseinstalldir="/" name="third_party/boringssl/ssl/tls13_both.c" role="src" />
+    <file baseinstalldir="/" name="third_party/boringssl/ssl/tls13_client.c" role="src" />
+    <file baseinstalldir="/" name="third_party/boringssl/ssl/tls13_enc.c" role="src" />
+    <file baseinstalldir="/" name="third_party/boringssl/ssl/tls13_server.c" role="src" />
+    <file baseinstalldir="/" name="third_party/boringssl/ssl/tls_method.c" role="src" />
     <file baseinstalldir="/" name="third_party/boringssl/ssl/tls_record.c" role="src" />
   </dir>
  </contents>
diff --git a/setup.cfg b/setup.cfg
index dd9161c..218792e 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -11,3 +11,7 @@
 
 [build_package_protos]
 exclude=.*protoc_plugin/protoc_plugin_test\.proto$
+
+# Style settings
+[yapf]
+based_on_style = google
diff --git a/src/boringssl/err_data.c b/src/boringssl/err_data.c
index d4cc08b..c1257cd 100644
--- a/src/boringssl/err_data.c
+++ b/src/boringssl/err_data.c
@@ -54,182 +54,166 @@
 OPENSSL_COMPILE_ASSERT(ERR_NUM_LIBS == 33, library_values_changed_num);
 
 const uint32_t kOpenSSLReasonValues[] = {
-    0xc3207ab,
-    0xc3287c5,
-    0xc3307d4,
-    0xc3387e4,
-    0xc3407f3,
-    0xc34880c,
-    0xc350818,
-    0xc358835,
-    0xc360847,
-    0xc368855,
-    0xc370865,
-    0xc378872,
-    0xc380882,
-    0xc38888d,
-    0xc3908a3,
-    0xc3988b2,
-    0xc3a08c6,
-    0xc3a87b8,
-    0xc3b00b0,
-    0x10321484,
-    0x10329490,
-    0x103314a9,
-    0x103394bc,
-    0x10340ded,
-    0x103494cf,
-    0x103514e4,
-    0x10359516,
-    0x1036152f,
-    0x10369544,
-    0x10371562,
-    0x10379571,
-    0x1038158d,
-    0x103895a8,
-    0x103915b7,
-    0x103995d3,
-    0x103a15ee,
-    0x103a9605,
-    0x103b1616,
-    0x103b962a,
-    0x103c1649,
-    0x103c9658,
-    0x103d166f,
-    0x103d9682,
-    0x103e0b5d,
-    0x103e96b3,
-    0x103f16c6,
-    0x103f96e0,
-    0x104016f0,
-    0x10409704,
-    0x1041171a,
-    0x10419732,
-    0x10421747,
-    0x1042975b,
-    0x1043176d,
-    0x104385c1,
-    0x104408b2,
-    0x10449782,
-    0x10451799,
-    0x104597ae,
-    0x104617bc,
-    0x10469695,
-    0x104714f7,
-    0x104787b8,
-    0x104800b0,
-    0x10488b8c,
-    0x14320b40,
-    0x14328b4e,
-    0x14330b5d,
-    0x14338b6f,
+    0xc320838,
+    0xc328852,
+    0xc330861,
+    0xc338871,
+    0xc340880,
+    0xc348899,
+    0xc3508a5,
+    0xc3588c2,
+    0xc3608d4,
+    0xc3688e2,
+    0xc3708f2,
+    0xc3788ff,
+    0xc38090f,
+    0xc38891a,
+    0xc390930,
+    0xc39893f,
+    0xc3a0953,
+    0xc3a8845,
+    0xc3b00ea,
+    0x10320845,
+    0x103293ab,
+    0x103313b7,
+    0x103393d0,
+    0x103413e3,
+    0x10348e8b,
+    0x10350c19,
+    0x103593f6,
+    0x1036140b,
+    0x1036941e,
+    0x1037143d,
+    0x10379456,
+    0x1038146b,
+    0x10389489,
+    0x10391498,
+    0x103994b4,
+    0x103a14cf,
+    0x103a94de,
+    0x103b14fa,
+    0x103b9515,
+    0x103c152c,
+    0x103c80ea,
+    0x103d153d,
+    0x103d9551,
+    0x103e1570,
+    0x103e957f,
+    0x103f1596,
+    0x103f95a9,
+    0x10400bea,
+    0x104095bc,
+    0x104115da,
+    0x104195ed,
+    0x10421607,
+    0x10429617,
+    0x1043162b,
+    0x10439641,
+    0x10441659,
+    0x1044966e,
+    0x10451682,
+    0x10459694,
+    0x104605fb,
+    0x1046893f,
+    0x104716a9,
+    0x104796c0,
+    0x104816d5,
+    0x104896e3,
+    0x14320bcd,
+    0x14328bdb,
+    0x14330bea,
+    0x14338bfc,
+    0x143400ac,
+    0x143480ea,
     0x18320083,
-    0x18328e53,
-    0x18340e81,
-    0x18348e95,
-    0x18358ecc,
-    0x18368ef9,
-    0x18370f0c,
-    0x18378f20,
-    0x18380f44,
-    0x18388f52,
-    0x18390f68,
-    0x18398f7c,
-    0x183a0f8c,
-    0x183b0f9c,
-    0x183b8fb1,
-    0x183c8fdc,
-    0x183d0ff0,
-    0x183d9000,
-    0x183e0b98,
-    0x183e900d,
-    0x183f101f,
-    0x183f902a,
-    0x1840103a,
-    0x1840904b,
-    0x1841105c,
-    0x1841906e,
-    0x18421097,
-    0x184290c9,
-    0x184310d8,
-    0x18451141,
-    0x18459157,
-    0x18461172,
-    0x18468ee4,
-    0x184709ca,
-    0x18478094,
-    0x18480fc8,
-    0x1848910d,
-    0x18490e69,
-    0x18498eaa,
-    0x184a11a8,
-    0x184a9125,
-    0x184b10ec,
-    0x184b8e43,
-    0x184c10b0,
-    0x184c865c,
-    0x184d118d,
-    0x184d80b0,
-    0x203211cf,
-    0x243211db,
-    0x243288f8,
-    0x243311ed,
-    0x243391fa,
-    0x24341207,
-    0x24349219,
-    0x24351228,
-    0x24359245,
-    0x24361252,
-    0x24369260,
-    0x2437126e,
-    0x2437927c,
-    0x24381285,
-    0x24389292,
-    0x243912a5,
-    0x28320b80,
-    0x28328b98,
-    0x28330b5d,
-    0x28338bab,
-    0x28340b8c,
-    0x28348094,
-    0x283500b0,
-    0x2c32281d,
-    0x2c32a82b,
-    0x2c33283d,
-    0x2c33a84f,
-    0x2c342863,
-    0x2c34a875,
-    0x2c352890,
-    0x2c35a8a2,
-    0x2c3628b5,
-    0x2c3682f3,
-    0x2c3728c2,
-    0x2c37a8d4,
-    0x2c3828e7,
-    0x2c38a8f5,
-    0x2c392905,
-    0x2c39a917,
-    0x2c3a292b,
-    0x2c3aa93c,
-    0x2c3b1365,
-    0x2c3ba94d,
-    0x2c3c2961,
-    0x2c3ca977,
-    0x2c3d2990,
-    0x2c3da9be,
-    0x2c3e29cc,
-    0x2c3ea9e4,
-    0x2c3f29fc,
-    0x2c3faa09,
-    0x2c402a2c,
-    0x2c40aa4b,
-    0x2c4111cf,
-    0x2c41aa5c,
-    0x2c422a6f,
-    0x2c429141,
-    0x2c432a80,
-    0x2c438693,
-    0x2c4429ad,
+    0x18328ee1,
+    0x183300ac,
+    0x18338ef7,
+    0x18340f0b,
+    0x183480ea,
+    0x18350f20,
+    0x18358f38,
+    0x18360f4d,
+    0x18368f61,
+    0x18370f85,
+    0x18378f9b,
+    0x18380faf,
+    0x18388fbf,
+    0x18390a57,
+    0x18398fcf,
+    0x183a0fe4,
+    0x183a8ff8,
+    0x183b0c25,
+    0x183b9005,
+    0x183c1017,
+    0x183c9022,
+    0x183d1032,
+    0x183d9043,
+    0x183e1054,
+    0x183e9066,
+    0x183f108f,
+    0x183f90a8,
+    0x184010c0,
+    0x184086d3,
+    0x203210e7,
+    0x243210f3,
+    0x24328985,
+    0x24331105,
+    0x24339112,
+    0x2434111f,
+    0x24349131,
+    0x24351140,
+    0x2435915d,
+    0x2436116a,
+    0x24369178,
+    0x24371186,
+    0x24379194,
+    0x2438119d,
+    0x243891aa,
+    0x243911bd,
+    0x28320c0d,
+    0x28328c25,
+    0x28330bea,
+    0x28338c38,
+    0x28340c19,
+    0x283480ac,
+    0x283500ea,
+    0x2c3228ca,
+    0x2c32a8d8,
+    0x2c3328ea,
+    0x2c33a8fc,
+    0x2c342910,
+    0x2c34a922,
+    0x2c35293d,
+    0x2c35a94f,
+    0x2c362962,
+    0x2c36832d,
+    0x2c37296f,
+    0x2c37a981,
+    0x2c382994,
+    0x2c38a9ab,
+    0x2c3929b9,
+    0x2c39a9c9,
+    0x2c3a29db,
+    0x2c3aa9ef,
+    0x2c3b2a00,
+    0x2c3baa1f,
+    0x2c3c2a33,
+    0x2c3caa49,
+    0x2c3d2a62,
+    0x2c3daa7f,
+    0x2c3e2a90,
+    0x2c3eaa9e,
+    0x2c3f2ab6,
+    0x2c3faace,
+    0x2c402adb,
+    0x2c4090e7,
+    0x2c412aec,
+    0x2c41aaff,
+    0x2c4210c0,
+    0x2c42ab10,
+    0x2c430720,
+    0x2c43aa11,
     0x30320000,
     0x30328015,
     0x3033001f,
@@ -239,443 +223,465 @@
     0x3035006b,
     0x30358083,
     0x30360094,
-    0x303680a1,
-    0x303700b0,
-    0x303780bd,
-    0x303800d0,
-    0x303880eb,
-    0x30390100,
-    0x30398114,
-    0x303a0128,
-    0x303a8139,
-    0x303b0152,
-    0x303b816f,
-    0x303c017d,
-    0x303c8191,
-    0x303d01a1,
-    0x303d81ba,
-    0x303e01ca,
-    0x303e81dd,
-    0x303f01ec,
-    0x303f81f8,
-    0x3040020d,
-    0x3040821d,
-    0x30410234,
-    0x30418241,
-    0x30420254,
-    0x30428263,
-    0x30430278,
-    0x30438299,
-    0x304402ac,
-    0x304482bf,
-    0x304502d8,
-    0x304582f3,
-    0x30460310,
-    0x30468329,
-    0x30470337,
-    0x30478348,
-    0x30480357,
-    0x3048836f,
-    0x30490381,
-    0x30498395,
-    0x304a03b4,
-    0x304a83c7,
-    0x304b03d2,
-    0x304b83e3,
-    0x304c03ef,
-    0x304c8405,
-    0x304d0413,
-    0x304d8429,
-    0x304e043b,
-    0x304e844d,
-    0x304f0460,
-    0x304f8473,
-    0x30500484,
-    0x30508494,
-    0x305104ac,
-    0x305184c1,
-    0x305204d9,
-    0x305284ed,
-    0x30530505,
-    0x3053851e,
-    0x30540537,
-    0x30548554,
-    0x3055055f,
-    0x30558577,
-    0x30560587,
-    0x30568598,
-    0x305705ab,
-    0x305785c1,
-    0x305805ca,
-    0x305885df,
-    0x305905f2,
-    0x30598601,
-    0x305a0621,
-    0x305a8630,
-    0x305b063c,
-    0x305b865c,
-    0x305c0678,
-    0x305c8689,
-    0x305d0693,
-    0x34320aba,
-    0x34328ace,
-    0x34330aeb,
-    0x34338afe,
-    0x34340b0d,
-    0x34348b2a,
+    0x303680ac,
+    0x303700b9,
+    0x303780c8,
+    0x303800ea,
+    0x303880f7,
+    0x3039010a,
+    0x30398125,
+    0x303a013a,
+    0x303a814e,
+    0x303b0162,
+    0x303b8173,
+    0x303c018c,
+    0x303c81a9,
+    0x303d01b7,
+    0x303d81cb,
+    0x303e01db,
+    0x303e81f4,
+    0x303f0204,
+    0x303f8217,
+    0x30400226,
+    0x30408232,
+    0x30410247,
+    0x30418257,
+    0x3042026e,
+    0x3042827b,
+    0x3043028e,
+    0x3043829d,
+    0x304402b2,
+    0x304482d3,
+    0x304502e6,
+    0x304582f9,
+    0x30460312,
+    0x3046832d,
+    0x3047034a,
+    0x30478363,
+    0x30480371,
+    0x30488382,
+    0x30490391,
+    0x304983a9,
+    0x304a03bb,
+    0x304a83cf,
+    0x304b03ee,
+    0x304b8401,
+    0x304c040c,
+    0x304c841d,
+    0x304d0429,
+    0x304d843f,
+    0x304e044d,
+    0x304e8463,
+    0x304f0475,
+    0x304f8487,
+    0x3050049a,
+    0x305084ad,
+    0x305104be,
+    0x305184ce,
+    0x305204e6,
+    0x305284fb,
+    0x30530513,
+    0x30538527,
+    0x3054053f,
+    0x30548558,
+    0x30550571,
+    0x3055858e,
+    0x30560599,
+    0x305685b1,
+    0x305705c1,
+    0x305785d2,
+    0x305805e5,
+    0x305885fb,
+    0x30590604,
+    0x30598619,
+    0x305a062c,
+    0x305a863b,
+    0x305b065b,
+    0x305b866a,
+    0x305c068b,
+    0x305c86a7,
+    0x305d06b3,
+    0x305d86d3,
+    0x305e06ef,
+    0x305e8700,
+    0x305f0716,
+    0x305f8720,
+    0x34320b47,
+    0x34328b5b,
+    0x34330b78,
+    0x34338b8b,
+    0x34340b9a,
+    0x34348bb7,
     0x3c320083,
-    0x3c328bd5,
-    0x3c330bee,
-    0x3c338c09,
-    0x3c340c26,
-    0x3c348c50,
-    0x3c350c6b,
-    0x3c358c80,
-    0x3c360c99,
-    0x3c368cb1,
-    0x3c370cc2,
-    0x3c378cd0,
-    0x3c380cdd,
-    0x3c388cf1,
-    0x3c390b98,
-    0x3c398d05,
-    0x3c3a0d19,
-    0x3c3a8872,
-    0x3c3b0d29,
-    0x3c3b8d44,
-    0x3c3c0d56,
-    0x3c3c8d6c,
-    0x3c3d0d76,
-    0x3c3d8d8a,
-    0x3c3e0d98,
-    0x3c3e8dbd,
-    0x3c3f0bc1,
-    0x3c3f8da6,
-    0x3c400094,
-    0x3c4080b0,
-    0x3c410c41,
-    0x403217d3,
-    0x403297e9,
-    0x40331817,
-    0x40339821,
-    0x40341838,
-    0x40349856,
-    0x40351866,
-    0x40359878,
-    0x40361885,
-    0x40369891,
-    0x403718a6,
-    0x403798b8,
-    0x403818c3,
-    0x403898d5,
-    0x40390ded,
-    0x403998e5,
-    0x403a18f8,
-    0x403a9919,
-    0x403b192a,
-    0x403b993a,
+    0x3c328c62,
+    0x3c330c7b,
+    0x3c338c96,
+    0x3c340cb3,
+    0x3c348cdd,
+    0x3c350cf8,
+    0x3c358d1e,
+    0x3c360d37,
+    0x3c368d4f,
+    0x3c370d60,
+    0x3c378d6e,
+    0x3c380d7b,
+    0x3c388d8f,
+    0x3c390c25,
+    0x3c398da3,
+    0x3c3a0db7,
+    0x3c3a88ff,
+    0x3c3b0dc7,
+    0x3c3b8de2,
+    0x3c3c0df4,
+    0x3c3c8e0a,
+    0x3c3d0e14,
+    0x3c3d8e28,
+    0x3c3e0e36,
+    0x3c3e8e5b,
+    0x3c3f0c4e,
+    0x3c3f8e44,
+    0x3c4000ac,
+    0x3c4080ea,
+    0x3c410cce,
+    0x3c418d0d,
+    0x403216fa,
+    0x40329710,
+    0x4033173e,
+    0x40339748,
+    0x4034175f,
+    0x4034977d,
+    0x4035178d,
+    0x4035979f,
+    0x403617ac,
+    0x403697b8,
+    0x403717cd,
+    0x403797df,
+    0x403817ea,
+    0x403897fc,
+    0x40390e8b,
+    0x4039980c,
+    0x403a181f,
+    0x403a9840,
+    0x403b1851,
+    0x403b9861,
     0x403c0064,
     0x403c8083,
-    0x403d1946,
-    0x403d995c,
-    0x403e196b,
-    0x403e997e,
-    0x403f1998,
-    0x403f99a6,
-    0x404019bb,
-    0x404099cf,
-    0x404119ec,
-    0x40419a07,
-    0x40421a20,
-    0x40429a33,
-    0x40431a47,
-    0x40439a5f,
-    0x40441a76,
-    0x40448094,
-    0x40451a8b,
-    0x40459a9d,
-    0x40461ac1,
-    0x40469ae1,
-    0x40471aef,
-    0x40479b03,
-    0x40481b18,
-    0x40489b31,
-    0x40491b48,
-    0x40499b62,
-    0x404a1b79,
-    0x404a9b97,
-    0x404b1baf,
-    0x404b9bc6,
-    0x404c1bdc,
-    0x404c9bee,
-    0x404d1c0f,
-    0x404d9c31,
-    0x404e1c45,
-    0x404e9c52,
-    0x404f1c69,
-    0x404f9c79,
-    0x40501c89,
-    0x40509c9d,
-    0x40511cb8,
-    0x40519cc8,
-    0x40521cdf,
-    0x40529cf1,
-    0x40531d09,
-    0x40539d1c,
-    0x40541d31,
-    0x40549d54,
-    0x40551d62,
-    0x40559d7f,
-    0x40561d8c,
-    0x40569da5,
-    0x40571dbd,
-    0x40579dd0,
-    0x40581de5,
-    0x40589df7,
-    0x40591e07,
-    0x40599e20,
-    0x405a1e34,
-    0x405a9e44,
-    0x405b1e5c,
-    0x405b9e6d,
-    0x405c1e80,
-    0x405c9e91,
-    0x405d1e9e,
-    0x405d9eb5,
-    0x405e1ed5,
-    0x405e8a08,
-    0x405f1ef6,
-    0x405f9f03,
-    0x40601f11,
-    0x40609f33,
-    0x40611f5b,
-    0x40619f70,
-    0x40621f87,
-    0x40629f98,
-    0x40631fa9,
-    0x40639fbe,
-    0x40641fd5,
-    0x40649fe6,
-    0x40652001,
-    0x4065a018,
-    0x40662030,
-    0x4066a05a,
-    0x40672085,
-    0x4067a0a6,
-    0x406820b9,
-    0x4068a0da,
-    0x406920f5,
-    0x4069a123,
-    0x406a2144,
-    0x406aa164,
-    0x406b22ec,
-    0x406ba30f,
-    0x406c2325,
-    0x406ca551,
-    0x406d2580,
-    0x406da5a8,
-    0x406e25c1,
-    0x406ea5d9,
-    0x406f25f8,
-    0x406fa60d,
-    0x40702620,
-    0x4070a63d,
-    0x40710773,
-    0x4071a64f,
-    0x40722662,
-    0x4072a67b,
-    0x40732693,
-    0x407390c9,
-    0x407426a7,
-    0x4074a6c1,
-    0x407526d2,
-    0x4075a6e6,
-    0x407626f4,
-    0x40769292,
-    0x40772719,
-    0x4077a73b,
-    0x40782756,
-    0x4078a76b,
-    0x40792782,
-    0x4079a798,
-    0x407a27a4,
-    0x407aa7b7,
-    0x407b27cc,
-    0x407ba7de,
-    0x407c27f3,
-    0x407ca7fc,
-    0x41f42217,
-    0x41f922a9,
-    0x41fe219c,
-    0x41fea378,
-    0x41ff2469,
-    0x42032230,
-    0x42082252,
-    0x4208a28e,
-    0x42092180,
-    0x4209a2c8,
-    0x420a21d7,
-    0x420aa1b7,
-    0x420b21f7,
-    0x420ba270,
-    0x420c2485,
-    0x420ca345,
-    0x420d235f,
-    0x420da396,
-    0x421223b0,
-    0x4217244c,
-    0x4217a3f2,
-    0x421c2414,
-    0x421f23cf,
-    0x4221249c,
-    0x4226242f,
-    0x422b2535,
-    0x422ba4fe,
-    0x422c251d,
-    0x422ca4d8,
-    0x422d24b7,
-    0x4432069e,
-    0x443286ad,
-    0x443306b9,
-    0x443386c7,
-    0x443406da,
-    0x443486eb,
-    0x443506f2,
-    0x443586fc,
-    0x4436070f,
-    0x44368725,
-    0x44370737,
-    0x44378744,
-    0x44380753,
-    0x4438875b,
-    0x44390773,
-    0x44398781,
-    0x443a0794,
-    0x4c3212bc,
-    0x4c3292cc,
-    0x4c3312df,
-    0x4c3392ff,
-    0x4c340094,
-    0x4c3480b0,
-    0x4c35130b,
-    0x4c359319,
-    0x4c361335,
-    0x4c369348,
-    0x4c371357,
-    0x4c379365,
-    0x4c38137a,
-    0x4c389386,
-    0x4c3913a6,
-    0x4c3993d0,
-    0x4c3a13e9,
-    0x4c3a9402,
-    0x4c3b05c1,
-    0x4c3b941b,
-    0x4c3c142d,
-    0x4c3c943c,
-    0x4c3d10c9,
-    0x4c3d9455,
-    0x4c3e1462,
-    0x50322a92,
-    0x5032aaa1,
-    0x50332aac,
-    0x5033aabc,
-    0x50342ad5,
-    0x5034aaef,
-    0x50352afd,
-    0x5035ab13,
-    0x50362b25,
-    0x5036ab3b,
-    0x50372b54,
-    0x5037ab67,
-    0x50382b7f,
-    0x5038ab90,
-    0x50392ba5,
-    0x5039abb9,
-    0x503a2bd9,
-    0x503aabef,
-    0x503b2c07,
-    0x503bac19,
-    0x503c2c35,
-    0x503cac4c,
-    0x503d2c65,
-    0x503dac7b,
-    0x503e2c88,
-    0x503eac9e,
-    0x503f2cb0,
-    0x503f8348,
-    0x50402cc3,
-    0x5040acd3,
-    0x50412ced,
-    0x5041acfc,
-    0x50422d16,
-    0x5042ad33,
-    0x50432d43,
-    0x5043ad53,
-    0x50442d62,
-    0x50448405,
-    0x50452d76,
-    0x5045ad94,
-    0x50462da7,
-    0x5046adbd,
-    0x50472dcf,
-    0x5047ade4,
-    0x50482e0a,
-    0x5048ae18,
-    0x50492e2b,
-    0x5049ae40,
-    0x504a2e56,
-    0x504aae66,
-    0x504b2e86,
-    0x504bae99,
-    0x504c2ebc,
-    0x504caeea,
-    0x504d2efc,
-    0x504daf19,
-    0x504e2f34,
-    0x504eaf50,
-    0x504f2f62,
-    0x504faf79,
-    0x50502f88,
-    0x50508678,
-    0x50512f9b,
-    0x58320e2b,
-    0x68320ded,
-    0x68328b98,
-    0x68330bab,
-    0x68338dfb,
-    0x68340e0b,
-    0x683480b0,
-    0x6c320dc9,
-    0x6c328b6f,
-    0x6c330dd4,
-    0x7432097e,
-    0x783208e3,
-    0x783288f8,
-    0x78330904,
+    0x403d18aa,
+    0x403d98c0,
+    0x403e18cf,
+    0x403e98e2,
+    0x403f18fc,
+    0x403f990a,
+    0x4040191f,
+    0x40409933,
+    0x40411950,
+    0x4041996b,
+    0x40421984,
+    0x40429997,
+    0x404319ab,
+    0x404399c3,
+    0x404419da,
+    0x404480ac,
+    0x404519ef,
+    0x40459a01,
+    0x40461a25,
+    0x40469a45,
+    0x40471a53,
+    0x40479a7a,
+    0x40481ab7,
+    0x40489ad0,
+    0x40491ae7,
+    0x40499b01,
+    0x404a1b18,
+    0x404a9b36,
+    0x404b1b4e,
+    0x404b9b65,
+    0x404c1b7b,
+    0x404c9b8d,
+    0x404d1bae,
+    0x404d9bd0,
+    0x404e1be4,
+    0x404e9bf1,
+    0x404f1c1e,
+    0x404f9c47,
+    0x40501c71,
+    0x40509c85,
+    0x40511ca0,
+    0x40519cb0,
+    0x40521cc7,
+    0x40529ceb,
+    0x40531d03,
+    0x40539d16,
+    0x40541d2b,
+    0x40549d4e,
+    0x40551d5c,
+    0x40559d79,
+    0x40561d86,
+    0x40569d9f,
+    0x40571db7,
+    0x40579dca,
+    0x40581ddf,
+    0x40589e06,
+    0x40591e35,
+    0x40599e62,
+    0x405a1e76,
+    0x405a9e86,
+    0x405b1e9e,
+    0x405b9eaf,
+    0x405c1ec2,
+    0x405c9ed3,
+    0x405d1ee0,
+    0x405d9ef7,
+    0x405e1f17,
+    0x405e8a95,
+    0x405f1f38,
+    0x405f9f45,
+    0x40601f53,
+    0x40609f75,
+    0x40611f9d,
+    0x40619fb2,
+    0x40621fc9,
+    0x40629fda,
+    0x40631feb,
+    0x4063a000,
+    0x40642017,
+    0x4064a043,
+    0x4065205e,
+    0x4065a075,
+    0x4066208d,
+    0x4066a0b7,
+    0x406720e2,
+    0x4067a103,
+    0x40682116,
+    0x4068a137,
+    0x40692169,
+    0x4069a197,
+    0x406a21b8,
+    0x406aa1d8,
+    0x406b2360,
+    0x406ba383,
+    0x406c2399,
+    0x406ca5c5,
+    0x406d25f4,
+    0x406da61c,
+    0x406e264a,
+    0x406ea662,
+    0x406f2681,
+    0x406fa696,
+    0x407026a9,
+    0x4070a6c6,
+    0x40710800,
+    0x4071a6d8,
+    0x407226eb,
+    0x4072a704,
+    0x4073271c,
+    0x4073936d,
+    0x40742730,
+    0x4074a74a,
+    0x4075275b,
+    0x4075a76f,
+    0x4076277d,
+    0x407691aa,
+    0x407727a2,
+    0x4077a7c4,
+    0x407827df,
+    0x4078a818,
+    0x4079282f,
+    0x4079a845,
+    0x407a2851,
+    0x407aa864,
+    0x407b2879,
+    0x407ba88b,
+    0x407c28a0,
+    0x407ca8a9,
+    0x407d2152,
+    0x407d9c57,
+    0x407e27f4,
+    0x407e9e16,
+    0x407f1a67,
+    0x407f9887,
+    0x40801c2e,
+    0x40809a8f,
+    0x40811cd9,
+    0x40819c08,
+    0x40822635,
+    0x4082986d,
+    0x40831df1,
+    0x4083a028,
+    0x40841aa3,
+    0x40849e4e,
+    0x41f4228b,
+    0x41f9231d,
+    0x41fe2210,
+    0x41fea3ec,
+    0x41ff24dd,
+    0x420322a4,
+    0x420822c6,
+    0x4208a302,
+    0x420921f4,
+    0x4209a33c,
+    0x420a224b,
+    0x420aa22b,
+    0x420b226b,
+    0x420ba2e4,
+    0x420c24f9,
+    0x420ca3b9,
+    0x420d23d3,
+    0x420da40a,
+    0x42122424,
+    0x421724c0,
+    0x4217a466,
+    0x421c2488,
+    0x421f2443,
+    0x42212510,
+    0x422624a3,
+    0x422b25a9,
+    0x422ba572,
+    0x422c2591,
+    0x422ca54c,
+    0x422d252b,
+    0x4432072b,
+    0x4432873a,
+    0x44330746,
+    0x44338754,
+    0x44340767,
+    0x44348778,
+    0x4435077f,
+    0x44358789,
+    0x4436079c,
+    0x443687b2,
+    0x443707c4,
+    0x443787d1,
+    0x443807e0,
+    0x443887e8,
+    0x44390800,
+    0x4439880e,
+    0x443a0821,
+    0x4c3211d4,
+    0x4c3291e4,
+    0x4c3311f7,
+    0x4c339217,
+    0x4c3400ac,
+    0x4c3480ea,
+    0x4c351223,
+    0x4c359231,
+    0x4c36124d,
+    0x4c369260,
+    0x4c37126f,
+    0x4c37927d,
+    0x4c381292,
+    0x4c38929e,
+    0x4c3912be,
+    0x4c3992e8,
+    0x4c3a1301,
+    0x4c3a931a,
+    0x4c3b05fb,
+    0x4c3b9333,
+    0x4c3c1345,
+    0x4c3c9354,
+    0x4c3d136d,
+    0x4c3d937c,
+    0x4c3e1389,
+    0x50322b22,
+    0x5032ab31,
+    0x50332b3c,
+    0x5033ab4c,
+    0x50342b65,
+    0x5034ab7f,
+    0x50352b8d,
+    0x5035aba3,
+    0x50362bb5,
+    0x5036abcb,
+    0x50372be4,
+    0x5037abf7,
+    0x50382c0f,
+    0x5038ac20,
+    0x50392c35,
+    0x5039ac49,
+    0x503a2c69,
+    0x503aac7f,
+    0x503b2c97,
+    0x503baca9,
+    0x503c2cc5,
+    0x503cacdc,
+    0x503d2cf5,
+    0x503dad0b,
+    0x503e2d18,
+    0x503ead2e,
+    0x503f2d40,
+    0x503f8382,
+    0x50402d53,
+    0x5040ad63,
+    0x50412d7d,
+    0x5041ad8c,
+    0x50422da6,
+    0x5042adc3,
+    0x50432dd3,
+    0x5043ade3,
+    0x50442df2,
+    0x5044843f,
+    0x50452e06,
+    0x5045ae24,
+    0x50462e37,
+    0x5046ae4d,
+    0x50472e5f,
+    0x5047ae74,
+    0x50482e9a,
+    0x5048aea8,
+    0x50492ebb,
+    0x5049aed0,
+    0x504a2ee6,
+    0x504aaef6,
+    0x504b2f16,
+    0x504baf29,
+    0x504c2f4c,
+    0x504caf7a,
+    0x504d2f8c,
+    0x504dafa9,
+    0x504e2fc4,
+    0x504eafe0,
+    0x504f2ff2,
+    0x504fb009,
+    0x50503018,
+    0x505086ef,
+    0x5051302b,
+    0x58320ec9,
+    0x68320e8b,
+    0x68328c25,
+    0x68330c38,
+    0x68338e99,
+    0x68340ea9,
+    0x683480ea,
+    0x6c320e67,
+    0x6c328bfc,
+    0x6c330e72,
+    0x74320a0b,
+    0x78320970,
+    0x78328985,
+    0x78330991,
     0x78338083,
-    0x78340913,
-    0x78348928,
-    0x78350947,
-    0x78358969,
-    0x7836097e,
-    0x78368994,
-    0x783709a4,
-    0x783789b7,
-    0x783809ca,
-    0x783889dc,
-    0x783909e9,
-    0x78398a08,
-    0x783a0a1d,
-    0x783a8a2b,
-    0x783b0a35,
-    0x783b8a49,
-    0x783c0a60,
-    0x783c8a75,
-    0x783d0a8c,
-    0x783d8aa1,
-    0x783e09f7,
-    0x7c3211be,
+    0x783409a0,
+    0x783489b5,
+    0x783509d4,
+    0x783589f6,
+    0x78360a0b,
+    0x78368a21,
+    0x78370a31,
+    0x78378a44,
+    0x78380a57,
+    0x78388a69,
+    0x78390a76,
+    0x78398a95,
+    0x783a0aaa,
+    0x783a8ab8,
+    0x783b0ac2,
+    0x783b8ad6,
+    0x783c0aed,
+    0x783c8b02,
+    0x783d0b19,
+    0x783d8b2e,
+    0x783e0a84,
+    0x7c3210d6,
 };
 
 const size_t kOpenSSLReasonValuesLen = sizeof(kOpenSSLReasonValues) / sizeof(kOpenSSLReasonValues[0]);
@@ -689,8 +695,10 @@
     "BN_LIB\0"
     "BOOLEAN_IS_WRONG_LENGTH\0"
     "BUFFER_TOO_SMALL\0"
+    "CONTEXT_NOT_INITIALISED\0"
     "DECODE_ERROR\0"
     "DEPTH_EXCEEDED\0"
+    "DIGEST_AND_KEY_TYPE_NOT_SUPPORTED\0"
     "ENCODE_ERROR\0"
     "ERROR_GETTING_TIME\0"
     "EXPECTING_AN_ASN1_SEQUENCE\0"
@@ -762,10 +770,13 @@
     "UNEXPECTED_EOC\0"
     "UNIVERSALSTRING_IS_WRONG_LENGTH\0"
     "UNKNOWN_FORMAT\0"
+    "UNKNOWN_MESSAGE_DIGEST_ALGORITHM\0"
+    "UNKNOWN_SIGNATURE_ALGORITHM\0"
     "UNKNOWN_TAG\0"
     "UNSUPPORTED_ANY_DEFINED_BY_TYPE\0"
     "UNSUPPORTED_PUBLIC_KEY_TYPE\0"
     "UNSUPPORTED_TYPE\0"
+    "WRONG_PUBLIC_KEY_TYPE\0"
     "WRONG_TAG\0"
     "WRONG_TYPE\0"
     "BAD_FOPEN_MODE\0"
@@ -849,6 +860,7 @@
     "GROUP_MISMATCH\0"
     "I2D_ECPKPARAMETERS_FAILURE\0"
     "INCOMPATIBLE_OBJECTS\0"
+    "INVALID_COFACTOR\0"
     "INVALID_COMPRESSED_POINT\0"
     "INVALID_COMPRESSION_BIT\0"
     "INVALID_ENCODING\0"
@@ -873,27 +885,19 @@
     "NOT_IMPLEMENTED\0"
     "RANDOM_NUMBER_GENERATION_FAILED\0"
     "OPERATION_NOT_SUPPORTED\0"
-    "BN_DECODE_ERROR\0"
     "COMMAND_NOT_SUPPORTED\0"
-    "CONTEXT_NOT_INITIALISED\0"
     "DIFFERENT_KEY_TYPES\0"
     "DIFFERENT_PARAMETERS\0"
-    "DIGEST_AND_KEY_TYPE_NOT_SUPPORTED\0"
     "EXPECTING_AN_EC_KEY_KEY\0"
     "EXPECTING_AN_RSA_KEY\0"
-    "EXPECTING_A_DH_KEY\0"
     "EXPECTING_A_DSA_KEY\0"
     "ILLEGAL_OR_UNSUPPORTED_PADDING_MODE\0"
-    "INVALID_CURVE\0"
     "INVALID_DIGEST_LENGTH\0"
     "INVALID_DIGEST_TYPE\0"
     "INVALID_KEYBITS\0"
     "INVALID_MGF1_MD\0"
     "INVALID_PADDING_MODE\0"
-    "INVALID_PSS_PARAMETERS\0"
     "INVALID_PSS_SALTLEN\0"
-    "INVALID_SALT_LENGTH\0"
-    "INVALID_TRAILER\0"
     "KEYS_NOT_SET\0"
     "NO_DEFAULT_DIGEST\0"
     "NO_KEY_SET\0"
@@ -903,17 +907,8 @@
     "NO_PARAMETERS_SET\0"
     "OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE\0"
     "OPERATON_NOT_INITIALIZED\0"
-    "PARAMETER_ENCODING_ERROR\0"
-    "UNKNOWN_DIGEST\0"
-    "UNKNOWN_MASK_DIGEST\0"
-    "UNKNOWN_MESSAGE_DIGEST_ALGORITHM\0"
     "UNKNOWN_PUBLIC_KEY_TYPE\0"
-    "UNKNOWN_SIGNATURE_ALGORITHM\0"
     "UNSUPPORTED_ALGORITHM\0"
-    "UNSUPPORTED_MASK_ALGORITHM\0"
-    "UNSUPPORTED_MASK_PARAMETER\0"
-    "UNSUPPORTED_SIGNATURE_TYPE\0"
-    "WRONG_PUBLIC_KEY_TYPE\0"
     "OUTPUT_TOO_LARGE\0"
     "UNKNOWN_NID\0"
     "BAD_BASE64_DECODE\0"
@@ -949,6 +944,7 @@
     "UNKNOWN_ALGORITHM\0"
     "UNKNOWN_CIPHER\0"
     "UNKNOWN_CIPHER_ALGORITHM\0"
+    "UNKNOWN_DIGEST\0"
     "UNKNOWN_HASH\0"
     "UNSUPPORTED_PRIVATE_KEY_ALGORITHM\0"
     "BAD_E_VALUE\0"
@@ -1009,6 +1005,8 @@
     "BAD_SSL_FILETYPE\0"
     "BAD_WRITE_RETRY\0"
     "BIO_NOT_SET\0"
+    "BLOCK_CIPHER_PAD_IS_WRONG\0"
+    "BUFFERED_MESSAGES_ON_CIPHER_CHANGE\0"
     "CA_DN_LENGTH_MISMATCH\0"
     "CA_DN_TOO_LONG\0"
     "CCS_RECEIVED_EARLY\0"
@@ -1029,7 +1027,10 @@
     "DH_PUBLIC_VALUE_LENGTH_IS_WRONG\0"
     "DH_P_TOO_LONG\0"
     "DIGEST_CHECK_FAILED\0"
+    "DOWNGRADE_DETECTED\0"
     "DTLS_MESSAGE_TOO_BIG\0"
+    "DUPLICATE_EXTENSION\0"
+    "DUPLICATE_KEY_SHARE\0"
     "ECC_CERT_NOT_FOR_SIGNING\0"
     "EMS_STATE_INCONSISTENT\0"
     "ENCRYPTED_LENGTH_TOO_LONG\0"
@@ -1044,13 +1045,17 @@
     "HTTPS_PROXY_REQUEST\0"
     "HTTP_REQUEST\0"
     "INAPPROPRIATE_FALLBACK\0"
+    "INVALID_ALPN_PROTOCOL\0"
     "INVALID_COMMAND\0"
+    "INVALID_COMPRESSION_LIST\0"
     "INVALID_MESSAGE\0"
+    "INVALID_OUTER_RECORD_TYPE\0"
     "INVALID_SSL_SESSION\0"
     "INVALID_TICKET_KEYS_LENGTH\0"
     "LENGTH_MISMATCH\0"
     "LIBRARY_HAS_NO_CIPHERS\0"
     "MISSING_EXTENSION\0"
+    "MISSING_KEY_SHARE\0"
     "MISSING_RSA_CERTIFICATE\0"
     "MISSING_TMP_DH_KEY\0"
     "MISSING_TMP_ECDH_KEY\0"
@@ -1063,8 +1068,11 @@
     "NO_CERTIFICATE_SET\0"
     "NO_CIPHERS_AVAILABLE\0"
     "NO_CIPHERS_PASSED\0"
+    "NO_CIPHERS_SPECIFIED\0"
     "NO_CIPHER_MATCH\0"
+    "NO_COMMON_SIGNATURE_ALGORITHMS\0"
     "NO_COMPRESSION_SPECIFIED\0"
+    "NO_GROUPS_SPECIFIED\0"
     "NO_METHOD_SPECIFIED\0"
     "NO_P256_SUPPORT\0"
     "NO_PRIVATE_KEY_ASSIGNED\0"
@@ -1086,6 +1094,7 @@
     "READ_TIMEOUT_EXPIRED\0"
     "RECORD_LENGTH_MISMATCH\0"
     "RECORD_TOO_LARGE\0"
+    "RENEGOTIATION_EMS_MISMATCH\0"
     "RENEGOTIATION_ENCODING_ERR\0"
     "RENEGOTIATION_MISMATCH\0"
     "REQUIRED_CIPHER_MISSING\0"
@@ -1095,6 +1104,7 @@
     "SERVERHELLO_TLSEXT\0"
     "SESSION_ID_CONTEXT_UNINITIALIZED\0"
     "SESSION_MAY_NOT_BE_CREATED\0"
+    "SHUTDOWN_WHILE_IN_INIT\0"
     "SIGNATURE_ALGORITHMS_EXTENSION_SENT_BY_SERVER\0"
     "SRTP_COULD_NOT_ALLOCATE_PROFILES\0"
     "SRTP_UNKNOWN_PROTECTION_PROFILE\0"
@@ -1135,6 +1145,7 @@
     "TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST\0"
     "TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG\0"
     "TOO_MANY_EMPTY_FRAGMENTS\0"
+    "TOO_MANY_KEY_UPDATES\0"
     "TOO_MANY_WARNING_ALERTS\0"
     "UNABLE_TO_FIND_ECDH_PARAMETERS\0"
     "UNEXPECTED_EXTENSION\0"
@@ -1153,6 +1164,7 @@
     "UNSUPPORTED_COMPRESSION_ALGORITHM\0"
     "UNSUPPORTED_ELLIPTIC_CURVE\0"
     "UNSUPPORTED_PROTOCOL\0"
+    "UNSUPPORTED_PROTOCOL_FOR_CUSTOM_KEY\0"
     "WRONG_CERTIFICATE_TYPE\0"
     "WRONG_CIPHER_RETURNED\0"
     "WRONG_CURVE\0"
@@ -1173,12 +1185,14 @@
     "IDP_MISMATCH\0"
     "INVALID_DIRECTORY\0"
     "INVALID_FIELD_NAME\0"
+    "INVALID_PSS_PARAMETERS\0"
     "INVALID_TRUST\0"
     "ISSUER_MISMATCH\0"
     "KEY_TYPE_MISMATCH\0"
     "KEY_VALUES_MISMATCH\0"
     "LOADING_CERT_DIR\0"
     "LOADING_DEFAULTS\0"
+    "NAME_TOO_LONG\0"
     "NEWER_CRL_NOT_NEWER\0"
     "NOT_PKCS7_SIGNED_DATA\0"
     "NO_CERTIFICATES_INCLUDED\0"
@@ -1188,8 +1202,6 @@
     "PUBLIC_KEY_DECODE_ERROR\0"
     "PUBLIC_KEY_ENCODE_ERROR\0"
     "SHOULD_RETRY\0"
-    "UNABLE_TO_FIND_PARAMETERS_IN_CHAIN\0"
-    "UNABLE_TO_GET_CERTS_PUBLIC_KEY\0"
     "UNKNOWN_KEY_TYPE\0"
     "UNKNOWN_PURPOSE_ID\0"
     "UNKNOWN_TRUST_ID\0"
diff --git a/src/compiler/cpp_generator.cc b/src/compiler/cpp_generator.cc
index a26eeb4..e481aaf 100644
--- a/src/compiler/cpp_generator.cc
+++ b/src/compiler/cpp_generator.cc
@@ -1218,13 +1218,15 @@
                         std::map<grpc::string, grpc::string> *vars) {
   (*vars)["Service"] = service->name();
 
-  printer->Print(*vars,
-                 "static const char* $prefix$$Service$_method_names[] = {\n");
-  for (int i = 0; i < service->method_count(); ++i) {
-    (*vars)["Method"] = service->method(i).get()->name();
-    printer->Print(*vars, "  \"/$Package$$Service$/$Method$\",\n");
+  if (service->method_count() > 0) {
+    printer->Print(*vars,
+                   "static const char* $prefix$$Service$_method_names[] = {\n");
+    for (int i = 0; i < service->method_count(); ++i) {
+      (*vars)["Method"] = service->method(i).get()->name();
+      printer->Print(*vars, "  \"/$Package$$Service$/$Method$\",\n");
+    }
+    printer->Print(*vars, "};\n\n");
   }
-  printer->Print(*vars, "};\n\n");
 
   printer->Print(*vars,
                  "std::unique_ptr< $ns$$Service$::Stub> $ns$$Service$::NewStub("
@@ -1272,7 +1274,6 @@
 
   printer->Print(*vars, "$ns$$Service$::Service::Service() {\n");
   printer->Indent();
-  printer->Print(*vars, "(void)$prefix$$Service$_method_names;\n");
   for (int i = 0; i < service->method_count(); ++i) {
     auto method = service->method(i);
     (*vars)["Idx"] = as_string(i);
diff --git a/src/core/ext/census/tracing.c b/src/core/ext/census/tracing.c
index 3b5d6da..9371fff 100644
--- a/src/core/ext/census/tracing.c
+++ b/src/core/ext/census/tracing.c
@@ -31,15 +31,21 @@
  *
  */
 
+//#include "src/core/ext/census/tracing.h"
+
 #include <grpc/census.h>
+#include <stdlib.h>
 
 /* TODO(aveitch): These are all placeholder implementations. */
 
 int census_trace_mask(const census_context *context) {
+  abort();
   return CENSUS_TRACE_MASK_NONE;
 }
 
-void census_set_trace_mask(int trace_mask) {}
+void census_set_trace_mask(int trace_mask) { abort(); }
 
 void census_trace_print(census_context *context, uint32_t type,
-                        const char *buffer, size_t n) {}
+                        const char *buffer, size_t n) {
+  abort();
+}
diff --git a/src/core/ext/client_channel/client_channel.c b/src/core/ext/client_channel/client_channel.c
index 2f25fef..865e91a 100644
--- a/src/core/ext/client_channel/client_channel.c
+++ b/src/core/ext/client_channel/client_channel.c
@@ -43,6 +43,8 @@
 #include <grpc/support/sync.h>
 #include <grpc/support/useful.h>
 
+#include "src/core/ext/client_channel/http_connect_handshaker.h"
+#include "src/core/ext/client_channel/http_proxy.h"
 #include "src/core/ext/client_channel/lb_policy_registry.h"
 #include "src/core/ext/client_channel/resolver_registry.h"
 #include "src/core/ext/client_channel/subchannel.h"
@@ -150,6 +152,10 @@
  */
 
 typedef struct client_channel_channel_data {
+  /** server name */
+  char *server_name;
+  /** HTTP CONNECT proxy to use, if any */
+  char *proxy_name;
   /** resolver for this channel */
   grpc_resolver *resolver;
   /** have we started resolving this channel */
@@ -310,6 +316,17 @@
     // Use pick_first if nothing was specified and we didn't select grpclb
     // above.
     if (lb_policy_name == NULL) lb_policy_name = "pick_first";
+    // If using a proxy, add channel arg for server in HTTP CONNECT request.
+    if (chand->proxy_name != NULL) {
+      grpc_arg new_arg;
+      new_arg.key = GRPC_ARG_HTTP_CONNECT_SERVER;
+      new_arg.type = GRPC_ARG_STRING;
+      new_arg.value.string = chand->server_name;
+      grpc_channel_args *tmp_args = chand->resolver_result;
+      chand->resolver_result =
+          grpc_channel_args_copy_and_add(chand->resolver_result, &new_arg, 1);
+      grpc_channel_args_destroy(exec_ctx, tmp_args);
+    }
     // Instantiate LB policy.
     grpc_lb_policy_args lb_policy_args;
     lb_policy_args.args = chand->resolver_result;
@@ -528,9 +545,12 @@
   arg = grpc_channel_args_find(args->channel_args, GRPC_ARG_SERVER_URI);
   GPR_ASSERT(arg != NULL);
   GPR_ASSERT(arg->type == GRPC_ARG_STRING);
-  chand->resolver =
-      grpc_resolver_create(exec_ctx, arg->value.string, args->channel_args,
-                           chand->interested_parties);
+  chand->server_name = gpr_strdup(arg->value.string);
+  chand->proxy_name = grpc_get_http_proxy_server();
+  char *name_to_resolve =
+      chand->proxy_name == NULL ? chand->server_name : chand->proxy_name;
+  chand->resolver = grpc_resolver_create(
+      exec_ctx, name_to_resolve, args->channel_args, chand->interested_parties);
   if (chand->resolver == NULL) {
     return GRPC_ERROR_CREATE("resolver creation failed");
   }
@@ -541,7 +561,8 @@
 static void cc_destroy_channel_elem(grpc_exec_ctx *exec_ctx,
                                     grpc_channel_element *elem) {
   channel_data *chand = elem->channel_data;
-
+  gpr_free(chand->server_name);
+  gpr_free(chand->proxy_name);
   if (chand->resolver != NULL) {
     grpc_resolver_shutdown(exec_ctx, chand->resolver);
     GRPC_RESOLVER_UNREF(exec_ctx, chand->resolver, "channel");
diff --git a/src/core/ext/client_channel/http_connect_handshaker.c b/src/core/ext/client_channel/http_connect_handshaker.c
index fba3256..622d236 100644
--- a/src/core/ext/client_channel/http_connect_handshaker.c
+++ b/src/core/ext/client_channel/http_connect_handshaker.c
@@ -49,15 +49,12 @@
 #include "src/core/lib/http/parser.h"
 #include "src/core/lib/slice/slice_internal.h"
 #include "src/core/lib/support/env.h"
+#include "src/core/lib/support/string.h"
 
 typedef struct http_connect_handshaker {
   // Base class.  Must be first.
   grpc_handshaker base;
 
-  char* proxy_server;
-  grpc_http_header* headers;
-  size_t num_headers;
-
   gpr_refcount refcount;
   gpr_mu mu;
 
@@ -91,12 +88,6 @@
                                          handshaker->read_buffer_to_destroy);
       gpr_free(handshaker->read_buffer_to_destroy);
     }
-    gpr_free(handshaker->proxy_server);
-    for (size_t i = 0; i < handshaker->num_headers; ++i) {
-      gpr_free(handshaker->headers[i].key);
-      gpr_free(handshaker->headers[i].value);
-    }
-    gpr_free(handshaker->headers);
     grpc_slice_buffer_destroy_internal(exec_ctx, &handshaker->write_buffer);
     grpc_http_parser_destroy(&handshaker->http_parser);
     grpc_http_response_destroy(&handshaker->http_response);
@@ -276,64 +267,88 @@
     grpc_tcp_server_acceptor* acceptor, grpc_closure* on_handshake_done,
     grpc_handshaker_args* args) {
   http_connect_handshaker* handshaker = (http_connect_handshaker*)handshaker_in;
-  // Get server name from channel args.
-  const grpc_arg* arg = grpc_channel_args_find(args->args, GRPC_ARG_SERVER_URI);
-  GPR_ASSERT(arg != NULL);
+  // Check for HTTP CONNECT channel arg.
+  // If not found, invoke on_handshake_done without doing anything.
+  const grpc_arg* arg =
+      grpc_channel_args_find(args->args, GRPC_ARG_HTTP_CONNECT_SERVER);
+  if (arg == NULL) {
+    // Set shutdown to true so that subsequent calls to
+    // http_connect_handshaker_shutdown() do nothing.
+    gpr_mu_lock(&handshaker->mu);
+    handshaker->shutdown = true;
+    gpr_mu_unlock(&handshaker->mu);
+    grpc_closure_sched(exec_ctx, on_handshake_done, GRPC_ERROR_NONE);
+    return;
+  }
   GPR_ASSERT(arg->type == GRPC_ARG_STRING);
-  char* canonical_uri =
-      grpc_resolver_factory_add_default_prefix_if_needed(arg->value.string);
-  grpc_uri* uri = grpc_uri_parse(canonical_uri, 1);
-  char* server_name = uri->path;
-  if (server_name[0] == '/') ++server_name;
+  char* server_name = arg->value.string;
+  // Get headers from channel args.
+  arg = grpc_channel_args_find(args->args, GRPC_ARG_HTTP_CONNECT_HEADERS);
+  grpc_http_header* headers = NULL;
+  size_t num_headers = 0;
+  char** header_strings = NULL;
+  size_t num_header_strings = 0;
+  if (arg != NULL) {
+    GPR_ASSERT(arg->type == GRPC_ARG_STRING);
+    gpr_string_split(arg->value.string, "\n", &header_strings,
+                     &num_header_strings);
+    headers = gpr_malloc(sizeof(grpc_http_header) * num_header_strings);
+    for (size_t i = 0; i < num_header_strings; ++i) {
+      char* sep = strchr(header_strings[i], ':');
+      if (sep == NULL) {
+        gpr_log(GPR_ERROR, "skipping unparseable HTTP CONNECT header: %s",
+                header_strings[i]);
+        continue;
+      }
+      *sep = '\0';
+      headers[num_headers].key = header_strings[i];
+      headers[num_headers].value = sep + 1;
+      ++num_headers;
+    }
+  }
   // Save state in the handshaker object.
   gpr_mu_lock(&handshaker->mu);
   handshaker->args = args;
   handshaker->on_handshake_done = on_handshake_done;
-  // Send HTTP CONNECT request.
+  // Log connection via proxy.
+  char* proxy_name = grpc_endpoint_get_peer(args->endpoint);
   gpr_log(GPR_INFO, "Connecting to server %s via HTTP proxy %s", server_name,
-          handshaker->proxy_server);
+          proxy_name);
+  gpr_free(proxy_name);
+  // Construct HTTP CONNECT request.
   grpc_httpcli_request request;
   memset(&request, 0, sizeof(request));
   request.host = server_name;
   request.http.method = "CONNECT";
   request.http.path = server_name;
-  request.http.hdrs = handshaker->headers;
-  request.http.hdr_count = handshaker->num_headers;
+  request.http.hdrs = headers;
+  request.http.hdr_count = num_headers;
   request.handshaker = &grpc_httpcli_plaintext;
   grpc_slice request_slice = grpc_httpcli_format_connect_request(&request);
   grpc_slice_buffer_add(&handshaker->write_buffer, request_slice);
+  // Clean up.
+  gpr_free(headers);
+  for (size_t i = 0; i < num_header_strings; ++i) {
+    gpr_free(header_strings[i]);
+  }
+  gpr_free(header_strings);
   // Take a new ref to be held by the write callback.
   gpr_ref(&handshaker->refcount);
   grpc_endpoint_write(exec_ctx, args->endpoint, &handshaker->write_buffer,
                       &handshaker->request_done_closure);
   gpr_mu_unlock(&handshaker->mu);
-  // Clean up.
-  gpr_free(canonical_uri);
-  grpc_uri_destroy(uri);
 }
 
 static const grpc_handshaker_vtable http_connect_handshaker_vtable = {
     http_connect_handshaker_destroy, http_connect_handshaker_shutdown,
     http_connect_handshaker_do_handshake};
 
-grpc_handshaker* grpc_http_connect_handshaker_create(const char* proxy_server,
-                                                     grpc_http_header* headers,
-                                                     size_t num_headers) {
-  GPR_ASSERT(proxy_server != NULL);
+static grpc_handshaker* grpc_http_connect_handshaker_create() {
   http_connect_handshaker* handshaker = gpr_malloc(sizeof(*handshaker));
   memset(handshaker, 0, sizeof(*handshaker));
   grpc_handshaker_init(&http_connect_handshaker_vtable, &handshaker->base);
   gpr_mu_init(&handshaker->mu);
   gpr_ref_init(&handshaker->refcount, 1);
-  handshaker->proxy_server = gpr_strdup(proxy_server);
-  if (num_headers > 0) {
-    handshaker->headers = gpr_malloc(sizeof(grpc_http_header) * num_headers);
-    for (size_t i = 0; i < num_headers; ++i) {
-      handshaker->headers[i].key = gpr_strdup(headers[i].key);
-      handshaker->headers[i].value = gpr_strdup(headers[i].value);
-    }
-    handshaker->num_headers = num_headers;
-  }
   grpc_slice_buffer_init(&handshaker->write_buffer);
   grpc_closure_init(&handshaker->request_done_closure, on_write_done,
                     handshaker, grpc_schedule_on_exec_ctx);
@@ -344,30 +359,6 @@
   return &handshaker->base;
 }
 
-char* grpc_get_http_proxy_server() {
-  char* uri_str = gpr_getenv("http_proxy");
-  if (uri_str == NULL) return NULL;
-  grpc_uri* uri = grpc_uri_parse(uri_str, false /* suppress_errors */);
-  char* proxy_name = NULL;
-  if (uri == NULL || uri->authority == NULL) {
-    gpr_log(GPR_ERROR, "cannot parse value of 'http_proxy' env var");
-    goto done;
-  }
-  if (strcmp(uri->scheme, "http") != 0) {
-    gpr_log(GPR_ERROR, "'%s' scheme not supported in proxy URI", uri->scheme);
-    goto done;
-  }
-  if (strchr(uri->authority, '@') != NULL) {
-    gpr_log(GPR_ERROR, "userinfo not supported in proxy URI");
-    goto done;
-  }
-  proxy_name = gpr_strdup(uri->authority);
-done:
-  gpr_free(uri_str);
-  grpc_uri_destroy(uri);
-  return proxy_name;
-}
-
 //
 // handshaker factory
 //
@@ -375,13 +366,8 @@
 static void handshaker_factory_add_handshakers(
     grpc_exec_ctx* exec_ctx, grpc_handshaker_factory* factory,
     const grpc_channel_args* args, grpc_handshake_manager* handshake_mgr) {
-  char* proxy_name = grpc_get_http_proxy_server();
-  if (proxy_name != NULL) {
-    grpc_handshake_manager_add(
-        handshake_mgr,
-        grpc_http_connect_handshaker_create(proxy_name, NULL, 0));
-    gpr_free(proxy_name);
-  }
+  grpc_handshake_manager_add(handshake_mgr,
+                             grpc_http_connect_handshaker_create());
 }
 
 static void handshaker_factory_destroy(grpc_exec_ctx* exec_ctx,
diff --git a/src/core/ext/client_channel/http_connect_handshaker.h b/src/core/ext/client_channel/http_connect_handshaker.h
index c2e68de..3059d55 100644
--- a/src/core/ext/client_channel/http_connect_handshaker.h
+++ b/src/core/ext/client_channel/http_connect_handshaker.h
@@ -34,17 +34,14 @@
 #ifndef GRPC_CORE_EXT_CLIENT_CHANNEL_HTTP_CONNECT_HANDSHAKER_H
 #define GRPC_CORE_EXT_CLIENT_CHANNEL_HTTP_CONNECT_HANDSHAKER_H
 
-#include "src/core/lib/channel/handshaker.h"
-#include "src/core/lib/http/parser.h"
+/// Channel arg indicating the server in HTTP CONNECT request (string).
+/// The presence of this arg triggers the use of HTTP CONNECT.
+#define GRPC_ARG_HTTP_CONNECT_SERVER "grpc.http_connect_server"
 
-/// Creates a new HTTP CONNECT handshaker.
-grpc_handshaker* grpc_http_connect_handshaker_create(const char* proxy_server,
-                                                     grpc_http_header* headers,
-                                                     size_t num_headers);
-
-/// Returns the name of the proxy to use, or NULL if no proxy is configured.
-/// Caller takes ownership of result.
-char* grpc_get_http_proxy_server();
+/// Channel arg indicating HTTP CONNECT headers (string).
+/// Multiple headers are separated by newlines.  Key/value pairs are
+/// seperated by colons.
+#define GRPC_ARG_HTTP_CONNECT_HEADERS "grpc.http_connect_headers"
 
 /// Registers handshaker factory.
 void grpc_http_connect_register_handshaker_factory();
diff --git a/src/core/ext/client_channel/http_proxy.c b/src/core/ext/client_channel/http_proxy.c
new file mode 100644
index 0000000..9a6c818
--- /dev/null
+++ b/src/core/ext/client_channel/http_proxy.c
@@ -0,0 +1,68 @@
+/*
+ *
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include "src/core/ext/client_channel/http_proxy.h"
+
+#include <stdbool.h>
+#include <string.h>
+
+#include <grpc/support/alloc.h>
+#include <grpc/support/log.h>
+#include <grpc/support/string_util.h>
+
+#include "src/core/ext/client_channel/uri_parser.h"
+#include "src/core/lib/support/env.h"
+
+char* grpc_get_http_proxy_server() {
+  char* uri_str = gpr_getenv("http_proxy");
+  if (uri_str == NULL) return NULL;
+  grpc_uri* uri = grpc_uri_parse(uri_str, false /* suppress_errors */);
+  char* proxy_name = NULL;
+  if (uri == NULL || uri->authority == NULL) {
+    gpr_log(GPR_ERROR, "cannot parse value of 'http_proxy' env var");
+    goto done;
+  }
+  if (strcmp(uri->scheme, "http") != 0) {
+    gpr_log(GPR_ERROR, "'%s' scheme not supported in proxy URI", uri->scheme);
+    goto done;
+  }
+  if (strchr(uri->authority, '@') != NULL) {
+    gpr_log(GPR_ERROR, "userinfo not supported in proxy URI");
+    goto done;
+  }
+  proxy_name = gpr_strdup(uri->authority);
+done:
+  gpr_free(uri_str);
+  grpc_uri_destroy(uri);
+  return proxy_name;
+}
diff --git a/test/cpp/qps/limit_cores.h b/src/core/ext/client_channel/http_proxy.h
similarity index 72%
rename from test/cpp/qps/limit_cores.h
rename to src/core/ext/client_channel/http_proxy.h
index 5482904..0d77ae2 100644
--- a/test/cpp/qps/limit_cores.h
+++ b/src/core/ext/client_channel/http_proxy.h
@@ -31,19 +31,11 @@
  *
  */
 
-#ifndef TEST_QPS_LIMIT_CORES_H
-#define TEST_QPS_LIMIT_CORES_H
+#ifndef GRPC_CORE_EXT_CLIENT_CHANNEL_HTTP_PROXY_H
+#define GRPC_CORE_EXT_CLIENT_CHANNEL_HTTP_PROXY_H
 
-namespace grpc {
-namespace testing {
-/// LimitCores: allow this worker to only run on the cores specified in the
-/// array \a cores, which is of length \a cores_size.
-///
-/// LimitCores takes array and size arguments (instead of vector) for direct
-/// conversion from repeated field of protobuf. Use a cores_size of 0 to remove
-/// existing limits (from an empty repeated field)
-int LimitCores(const int *cores, int cores_size);
-}  // namespace testing
-}  // namespace grpc
+/// Returns the name of the proxy to use, or NULL if no proxy is configured.
+/// Caller takes ownership of result.
+char* grpc_get_http_proxy_server();
 
-#endif  // TEST_QPS_LIMIT_CORES_H
+#endif /* GRPC_CORE_EXT_CLIENT_CHANNEL_HTTP_PROXY_H */
diff --git a/src/core/ext/client_channel/resolver_registry.h b/src/core/ext/client_channel/resolver_registry.h
index 4fb1613..a460646 100644
--- a/src/core/ext/client_channel/resolver_registry.h
+++ b/src/core/ext/client_channel/resolver_registry.h
@@ -60,7 +60,9 @@
     return it.
     If a resolver factory was not found, return NULL.
     \a args is a set of channel arguments to be included in the result
-    (typically the set of arguments passed in from the client API). */
+    (typically the set of arguments passed in from the client API).
+    \a pollset_set is used to drive IO in the name resolution process, it
+    should not be NULL. */
 grpc_resolver *grpc_resolver_create(grpc_exec_ctx *exec_ctx, const char *target,
                                     const grpc_channel_args *args,
                                     grpc_pollset_set *pollset_set);
diff --git a/src/core/ext/resolver/dns/native/dns_resolver.c b/src/core/ext/resolver/dns/native/dns_resolver.c
index 655d9dc..bf2f4e5 100644
--- a/src/core/ext/resolver/dns/native/dns_resolver.c
+++ b/src/core/ext/resolver/dns/native/dns_resolver.c
@@ -37,7 +37,6 @@
 #include <grpc/support/host_port.h>
 #include <grpc/support/string_util.h>
 
-#include "src/core/ext/client_channel/http_connect_handshaker.h"
 #include "src/core/ext/client_channel/lb_policy_registry.h"
 #include "src/core/ext/client_channel/resolver_registry.h"
 #include "src/core/lib/channel/channel_args.h"
@@ -261,16 +260,14 @@
     return NULL;
   }
   // Get name from args.
-  const char *path = args->uri->path;
+  char *path = args->uri->path;
   if (path[0] == '/') ++path;
-  // Get proxy name, if any.
-  char *proxy_name = grpc_get_http_proxy_server();
   // Create resolver.
   dns_resolver *r = gpr_malloc(sizeof(dns_resolver));
   memset(r, 0, sizeof(*r));
   gpr_mu_init(&r->mu);
   grpc_resolver_init(&r->base, &dns_resolver_vtable);
-  r->name_to_resolve = proxy_name == NULL ? gpr_strdup(path) : proxy_name;
+  r->name_to_resolve = gpr_strdup(path);
   r->default_port = gpr_strdup(default_port);
   r->channel_args = grpc_channel_args_copy(args->args);
   r->interested_parties = grpc_pollset_set_create();
diff --git a/src/core/ext/transport/cronet/client/secure/cronet_channel_create.c b/src/core/ext/transport/cronet/client/secure/cronet_channel_create.c
index df1acdd..477cf07 100644
--- a/src/core/ext/transport/cronet/client/secure/cronet_channel_create.c
+++ b/src/core/ext/transport/cronet/client/secure/cronet_channel_create.c
@@ -60,7 +60,7 @@
   ct->host = gpr_malloc(strlen(target) + 1);
   strcpy(ct->host, target);
   gpr_log(GPR_DEBUG,
-          "grpc_create_cronet_transport: cronet_engine = %p, target=%s", engine,
+          "grpc_create_cronet_transport: stream_engine = %p, target=%s", engine,
           ct->host);
 
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
diff --git a/src/core/ext/transport/cronet/transport/cronet_api_dummy.c b/src/core/ext/transport/cronet/transport/cronet_api_dummy.c
index 687026c..74327a4 100644
--- a/src/core/ext/transport/cronet/transport/cronet_api_dummy.c
+++ b/src/core/ext/transport/cronet/transport/cronet_api_dummy.c
@@ -38,48 +38,46 @@
 
 #include <grpc/support/log.h>
 
-#include "third_party/objective_c/Cronet/cronet_c_for_grpc.h"
+#include "third_party/Cronet/bidirectional_stream_c.h"
 
 #ifdef GRPC_COMPILE_WITH_CRONET
 /* link with the real CRONET library in the build system */
 #else
 /* Dummy implementation of cronet API just to test for build-ability */
-cronet_bidirectional_stream* cronet_bidirectional_stream_create(
-    cronet_engine* engine, void* annotation,
-    cronet_bidirectional_stream_callback* callback) {
+bidirectional_stream* bidirectional_stream_create(
+    stream_engine* engine, void* annotation,
+    bidirectional_stream_callback* callback) {
   GPR_ASSERT(0);
   return NULL;
 }
 
-int cronet_bidirectional_stream_destroy(cronet_bidirectional_stream* stream) {
+int bidirectional_stream_destroy(bidirectional_stream* stream) {
   GPR_ASSERT(0);
   return 0;
 }
 
-int cronet_bidirectional_stream_start(
-    cronet_bidirectional_stream* stream, const char* url, int priority,
-    const char* method, const cronet_bidirectional_stream_header_array* headers,
-    bool end_of_stream) {
+int bidirectional_stream_start(bidirectional_stream* stream, const char* url,
+                               int priority, const char* method,
+                               const bidirectional_stream_header_array* headers,
+                               bool end_of_stream) {
   GPR_ASSERT(0);
   return 0;
 }
 
-int cronet_bidirectional_stream_read(cronet_bidirectional_stream* stream,
-                                     char* buffer, int capacity) {
+int bidirectional_stream_read(bidirectional_stream* stream, char* buffer,
+                              int capacity) {
   GPR_ASSERT(0);
   return 0;
 }
 
-int cronet_bidirectional_stream_write(cronet_bidirectional_stream* stream,
-                                      const char* buffer, int count,
-                                      bool end_of_stream) {
+int bidirectional_stream_write(bidirectional_stream* stream, const char* buffer,
+                               int count, bool end_of_stream) {
   GPR_ASSERT(0);
   return 0;
 }
 
-int cronet_bidirectional_stream_cancel(cronet_bidirectional_stream* stream) {
+void bidirectional_stream_cancel(bidirectional_stream* stream) {
   GPR_ASSERT(0);
-  return 0;
 }
 
 #endif /* GRPC_COMPILE_WITH_CRONET */
diff --git a/src/core/ext/transport/cronet/transport/cronet_transport.c b/src/core/ext/transport/cronet/transport/cronet_transport.c
index 296c406..6f58163 100644
--- a/src/core/ext/transport/cronet/transport/cronet_transport.c
+++ b/src/core/ext/transport/cronet/transport/cronet_transport.c
@@ -49,7 +49,7 @@
 #include "src/core/lib/transport/metadata_batch.h"
 #include "src/core/lib/transport/static_metadata.h"
 #include "src/core/lib/transport/transport_impl.h"
-#include "third_party/objective_c/Cronet/cronet_c_for_grpc.h"
+#include "third_party/Cronet/bidirectional_stream_c.h"
 
 #define GRPC_HEADER_SIZE_IN_BYTES 5
 
@@ -86,19 +86,18 @@
 
 /* Cronet callbacks. See cronet_c_for_grpc.h for documentation for each. */
 
-static void on_request_headers_sent(cronet_bidirectional_stream *);
+static void on_request_headers_sent(bidirectional_stream *);
 static void on_response_headers_received(
-    cronet_bidirectional_stream *,
-    const cronet_bidirectional_stream_header_array *, const char *);
-static void on_write_completed(cronet_bidirectional_stream *, const char *);
-static void on_read_completed(cronet_bidirectional_stream *, char *, int);
+    bidirectional_stream *, const bidirectional_stream_header_array *,
+    const char *);
+static void on_write_completed(bidirectional_stream *, const char *);
+static void on_read_completed(bidirectional_stream *, char *, int);
 static void on_response_trailers_received(
-    cronet_bidirectional_stream *,
-    const cronet_bidirectional_stream_header_array *);
-static void on_succeeded(cronet_bidirectional_stream *);
-static void on_failed(cronet_bidirectional_stream *, int);
-static void on_canceled(cronet_bidirectional_stream *);
-static cronet_bidirectional_stream_callback cronet_callbacks = {
+    bidirectional_stream *, const bidirectional_stream_header_array *);
+static void on_succeeded(bidirectional_stream *);
+static void on_failed(bidirectional_stream *, int);
+static void on_canceled(bidirectional_stream *);
+static bidirectional_stream_callback cronet_callbacks = {
     on_request_headers_sent,
     on_response_headers_received,
     on_read_completed,
@@ -111,7 +110,7 @@
 /* Cronet transport object */
 struct grpc_cronet_transport {
   grpc_transport base; /* must be first element in this structure */
-  cronet_engine *engine;
+  stream_engine *engine;
   char *host;
 };
 typedef struct grpc_cronet_transport grpc_cronet_transport;
@@ -176,8 +175,8 @@
   grpc_transport_stream_op *curr_op;
   grpc_cronet_transport curr_ct;
   grpc_stream *curr_gs;
-  cronet_bidirectional_stream *cbs;
-  cronet_bidirectional_stream_header_array header_array;
+  bidirectional_stream *cbs;
+  bidirectional_stream_header_array header_array;
 
   /* Stream level state. Some state will be tracked both at stream and stream_op
    * level */
@@ -344,11 +343,11 @@
 /*
   Cronet callback
 */
-static void on_failed(cronet_bidirectional_stream *stream, int net_error) {
+static void on_failed(bidirectional_stream *stream, int net_error) {
   CRONET_LOG(GPR_DEBUG, "on_failed(%p, %d)", stream, net_error);
   stream_obj *s = (stream_obj *)stream->annotation;
   gpr_mu_lock(&s->mu);
-  cronet_bidirectional_stream_destroy(s->cbs);
+  bidirectional_stream_destroy(s->cbs);
   s->state.state_callback_received[OP_FAILED] = true;
   s->cbs = NULL;
   if (s->header_array.headers) {
@@ -367,11 +366,11 @@
 /*
   Cronet callback
 */
-static void on_canceled(cronet_bidirectional_stream *stream) {
+static void on_canceled(bidirectional_stream *stream) {
   CRONET_LOG(GPR_DEBUG, "on_canceled(%p)", stream);
   stream_obj *s = (stream_obj *)stream->annotation;
   gpr_mu_lock(&s->mu);
-  cronet_bidirectional_stream_destroy(s->cbs);
+  bidirectional_stream_destroy(s->cbs);
   s->state.state_callback_received[OP_CANCELED] = true;
   s->cbs = NULL;
   if (s->header_array.headers) {
@@ -390,11 +389,11 @@
 /*
   Cronet callback
 */
-static void on_succeeded(cronet_bidirectional_stream *stream) {
+static void on_succeeded(bidirectional_stream *stream) {
   CRONET_LOG(GPR_DEBUG, "on_succeeded(%p)", stream);
   stream_obj *s = (stream_obj *)stream->annotation;
   gpr_mu_lock(&s->mu);
-  cronet_bidirectional_stream_destroy(s->cbs);
+  bidirectional_stream_destroy(s->cbs);
   s->state.state_callback_received[OP_SUCCEEDED] = true;
   s->cbs = NULL;
   free_read_buffer(s);
@@ -405,7 +404,7 @@
 /*
   Cronet callback
 */
-static void on_request_headers_sent(cronet_bidirectional_stream *stream) {
+static void on_request_headers_sent(bidirectional_stream *stream) {
   CRONET_LOG(GPR_DEBUG, "W: on_request_headers_sent(%p)", stream);
   stream_obj *s = (stream_obj *)stream->annotation;
   gpr_mu_lock(&s->mu);
@@ -424,8 +423,8 @@
   Cronet callback
 */
 static void on_response_headers_received(
-    cronet_bidirectional_stream *stream,
-    const cronet_bidirectional_stream_header_array *headers,
+    bidirectional_stream *stream,
+    const bidirectional_stream_header_array *headers,
     const char *negotiated_protocol) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   CRONET_LOG(GPR_DEBUG, "R: on_response_headers_received(%p, %p, %s)", stream,
@@ -451,9 +450,9 @@
     s->state.rs.read_buffer = s->state.rs.grpc_header_bytes;
     s->state.rs.received_bytes = 0;
     s->state.rs.remaining_bytes = GRPC_HEADER_SIZE_IN_BYTES;
-    CRONET_LOG(GPR_DEBUG, "cronet_bidirectional_stream_read(%p)", s->cbs);
-    cronet_bidirectional_stream_read(s->cbs, s->state.rs.read_buffer,
-                                     s->state.rs.remaining_bytes);
+    CRONET_LOG(GPR_DEBUG, "bidirectional_stream_read(%p)", s->cbs);
+    bidirectional_stream_read(s->cbs, s->state.rs.read_buffer,
+                              s->state.rs.remaining_bytes);
   }
   gpr_mu_unlock(&s->mu);
   grpc_exec_ctx_finish(&exec_ctx);
@@ -463,8 +462,7 @@
 /*
   Cronet callback
 */
-static void on_write_completed(cronet_bidirectional_stream *stream,
-                               const char *data) {
+static void on_write_completed(bidirectional_stream *stream, const char *data) {
   stream_obj *s = (stream_obj *)stream->annotation;
   CRONET_LOG(GPR_DEBUG, "W: on_write_completed(%p, %s)", stream, data);
   gpr_mu_lock(&s->mu);
@@ -480,7 +478,7 @@
 /*
   Cronet callback
 */
-static void on_read_completed(cronet_bidirectional_stream *stream, char *data,
+static void on_read_completed(bidirectional_stream *stream, char *data,
                               int count) {
   stream_obj *s = (stream_obj *)stream->annotation;
   CRONET_LOG(GPR_DEBUG, "R: on_read_completed(%p, %p, %d)", stream, data,
@@ -488,16 +486,16 @@
   gpr_mu_lock(&s->mu);
   s->state.state_callback_received[OP_RECV_MESSAGE] = true;
   if (count > 0 && s->state.flush_read) {
-    CRONET_LOG(GPR_DEBUG, "cronet_bidirectional_stream_read(%p)", s->cbs);
-    cronet_bidirectional_stream_read(s->cbs, s->state.rs.read_buffer, 4096);
+    CRONET_LOG(GPR_DEBUG, "bidirectional_stream_read(%p)", s->cbs);
+    bidirectional_stream_read(s->cbs, s->state.rs.read_buffer, 4096);
     gpr_mu_unlock(&s->mu);
   } else if (count > 0) {
     s->state.rs.received_bytes += count;
     s->state.rs.remaining_bytes -= count;
     if (s->state.rs.remaining_bytes > 0) {
-      CRONET_LOG(GPR_DEBUG, "cronet_bidirectional_stream_read(%p)", s->cbs);
+      CRONET_LOG(GPR_DEBUG, "bidirectional_stream_read(%p)", s->cbs);
       s->state.state_op_done[OP_READ_REQ_MADE] = true;
-      cronet_bidirectional_stream_read(
+      bidirectional_stream_read(
           s->cbs, s->state.rs.read_buffer + s->state.rs.received_bytes,
           s->state.rs.remaining_bytes);
       gpr_mu_unlock(&s->mu);
@@ -520,8 +518,8 @@
   Cronet callback
 */
 static void on_response_trailers_received(
-    cronet_bidirectional_stream *stream,
-    const cronet_bidirectional_stream_header_array *trailers) {
+    bidirectional_stream *stream,
+    const bidirectional_stream_header_array *trailers) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   CRONET_LOG(GPR_DEBUG, "R: on_response_trailers_received(%p,%p)", stream,
              trailers);
@@ -551,9 +549,9 @@
   if (!s->state.state_op_done[OP_SEND_TRAILING_METADATA] &&
       !(s->state.state_op_done[OP_CANCEL_ERROR] ||
         s->state.state_callback_received[OP_FAILED])) {
-    CRONET_LOG(GPR_DEBUG, "cronet_bidirectional_stream_write (%p, 0)", s->cbs);
+    CRONET_LOG(GPR_DEBUG, "bidirectional_stream_write (%p, 0)", s->cbs);
     s->state.state_callback_received[OP_SEND_MESSAGE] = false;
-    cronet_bidirectional_stream_write(s->cbs, "", 0, true);
+    bidirectional_stream_write(s->cbs, "", 0, true);
     s->state.state_op_done[OP_SEND_TRAILING_METADATA] = true;
 
     gpr_mu_unlock(&s->mu);
@@ -594,7 +592,7 @@
 */
 static void convert_metadata_to_cronet_headers(
     grpc_linked_mdelem *head, const char *host, char **pp_url,
-    cronet_bidirectional_stream_header **pp_headers, size_t *p_num_headers,
+    bidirectional_stream_header **pp_headers, size_t *p_num_headers,
     const char **method) {
   grpc_linked_mdelem *curr = head;
   /* Walk the linked list and get number of header fields */
@@ -605,9 +603,9 @@
   }
   /* Allocate enough memory. It is freed in the on_request_headers_sent callback
    */
-  cronet_bidirectional_stream_header *headers =
-      (cronet_bidirectional_stream_header *)gpr_malloc(
-          sizeof(cronet_bidirectional_stream_header) * num_headers_available);
+  bidirectional_stream_header *headers =
+      (bidirectional_stream_header *)gpr_malloc(
+          sizeof(bidirectional_stream_header) * num_headers_available);
   *pp_headers = headers;
 
   /* Walk the linked list again, this time copying the header fields.
@@ -833,9 +831,9 @@
      * on_failed */
     GPR_ASSERT(s->cbs == NULL);
     GPR_ASSERT(!stream_state->state_op_done[OP_SEND_INITIAL_METADATA]);
-    s->cbs = cronet_bidirectional_stream_create(s->curr_ct.engine, s->curr_gs,
-                                                &cronet_callbacks);
-    CRONET_LOG(GPR_DEBUG, "%p = cronet_bidirectional_stream_create()", s->cbs);
+    s->cbs = bidirectional_stream_create(s->curr_ct.engine, s->curr_gs,
+                                         &cronet_callbacks);
+    CRONET_LOG(GPR_DEBUG, "%p = bidirectional_stream_create()", s->cbs);
     char *url = NULL;
     const char *method = "POST";
     s->header_array.headers = NULL;
@@ -843,10 +841,8 @@
         stream_op->send_initial_metadata->list.head, s->curr_ct.host, &url,
         &s->header_array.headers, &s->header_array.count, &method);
     s->header_array.capacity = s->header_array.count;
-    CRONET_LOG(GPR_DEBUG, "cronet_bidirectional_stream_start(%p, %s)", s->cbs,
-               url);
-    cronet_bidirectional_stream_start(s->cbs, url, 0, method, &s->header_array,
-                                      false);
+    CRONET_LOG(GPR_DEBUG, "bidirectional_stream_start(%p, %s)", s->cbs, url);
+    bidirectional_stream_start(s->cbs, url, 0, method, &s->header_array, false);
     stream_state->state_op_done[OP_SEND_INITIAL_METADATA] = true;
     result = ACTION_TAKEN_WITH_CALLBACK;
   } else if (stream_op->recv_initial_metadata &&
@@ -855,11 +851,10 @@
     CRONET_LOG(GPR_DEBUG, "running: %p  OP_RECV_INITIAL_METADATA", oas);
     if (stream_state->state_op_done[OP_CANCEL_ERROR]) {
       grpc_closure_sched(exec_ctx, stream_op->recv_initial_metadata_ready,
-                         GRPC_ERROR_CANCELLED);
+                         GRPC_ERROR_NONE);
     } else if (stream_state->state_callback_received[OP_FAILED]) {
-      grpc_closure_sched(
-          exec_ctx, stream_op->recv_initial_metadata_ready,
-          make_error_with_desc(GRPC_STATUS_UNAVAILABLE, "Unavailable."));
+      grpc_closure_sched(exec_ctx, stream_op->recv_initial_metadata_ready,
+                         GRPC_ERROR_NONE);
     } else {
       grpc_chttp2_incoming_metadata_buffer_publish(
           &oas->s->state.rs.initial_metadata, stream_op->recv_initial_metadata);
@@ -897,11 +892,11 @@
         size_t write_buffer_size;
         create_grpc_frame(&write_slice_buffer, &stream_state->ws.write_buffer,
                           &write_buffer_size);
-        CRONET_LOG(GPR_DEBUG, "cronet_bidirectional_stream_write (%p, %p)",
-                   s->cbs, stream_state->ws.write_buffer);
+        CRONET_LOG(GPR_DEBUG, "bidirectional_stream_write (%p, %p)", s->cbs,
+                   stream_state->ws.write_buffer);
         stream_state->state_callback_received[OP_SEND_MESSAGE] = false;
-        cronet_bidirectional_stream_write(s->cbs, stream_state->ws.write_buffer,
-                                          (int)write_buffer_size, false);
+        bidirectional_stream_write(s->cbs, stream_state->ws.write_buffer,
+                                   (int)write_buffer_size, false);
         result = ACTION_TAKEN_WITH_CALLBACK;
       } else {
         result = NO_ACTION_POSSIBLE;
@@ -916,14 +911,13 @@
     if (stream_state->state_op_done[OP_CANCEL_ERROR]) {
       CRONET_LOG(GPR_DEBUG, "Stream is cancelled.");
       grpc_closure_sched(exec_ctx, stream_op->recv_message_ready,
-                         GRPC_ERROR_CANCELLED);
+                         GRPC_ERROR_NONE);
       stream_state->state_op_done[OP_RECV_MESSAGE] = true;
       result = ACTION_TAKEN_NO_CALLBACK;
     } else if (stream_state->state_callback_received[OP_FAILED]) {
       CRONET_LOG(GPR_DEBUG, "Stream failed.");
-      grpc_closure_sched(
-          exec_ctx, stream_op->recv_message_ready,
-          make_error_with_desc(GRPC_STATUS_UNAVAILABLE, "Unavailable."));
+      grpc_closure_sched(exec_ctx, stream_op->recv_message_ready,
+                         GRPC_ERROR_NONE);
       stream_state->state_op_done[OP_RECV_MESSAGE] = true;
       result = ACTION_TAKEN_NO_CALLBACK;
     } else if (stream_state->rs.read_stream_closed == true) {
@@ -949,11 +943,11 @@
           GPR_ASSERT(stream_state->rs.read_buffer);
           stream_state->rs.remaining_bytes = stream_state->rs.length_field;
           stream_state->rs.received_bytes = 0;
-          CRONET_LOG(GPR_DEBUG, "cronet_bidirectional_stream_read(%p)", s->cbs);
+          CRONET_LOG(GPR_DEBUG, "bidirectional_stream_read(%p)", s->cbs);
           stream_state->state_op_done[OP_READ_REQ_MADE] =
               true; /* Indicates that at least one read request has been made */
-          cronet_bidirectional_stream_read(s->cbs, stream_state->rs.read_buffer,
-                                           stream_state->rs.remaining_bytes);
+          bidirectional_stream_read(s->cbs, stream_state->rs.read_buffer,
+                                    stream_state->rs.remaining_bytes);
           result = ACTION_TAKEN_WITH_CALLBACK;
         } else {
           stream_state->rs.remaining_bytes = 0;
@@ -974,11 +968,11 @@
         stream_state->rs.read_buffer = stream_state->rs.grpc_header_bytes;
         stream_state->rs.remaining_bytes = GRPC_HEADER_SIZE_IN_BYTES;
         stream_state->rs.received_bytes = 0;
-        CRONET_LOG(GPR_DEBUG, "cronet_bidirectional_stream_read(%p)", s->cbs);
+        CRONET_LOG(GPR_DEBUG, "bidirectional_stream_read(%p)", s->cbs);
         stream_state->state_op_done[OP_READ_REQ_MADE] =
             true; /* Indicates that at least one read request has been made */
-        cronet_bidirectional_stream_read(s->cbs, stream_state->rs.read_buffer,
-                                         stream_state->rs.remaining_bytes);
+        bidirectional_stream_read(s->cbs, stream_state->rs.read_buffer,
+                                  stream_state->rs.remaining_bytes);
         result = ACTION_TAKEN_WITH_CALLBACK;
       } else {
         result = NO_ACTION_POSSIBLE;
@@ -1008,9 +1002,9 @@
       stream_state->rs.received_bytes = 0;
       stream_state->rs.remaining_bytes = GRPC_HEADER_SIZE_IN_BYTES;
       stream_state->rs.length_field_received = false;
-      CRONET_LOG(GPR_DEBUG, "cronet_bidirectional_stream_read(%p)", s->cbs);
-      cronet_bidirectional_stream_read(s->cbs, stream_state->rs.read_buffer,
-                                       stream_state->rs.remaining_bytes);
+      CRONET_LOG(GPR_DEBUG, "bidirectional_stream_read(%p)", s->cbs);
+      bidirectional_stream_read(s->cbs, stream_state->rs.read_buffer,
+                                stream_state->rs.remaining_bytes);
       result = ACTION_TAKEN_NO_CALLBACK;
     }
   } else if (stream_op->recv_trailing_metadata &&
@@ -1033,10 +1027,9 @@
       result = NO_ACTION_POSSIBLE;
       CRONET_LOG(GPR_DEBUG, "Stream is either cancelled or failed.");
     } else {
-      CRONET_LOG(GPR_DEBUG, "cronet_bidirectional_stream_write (%p, 0)",
-                 s->cbs);
+      CRONET_LOG(GPR_DEBUG, "bidirectional_stream_write (%p, 0)", s->cbs);
       stream_state->state_callback_received[OP_SEND_MESSAGE] = false;
-      cronet_bidirectional_stream_write(s->cbs, "", 0, true);
+      bidirectional_stream_write(s->cbs, "", 0, true);
       result = ACTION_TAKEN_WITH_CALLBACK;
     }
     stream_state->state_op_done[OP_SEND_TRAILING_METADATA] = true;
@@ -1044,9 +1037,9 @@
              op_can_be_run(stream_op, stream_state, &oas->state,
                            OP_CANCEL_ERROR)) {
     CRONET_LOG(GPR_DEBUG, "running: %p  OP_CANCEL_ERROR", oas);
-    CRONET_LOG(GPR_DEBUG, "W: cronet_bidirectional_stream_cancel(%p)", s->cbs);
+    CRONET_LOG(GPR_DEBUG, "W: bidirectional_stream_cancel(%p)", s->cbs);
     if (s->cbs) {
-      cronet_bidirectional_stream_cancel(s->cbs);
+      bidirectional_stream_cancel(s->cbs);
       result = ACTION_TAKEN_WITH_CALLBACK;
     } else {
       result = ACTION_TAKEN_NO_CALLBACK;
@@ -1143,18 +1136,17 @@
       header_has_authority(op->send_initial_metadata->list.head)) {
     /* Cronet does not support :authority header field. We cancel the call when
        this field is present in metadata */
-    cronet_bidirectional_stream_header_array header_array;
-    cronet_bidirectional_stream_header *header;
-    cronet_bidirectional_stream cbs;
+    bidirectional_stream_header_array header_array;
+    bidirectional_stream_header *header;
+    bidirectional_stream cbs;
     CRONET_LOG(GPR_DEBUG,
                ":authority header is provided but not supported;"
                " cancel operations");
     /* Notify application that operation is cancelled by forging trailers */
     header_array.count = 1;
     header_array.capacity = 1;
-    header_array.headers =
-        gpr_malloc(sizeof(cronet_bidirectional_stream_header));
-    header = (cronet_bidirectional_stream_header *)header_array.headers;
+    header_array.headers = gpr_malloc(sizeof(bidirectional_stream_header));
+    header = (bidirectional_stream_header *)header_array.headers;
     header->key = "grpc-status";
     header->value = "1"; /* Return status GRPC_STATUS_CANCELLED */
     cbs.annotation = (void *)s;
diff --git a/src/core/lib/iomgr/ev_epoll_linux.c b/src/core/lib/iomgr/ev_epoll_linux.c
index d6664ae..715d057 100644
--- a/src/core/lib/iomgr/ev_epoll_linux.c
+++ b/src/core/lib/iomgr/ev_epoll_linux.c
@@ -796,7 +796,7 @@
     gpr_atm_rel_store(&p->merged_to, (gpr_atm)q);
     PI_ADD_REF(q, "pi_merge"); /* To account for the new incoming ref from p */
 
-    workqueue_move_items_to_parent(q);
+    workqueue_move_items_to_parent(p);
   }
   /* else if p == q, nothing needs to be done */
 
diff --git a/src/core/lib/iomgr/ev_poll_posix.c b/src/core/lib/iomgr/ev_poll_posix.c
index 5bc5621..9477ac3 100644
--- a/src/core/lib/iomgr/ev_poll_posix.c
+++ b/src/core/lib/iomgr/ev_poll_posix.c
@@ -413,9 +413,7 @@
                       const char *reason) {
   fd->on_done_closure = on_done;
   fd->released = release_fd != NULL;
-  if (!fd->released) {
-    shutdown(fd->fd, SHUT_RDWR);
-  } else {
+  if (fd->released) {
     *release_fd = fd->fd;
   }
   gpr_mu_lock(&fd->mu);
diff --git a/src/core/lib/iomgr/resource_quota.c b/src/core/lib/iomgr/resource_quota.c
index 42a044d..31590cd 100644
--- a/src/core/lib/iomgr/resource_quota.c
+++ b/src/core/lib/iomgr/resource_quota.c
@@ -691,6 +691,11 @@
   return resource_user;
 }
 
+grpc_resource_quota *grpc_resource_user_quota(
+    grpc_resource_user *resource_user) {
+  return resource_user->resource_quota;
+}
+
 static void ru_ref_by(grpc_resource_user *resource_user, gpr_atm amount) {
   GPR_ASSERT(amount > 0);
   GPR_ASSERT(gpr_atm_no_barrier_fetch_add(&resource_user->refs, amount) != 0);
diff --git a/src/core/lib/iomgr/resource_quota.h b/src/core/lib/iomgr/resource_quota.h
index ef286c2..d1127ce 100644
--- a/src/core/lib/iomgr/resource_quota.h
+++ b/src/core/lib/iomgr/resource_quota.h
@@ -88,6 +88,12 @@
 
 grpc_resource_user *grpc_resource_user_create(
     grpc_resource_quota *resource_quota, const char *name);
+
+/* Returns a borrowed reference to the underlying resource quota for this
+   resource user. */
+grpc_resource_quota *grpc_resource_user_quota(
+    grpc_resource_user *resource_user);
+
 void grpc_resource_user_ref(grpc_resource_user *resource_user);
 void grpc_resource_user_unref(grpc_exec_ctx *exec_ctx,
                               grpc_resource_user *resource_user);
diff --git a/src/core/lib/slice/slice_buffer.c b/src/core/lib/slice/slice_buffer.c
index 08eaf49..9176dc8 100644
--- a/src/core/lib/slice/slice_buffer.c
+++ b/src/core/lib/slice/slice_buffer.c
@@ -46,15 +46,27 @@
 #define GROW(x) (3 * (x) / 2)
 
 static void maybe_embiggen(grpc_slice_buffer *sb) {
-  if (sb->count == sb->capacity) {
+  if (sb->base_slices != sb->slices) {
+    memmove(sb->base_slices, sb->slices, sb->count * sizeof(grpc_slice));
+    sb->slices = sb->base_slices;
+  }
+
+  /* How far away from sb->base_slices is sb->slices pointer */
+  size_t slice_offset = (size_t)(sb->slices - sb->base_slices);
+  size_t slice_count = sb->count + slice_offset;
+
+  if (slice_count == sb->capacity) {
     sb->capacity = GROW(sb->capacity);
-    GPR_ASSERT(sb->capacity > sb->count);
-    if (sb->slices == sb->inlined) {
-      sb->slices = gpr_malloc(sb->capacity * sizeof(grpc_slice));
-      memcpy(sb->slices, sb->inlined, sb->count * sizeof(grpc_slice));
+    GPR_ASSERT(sb->capacity > slice_count);
+    if (sb->base_slices == sb->inlined) {
+      sb->base_slices = gpr_malloc(sb->capacity * sizeof(grpc_slice));
+      memcpy(sb->base_slices, sb->inlined, slice_count * sizeof(grpc_slice));
     } else {
-      sb->slices = gpr_realloc(sb->slices, sb->capacity * sizeof(grpc_slice));
+      sb->base_slices =
+          gpr_realloc(sb->base_slices, sb->capacity * sizeof(grpc_slice));
     }
+
+    sb->slices = sb->base_slices + slice_offset;
   }
 }
 
@@ -62,14 +74,14 @@
   sb->count = 0;
   sb->length = 0;
   sb->capacity = GRPC_SLICE_BUFFER_INLINE_ELEMENTS;
-  sb->slices = sb->inlined;
+  sb->base_slices = sb->slices = sb->inlined;
 }
 
 void grpc_slice_buffer_destroy_internal(grpc_exec_ctx *exec_ctx,
                                         grpc_slice_buffer *sb) {
   grpc_slice_buffer_reset_and_unref_internal(exec_ctx, sb);
-  if (sb->slices != sb->inlined) {
-    gpr_free(sb->slices);
+  if (sb->base_slices != sb->inlined) {
+    gpr_free(sb->base_slices);
   }
 }
 
@@ -166,7 +178,6 @@
 void grpc_slice_buffer_reset_and_unref_internal(grpc_exec_ctx *exec_ctx,
                                                 grpc_slice_buffer *sb) {
   size_t i;
-
   for (i = 0; i < sb->count; i++) {
     grpc_slice_unref_internal(exec_ctx, sb->slices[i]);
   }
@@ -182,32 +193,45 @@
 }
 
 void grpc_slice_buffer_swap(grpc_slice_buffer *a, grpc_slice_buffer *b) {
+  size_t a_offset = (size_t)(a->slices - a->base_slices);
+  size_t b_offset = (size_t)(b->slices - b->base_slices);
+
+  size_t a_count = a->count + a_offset;
+  size_t b_count = b->count + b_offset;
+
+  if (a->base_slices == a->inlined) {
+    if (b->base_slices == b->inlined) {
+      /* swap contents of inlined buffer */
+      grpc_slice temp[GRPC_SLICE_BUFFER_INLINE_ELEMENTS];
+      memcpy(temp, a->base_slices, a_count * sizeof(grpc_slice));
+      memcpy(a->base_slices, b->base_slices, b_count * sizeof(grpc_slice));
+      memcpy(b->base_slices, temp, a_count * sizeof(grpc_slice));
+    } else {
+      /* a is inlined, b is not - copy a inlined into b, fix pointers */
+      a->base_slices = b->base_slices;
+      b->base_slices = b->inlined;
+      memcpy(b->base_slices, a->inlined, a_count * sizeof(grpc_slice));
+    }
+  } else if (b->base_slices == b->inlined) {
+    /* b is inlined, a is not - copy b inlined int a, fix pointers */
+    b->base_slices = a->base_slices;
+    a->base_slices = a->inlined;
+    memcpy(a->base_slices, b->inlined, b_count * sizeof(grpc_slice));
+  } else {
+    /* no inlining: easy swap */
+    GPR_SWAP(grpc_slice *, a->base_slices, b->base_slices);
+  }
+
+  /* Update the slices pointers (cannot do a GPR_SWAP on slices fields here).
+   * Also note that since the base_slices pointers are already swapped we need
+   * use 'b_offset' for 'a->base_slices' and vice versa */
+  a->slices = a->base_slices + b_offset;
+  b->slices = b->base_slices + a_offset;
+
+  /* base_slices and slices fields are correctly set. Swap all other fields */
   GPR_SWAP(size_t, a->count, b->count);
   GPR_SWAP(size_t, a->capacity, b->capacity);
   GPR_SWAP(size_t, a->length, b->length);
-
-  if (a->slices == a->inlined) {
-    if (b->slices == b->inlined) {
-      /* swap contents of inlined buffer */
-      grpc_slice temp[GRPC_SLICE_BUFFER_INLINE_ELEMENTS];
-      memcpy(temp, a->slices, b->count * sizeof(grpc_slice));
-      memcpy(a->slices, b->slices, a->count * sizeof(grpc_slice));
-      memcpy(b->slices, temp, b->count * sizeof(grpc_slice));
-    } else {
-      /* a is inlined, b is not - copy a inlined into b, fix pointers */
-      a->slices = b->slices;
-      b->slices = b->inlined;
-      memcpy(b->slices, a->inlined, b->count * sizeof(grpc_slice));
-    }
-  } else if (b->slices == b->inlined) {
-    /* b is inlined, a is not - copy b inlined int a, fix pointers */
-    b->slices = a->slices;
-    a->slices = a->inlined;
-    memcpy(a->slices, b->inlined, a->count * sizeof(grpc_slice));
-  } else {
-    /* no inlining: easy swap */
-    GPR_SWAP(grpc_slice *, a->slices, b->slices);
-  }
 }
 
 void grpc_slice_buffer_move_into(grpc_slice_buffer *src,
@@ -229,7 +253,6 @@
 
 void grpc_slice_buffer_move_first(grpc_slice_buffer *src, size_t n,
                                   grpc_slice_buffer *dst) {
-  size_t src_idx;
   size_t output_len = dst->length + n;
   size_t new_input_len = src->length - n;
   GPR_ASSERT(src->length >= n);
@@ -237,34 +260,55 @@
     grpc_slice_buffer_move_into(src, dst);
     return;
   }
-  src_idx = 0;
-  while (src_idx < src->capacity) {
-    grpc_slice slice = src->slices[src_idx];
+
+  while (src->count > 0) {
+    grpc_slice slice = grpc_slice_buffer_take_first(src);
     size_t slice_len = GRPC_SLICE_LENGTH(slice);
     if (n > slice_len) {
       grpc_slice_buffer_add(dst, slice);
       n -= slice_len;
-      src_idx++;
     } else if (n == slice_len) {
       grpc_slice_buffer_add(dst, slice);
-      src_idx++;
       break;
     } else { /* n < slice_len */
-      src->slices[src_idx] = grpc_slice_split_tail(&slice, n);
+      grpc_slice_buffer_undo_take_first(src, grpc_slice_split_tail(&slice, n));
       GPR_ASSERT(GRPC_SLICE_LENGTH(slice) == n);
-      GPR_ASSERT(GRPC_SLICE_LENGTH(src->slices[src_idx]) == slice_len - n);
       grpc_slice_buffer_add(dst, slice);
       break;
     }
   }
   GPR_ASSERT(dst->length == output_len);
-  memmove(src->slices, src->slices + src_idx,
-          sizeof(grpc_slice) * (src->count - src_idx));
-  src->count -= src_idx;
-  src->length = new_input_len;
+  GPR_ASSERT(src->length == new_input_len);
   GPR_ASSERT(src->count > 0);
 }
 
+void grpc_slice_buffer_move_first_into_buffer(grpc_exec_ctx *exec_ctx,
+                                              grpc_slice_buffer *src, size_t n,
+                                              void *dst) {
+  char *dstp = dst;
+  GPR_ASSERT(src->length >= n);
+
+  while (n > 0) {
+    grpc_slice slice = grpc_slice_buffer_take_first(src);
+    size_t slice_len = GRPC_SLICE_LENGTH(slice);
+    if (slice_len > n) {
+      memcpy(dstp, GRPC_SLICE_START_PTR(slice), n);
+      grpc_slice_buffer_undo_take_first(
+          src, grpc_slice_sub_no_ref(slice, n, slice_len));
+      n = 0;
+    } else if (slice_len == n) {
+      memcpy(dstp, GRPC_SLICE_START_PTR(slice), n);
+      grpc_slice_unref_internal(exec_ctx, slice);
+      n = 0;
+    } else {
+      memcpy(dstp, GRPC_SLICE_START_PTR(slice), slice_len);
+      dstp += slice_len;
+      n -= slice_len;
+      grpc_slice_unref_internal(exec_ctx, slice);
+    }
+  }
+}
+
 void grpc_slice_buffer_trim_end(grpc_slice_buffer *sb, size_t n,
                                 grpc_slice_buffer *garbage) {
   GPR_ASSERT(n <= sb->length);
@@ -293,8 +337,17 @@
   grpc_slice slice;
   GPR_ASSERT(sb->count > 0);
   slice = sb->slices[0];
-  memmove(&sb->slices[0], &sb->slices[1], (sb->count - 1) * sizeof(grpc_slice));
+  sb->slices++;
   sb->count--;
   sb->length -= GRPC_SLICE_LENGTH(slice);
+
   return slice;
 }
+
+void grpc_slice_buffer_undo_take_first(grpc_slice_buffer *sb,
+                                       grpc_slice slice) {
+  sb->slices--;
+  sb->slices[0] = slice;
+  sb->count++;
+  sb->length += GRPC_SLICE_LENGTH(slice);
+}
diff --git a/src/cpp/common/channel_arguments.cc b/src/cpp/common/channel_arguments.cc
index 1fdd106..65f3277 100644
--- a/src/cpp/common/channel_arguments.cc
+++ b/src/cpp/common/channel_arguments.cc
@@ -143,6 +143,14 @@
                        grpc_resource_quota_arg_vtable());
 }
 
+void ChannelArguments::SetMaxReceiveMessageSize(int size) {
+  SetInt(GRPC_ARG_MAX_RECEIVE_MESSAGE_LENGTH, size);
+}
+
+void ChannelArguments::SetMaxSendMessageSize(int size) {
+  SetInt(GRPC_ARG_MAX_SEND_MESSAGE_LENGTH, size);
+}
+
 void ChannelArguments::SetLoadBalancingPolicyName(
     const grpc::string& lb_policy_name) {
   SetString(GRPC_ARG_LB_POLICY_NAME, lb_policy_name);
diff --git a/src/node/ext/call_credentials.cc b/src/node/ext/call_credentials.cc
index 81fc552..41f6c29 100644
--- a/src/node/ext/call_credentials.cc
+++ b/src/node/ext/call_credentials.cc
@@ -35,7 +35,7 @@
 #include <nan.h>
 #include <uv.h>
 
-#include <list>
+#include <queue>
 
 #include "grpc/grpc.h"
 #include "grpc/grpc_security.h"
@@ -170,7 +170,7 @@
   grpc_metadata_credentials_plugin plugin;
   plugin_state *state = new plugin_state;
   state->callback = new Nan::Callback(info[0].As<Function>());
-  state->pending_callbacks = new std::list<plugin_callback_data*>();
+  state->pending_callbacks = new std::queue<plugin_callback_data*>();
   uv_mutex_init(&state->plugin_mutex);
   uv_async_init(uv_default_loop(),
                 &state->plugin_async,
@@ -232,13 +232,13 @@
 NAUV_WORK_CB(SendPluginCallback) {
   Nan::HandleScope scope;
   plugin_state *state = reinterpret_cast<plugin_state*>(async->data);
-  std::list<plugin_callback_data*> callbacks;
+  std::queue<plugin_callback_data*> callbacks;
   uv_mutex_lock(&state->plugin_mutex);
-  callbacks.splice(callbacks.begin(), *state->pending_callbacks);
+  state->pending_callbacks->swap(callbacks);
   uv_mutex_unlock(&state->plugin_mutex);
   while (!callbacks.empty()) {
     plugin_callback_data *data = callbacks.front();
-    callbacks.pop_front();
+    callbacks.pop();
     Local<Object> callback_data = Nan::New<Object>();
     Nan::Set(callback_data, Nan::New("cb").ToLocalChecked(),
              Nan::New<v8::External>(reinterpret_cast<void*>(data->cb)));
@@ -267,7 +267,7 @@
   data->user_data = user_data;
 
   uv_mutex_lock(&p_state->plugin_mutex);
-  p_state->pending_callbacks->push_back(data);
+  p_state->pending_callbacks->push(data);
   uv_mutex_unlock(&p_state->plugin_mutex);
 
   uv_async_send(&p_state->plugin_async);
diff --git a/src/node/ext/call_credentials.h b/src/node/ext/call_credentials.h
index 04c852b..21a4b89 100644
--- a/src/node/ext/call_credentials.h
+++ b/src/node/ext/call_credentials.h
@@ -34,7 +34,7 @@
 #ifndef GRPC_NODE_CALL_CREDENTIALS_H_
 #define GRPC_NODE_CALL_CREDENTIALS_H_
 
-#include <list>
+#include <queue>
 
 #include <node.h>
 #include <nan.h>
@@ -84,7 +84,7 @@
 
 typedef struct plugin_state {
   Nan::Callback *callback;
-  std::list<plugin_callback_data*> *pending_callbacks;
+  std::queue<plugin_callback_data*> *pending_callbacks;
   uv_mutex_t plugin_mutex;
   // async.data == this
   uv_async_t plugin_async;
diff --git a/src/node/ext/node_grpc.cc b/src/node/ext/node_grpc.cc
index 9b9eee8..614f2e9 100644
--- a/src/node/ext/node_grpc.cc
+++ b/src/node/ext/node_grpc.cc
@@ -31,7 +31,7 @@
  *
  */
 
-#include <list>
+#include <queue>
 
 #include <node.h>
 #include <nan.h>
@@ -74,7 +74,7 @@
 
 typedef struct logger_state {
   Nan::Callback *callback;
-  std::list<log_args *> *pending_args;
+  std::queue<log_args *> *pending_args;
   uv_mutex_t mutex;
   uv_async_t async;
   // Indicates that a logger has been set
@@ -342,14 +342,14 @@
 
 NAUV_WORK_CB(LogMessagesCallback) {
   Nan::HandleScope scope;
-  std::list<log_args *> args;
+  std::queue<log_args *> args;
   uv_mutex_lock(&grpc_logger_state.mutex);
-  args.splice(args.begin(), *grpc_logger_state.pending_args);
+  grpc_logger_state.pending_args->swap(args);
   uv_mutex_unlock(&grpc_logger_state.mutex);
   /* Call the callback with each log message */
   while (!args.empty()) {
     log_args *arg = args.front();
-    args.pop_front();
+    args.pop();
     Local<Value> file = Nan::New(arg->core_args.file).ToLocalChecked();
     Local<Value> line = Nan::New<Uint32, uint32_t>(arg->core_args.line);
     Local<Value> severity = Nan::New(
@@ -376,7 +376,7 @@
   args_copy->timestamp = gpr_now(GPR_CLOCK_REALTIME);
 
   uv_mutex_lock(&grpc_logger_state.mutex);
-  grpc_logger_state.pending_args->push_back(args_copy);
+  grpc_logger_state.pending_args->push(args_copy);
   uv_mutex_unlock(&grpc_logger_state.mutex);
 
   uv_async_send(&grpc_logger_state.async);
@@ -384,7 +384,7 @@
 
 void init_logger() {
   memset(&grpc_logger_state, 0, sizeof(logger_state));
-  grpc_logger_state.pending_args = new std::list<log_args *>();
+  grpc_logger_state.pending_args = new std::queue<log_args *>();
   uv_mutex_init(&grpc_logger_state.mutex);
   uv_async_init(uv_default_loop(),
                 &grpc_logger_state.async,
diff --git a/src/objective-c/CronetFramework.podspec b/src/objective-c/CronetFramework.podspec
index 2f47b02..509358d 100644
--- a/src/objective-c/CronetFramework.podspec
+++ b/src/objective-c/CronetFramework.podspec
@@ -30,7 +30,8 @@
 
 Pod::Spec.new do |s|
   s.name         = "CronetFramework"
-  s.version      = "0.0.3"
+  v = '0.0.4'
+  s.version      = v
   s.summary      = "Cronet, precompiled and used as a framework."
   s.homepage     = "http://chromium.org"
   s.license      = {
@@ -69,7 +70,7 @@
   s.vendored_framework = "Cronet.framework"
   s.author             = "The Chromium Authors"
   s.ios.deployment_target = "8.0"
-  s.source       = { :http => 'https://storage.googleapis.com/grpc-precompiled-binaries/cronet/Cronet.framework.zip' }
+  s.source       = { :http => "https://storage.googleapis.com/grpc-precompiled-binaries/cronet/Cronet.framework-v#{v}.zip"}
   s.preserve_paths = "Cronet.framework"
   s.public_header_files = "Cronet.framework/Headers/**/*{.h}"
   s.source_files = "Cronet.framework/Headers/**/*{.h}"
diff --git a/src/objective-c/GRPCClient/GRPCCall+Cronet.h b/src/objective-c/GRPCClient/GRPCCall+Cronet.h
index 2d8f7ac..b9d286c 100644
--- a/src/objective-c/GRPCClient/GRPCCall+Cronet.h
+++ b/src/objective-c/GRPCClient/GRPCCall+Cronet.h
@@ -43,13 +43,13 @@
 /**
  * This method should be called before issuing the first RPC. It should be
  * called only once. Create an instance of Cronet engine in your app elsewhere
- * and pass the instance pointer in the cronet_engine parameter. Once set,
+ * and pass the instance pointer in the stream_engine parameter. Once set,
  * all subsequent RPCs will use Cronet transport. The method is not thread
  * safe.
  */
-+(void)useCronetWithEngine:(cronet_engine *)engine;
++(void)useCronetWithEngine:(stream_engine *)engine;
 
-+(cronet_engine *)cronetEngine;
++(stream_engine *)cronetEngine;
 
 +(BOOL)isUsingCronet;
 
diff --git a/src/objective-c/GRPCClient/GRPCCall+Cronet.m b/src/objective-c/GRPCClient/GRPCCall+Cronet.m
index 76ca1a2..0e3598f 100644
--- a/src/objective-c/GRPCClient/GRPCCall+Cronet.m
+++ b/src/objective-c/GRPCClient/GRPCCall+Cronet.m
@@ -35,16 +35,16 @@
 
 #ifdef GRPC_COMPILE_WITH_CRONET
 static BOOL useCronet = NO;
-static cronet_engine *globalCronetEngine;
+static stream_engine *globalCronetEngine;
 
 @implementation GRPCCall (Cronet)
 
-+ (void)useCronetWithEngine:(cronet_engine *)engine {
++ (void)useCronetWithEngine:(stream_engine *)engine {
   useCronet = YES;
   globalCronetEngine = engine;
 }
 
-+ (cronet_engine *)cronetEngine {
++ (stream_engine *)cronetEngine {
   return globalCronetEngine;
 }
 
diff --git a/src/objective-c/GRPCClient/private/GRPCChannel.m b/src/objective-c/GRPCClient/private/GRPCChannel.m
index e49acee..2397c92 100644
--- a/src/objective-c/GRPCClient/private/GRPCChannel.m
+++ b/src/objective-c/GRPCClient/private/GRPCChannel.m
@@ -108,7 +108,7 @@
 
 #ifdef GRPC_COMPILE_WITH_CRONET
 - (instancetype)initWithHost:(NSString *)host
-                cronetEngine:(cronet_engine *)cronetEngine
+                cronetEngine:(stream_engine *)cronetEngine
                  channelArgs:(NSDictionary *)channelArgs {
   if (!host) {
     [NSException raise:NSInvalidArgumentException format:@"host argument missing"];
@@ -163,7 +163,7 @@
 #ifdef GRPC_COMPILE_WITH_CRONET
 + (GRPCChannel *)secureCronetChannelWithHost:(NSString *)host
                                  channelArgs:(NSDictionary *)channelArgs {
-  cronet_engine *engine = [GRPCCall cronetEngine];
+  stream_engine *engine = [GRPCCall cronetEngine];
   if (!engine) {
     [NSException raise:NSInvalidArgumentException
                 format:@"cronet_engine is NULL. Set it first."];
diff --git a/src/objective-c/tests/CoreCronetEnd2EndTests/CoreCronetEnd2EndTests.m b/src/objective-c/tests/CoreCronetEnd2EndTests/CoreCronetEnd2EndTests.m
index 4ba7bad..01612a8 100644
--- a/src/objective-c/tests/CoreCronetEnd2EndTests/CoreCronetEnd2EndTests.m
+++ b/src/objective-c/tests/CoreCronetEnd2EndTests/CoreCronetEnd2EndTests.m
@@ -94,7 +94,7 @@
 
 static void cronet_init_client_secure_fullstack(grpc_end2end_test_fixture *f,
                                                 grpc_channel_args *client_args,
-                                                cronet_engine *cronetEngine) {
+                                                stream_engine *cronetEngine) {
   fullstack_secure_fixture_data *ffd = f->fixture_data;
   f->client = grpc_cronet_secure_channel_create(cronetEngine, ffd->localaddr,
                                                 client_args, NULL);
@@ -124,11 +124,13 @@
 
 static void cronet_init_client_simple_ssl_secure_fullstack(
     grpc_end2end_test_fixture *f, grpc_channel_args *client_args) {
-  cronet_engine *cronetEngine = [Cronet getGlobalEngine];
+  grpc_exec_ctx ctx = GRPC_EXEC_CTX_INIT;
+  stream_engine *cronetEngine = [Cronet getGlobalEngine];
 
   grpc_channel_args *new_client_args = grpc_channel_args_copy(client_args);
   cronet_init_client_secure_fullstack(f, new_client_args, cronetEngine);
-  grpc_channel_args_destroy(new_client_args);
+  grpc_channel_args_destroy(&ctx, new_client_args);
+  grpc_exec_ctx_finish(&ctx);
 }
 
 static int fail_server_auth_check(grpc_channel_args *server_args) {
diff --git a/src/objective-c/tests/CronetUnitTests/CronetUnitTests.m b/src/objective-c/tests/CronetUnitTests/CronetUnitTests.m
new file mode 100644
index 0000000..dbd2807
--- /dev/null
+++ b/src/objective-c/tests/CronetUnitTests/CronetUnitTests.m
@@ -0,0 +1,214 @@
+/*
+ *
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#import <XCTest/XCTest.h>
+#import <sys/socket.h>
+#import <netinet/in.h>
+
+#import <Cronet/Cronet.h>
+#import <grpc/support/host_port.h>
+#import <grpc/grpc_cronet.h>
+#import <grpc/grpc.h>
+#import "test/core/end2end/cq_verifier.h"
+#import "test/core/util/port.h"
+
+#import <grpc/support/alloc.h>
+#import <grpc/support/log.h>
+
+#import "src/core/lib/channel/channel_args.h"
+#import "src/core/lib/support/env.h"
+#import "src/core/lib/support/string.h"
+#import "src/core/lib/support/tmpfile.h"
+#import "test/core/util/test_config.h"
+
+static void drain_cq(grpc_completion_queue *cq) {
+  grpc_event ev;
+  do {
+    ev = grpc_completion_queue_next(cq, GRPC_TIMEOUT_SECONDS_TO_DEADLINE(5), NULL);
+  } while (ev.type != GRPC_QUEUE_SHUTDOWN);
+}
+
+
+@interface CronetUnitTests : XCTestCase
+
+@end
+
+@implementation CronetUnitTests
+
++ (void)setUp {
+  [super setUp];
+
+/***  FILE *roots_file;
+  size_t roots_size = strlen(test_root_cert);*/
+
+  char *argv[] = {"CoreCronetEnd2EndTests"};
+  grpc_test_init(1, argv);
+
+  grpc_init();
+
+  [Cronet setHttp2Enabled:YES];
+  NSURL *url = [[[NSFileManager defaultManager]
+                 URLsForDirectory:NSDocumentDirectory
+                 inDomains:NSUserDomainMask] lastObject];
+  NSLog(@"Documents directory: %@", url);
+  [Cronet start];
+  [Cronet startNetLogToFile:@"Documents/cronet_netlog.json" logBytes:YES];
+}
+
++ (void)tearDown {
+  grpc_shutdown();
+
+  [super tearDown];
+}
+
+- (void)testInternalError {
+  grpc_call *c;
+  grpc_slice request_payload_slice =
+  grpc_slice_from_copied_string("hello world");
+  grpc_byte_buffer *request_payload =
+  grpc_raw_byte_buffer_create(&request_payload_slice, 1);
+  gpr_timespec deadline = GRPC_TIMEOUT_SECONDS_TO_DEADLINE(5);
+  grpc_metadata meta_c[2] = {
+    {"key1", "val1", 4, 0, {{NULL, NULL, NULL, NULL}}},
+    {"key2", "val2", 4, 0, {{NULL, NULL, NULL, NULL}}}};
+
+  int port = grpc_pick_unused_port_or_die();
+  char *addr;
+  gpr_join_host_port(&addr, "127.0.0.1", port);
+  grpc_completion_queue *cq = grpc_completion_queue_create(NULL);
+  cronet_engine *cronetEngine = [Cronet getGlobalEngine];
+  grpc_channel *client = grpc_cronet_secure_channel_create(cronetEngine, addr,
+                                                           NULL, NULL);
+
+  cq_verifier *cqv = cq_verifier_create(cq);
+  grpc_op ops[6];
+  grpc_op *op;
+  grpc_metadata_array initial_metadata_recv;
+  grpc_metadata_array trailing_metadata_recv;
+  grpc_metadata_array request_metadata_recv;
+  grpc_byte_buffer *response_payload_recv = NULL;
+  grpc_call_details call_details;
+  grpc_status_code status;
+  grpc_call_error error;
+  char *details = NULL;
+  size_t details_capacity = 0;
+
+  c = grpc_channel_create_call(
+                               client, NULL, GRPC_PROPAGATE_DEFAULTS, cq, "/foo",
+                               NULL, deadline, NULL);
+  GPR_ASSERT(c);
+
+  grpc_metadata_array_init(&initial_metadata_recv);
+  grpc_metadata_array_init(&trailing_metadata_recv);
+  grpc_metadata_array_init(&request_metadata_recv);
+  grpc_call_details_init(&call_details);
+
+  memset(ops, 0, sizeof(ops));
+  op = ops;
+  op->op = GRPC_OP_SEND_INITIAL_METADATA;
+  op->data.send_initial_metadata.count = 2;
+  op->data.send_initial_metadata.metadata = meta_c;
+  op->flags = 0;
+  op->reserved = NULL;
+  op++;
+  op->op = GRPC_OP_SEND_MESSAGE;
+  op->data.send_message = request_payload;
+  op->flags = 0;
+  op->reserved = NULL;
+  op++;
+  op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
+  op->flags = 0;
+  op->reserved = NULL;
+  op++;
+  op->op = GRPC_OP_RECV_INITIAL_METADATA;
+  op->data.recv_initial_metadata = &initial_metadata_recv;
+  op->flags = 0;
+  op->reserved = NULL;
+  op++;
+  op->op = GRPC_OP_RECV_MESSAGE;
+  op->data.recv_message = &response_payload_recv;
+  op->flags = 0;
+  op->reserved = NULL;
+  op++;
+  op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
+  op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv;
+  op->data.recv_status_on_client.status = &status;
+  op->data.recv_status_on_client.status_details = &details;
+  op->data.recv_status_on_client.status_details_capacity = &details_capacity;
+  op->flags = 0;
+  op->reserved = NULL;
+  op++;
+  error = grpc_call_start_batch(c, ops, (size_t)(op - ops), (void*)1, NULL);
+  GPR_ASSERT(GRPC_CALL_OK == error);
+
+  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+    int sl = socket(AF_INET, SOCK_STREAM, 0);
+    GPR_ASSERT(sl >= 0);
+    struct sockaddr_in s_addr;
+    memset(&s_addr, 0, sizeof(s_addr));
+    s_addr.sin_family = AF_INET;
+    s_addr.sin_addr.s_addr = htonl(INADDR_ANY);
+    s_addr.sin_port = htons(port);
+    bind(sl, (struct sockaddr*)&s_addr, sizeof(s_addr));
+    listen(sl, 5);
+    int s = accept(sl, NULL, NULL);
+    sleep(1);
+    close(s);
+    close(sl);
+  });
+
+  CQ_EXPECT_COMPLETION(cqv, (void*)1, 1);
+  cq_verify(cqv);
+
+  GPR_ASSERT(status == GRPC_STATUS_UNAVAILABLE);
+
+  gpr_free(details);
+  grpc_metadata_array_destroy(&initial_metadata_recv);
+  grpc_metadata_array_destroy(&trailing_metadata_recv);
+  grpc_metadata_array_destroy(&request_metadata_recv);
+  grpc_call_details_destroy(&call_details);
+
+  grpc_call_destroy(c);
+
+  cq_verifier_destroy(cqv);
+
+  grpc_byte_buffer_destroy(request_payload);
+  grpc_byte_buffer_destroy(response_payload_recv);
+  
+  grpc_channel_destroy(client);
+  grpc_completion_queue_shutdown(cq);
+  drain_cq(cq);
+  grpc_completion_queue_destroy(cq);
+}
+
+@end
diff --git a/src/objective-c/tests/CronetUnitTests/Info.plist b/src/objective-c/tests/CronetUnitTests/Info.plist
new file mode 100644
index 0000000..ba72822
--- /dev/null
+++ b/src/objective-c/tests/CronetUnitTests/Info.plist
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>en</string>
+	<key>CFBundleExecutable</key>
+	<string>$(EXECUTABLE_NAME)</string>
+	<key>CFBundleIdentifier</key>
+	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>$(PRODUCT_NAME)</string>
+	<key>CFBundlePackageType</key>
+	<string>BNDL</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.0</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>1</string>
+</dict>
+</plist>
diff --git a/src/objective-c/tests/Podfile b/src/objective-c/tests/Podfile
index 5785b97..3760330 100644
--- a/src/objective-c/tests/Podfile
+++ b/src/objective-c/tests/Podfile
@@ -37,13 +37,18 @@
   end
 end
 
-target 'CoreCronetEnd2EndTests' do
-  pod 'BoringSSL', :podspec => "#{GRPC_LOCAL_SRC}/src/objective-c", :inhibit_warnings => true
-  pod 'CronetFramework', :podspec => "#{GRPC_LOCAL_SRC}/src/objective-c"
-  pod 'gRPC-Core', :path => GRPC_LOCAL_SRC
-  pod 'gRPC-Core/Cronet-Interface', :path => GRPC_LOCAL_SRC
-  pod 'gRPC-Core/Cronet-Implementation', :path => GRPC_LOCAL_SRC
-  pod 'gRPC-Core/Tests', :path => GRPC_LOCAL_SRC
+%w(
+  CoreCronetEnd2EndTests
+  CronetUnitTests
+).each do |target_name|
+  target target_name do
+    pod 'BoringSSL', :podspec => "#{GRPC_LOCAL_SRC}/src/objective-c", :inhibit_warnings => true
+    pod 'CronetFramework', :podspec => "#{GRPC_LOCAL_SRC}/src/objective-c"
+    pod 'gRPC-Core', :path => GRPC_LOCAL_SRC
+    pod 'gRPC-Core/Cronet-Interface', :path => GRPC_LOCAL_SRC
+    pod 'gRPC-Core/Cronet-Implementation', :path => GRPC_LOCAL_SRC
+    pod 'gRPC-Core/Tests', :path => GRPC_LOCAL_SRC
+  end
 end
 
 # gRPC-Core.podspec needs to be modified to be successfully used for local development. A Podfile's
diff --git a/src/objective-c/tests/Tests.xcodeproj/project.pbxproj b/src/objective-c/tests/Tests.xcodeproj/project.pbxproj
index c4a6567..4a6b332 100644
--- a/src/objective-c/tests/Tests.xcodeproj/project.pbxproj
+++ b/src/objective-c/tests/Tests.xcodeproj/project.pbxproj
@@ -7,6 +7,7 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
+		06467F3A8D01EC493D12ADA2 /* libPods-CronetUnitTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C6134277D2EB8B380862A03F /* libPods-CronetUnitTests.a */; };
 		09B76D9585ACE7403804D9DC /* libPods-InteropTestsRemoteWithCronet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9E9444C764F0FFF64A7EB58E /* libPods-InteropTestsRemoteWithCronet.a */; };
 		0F9232F984C08643FD40C34F /* libPods-InteropTestsRemote.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DBE059B4AC7A51919467EEC0 /* libPods-InteropTestsRemote.a */; };
 		16A9E77B6E336B3C0B9BA6E0 /* libPods-InteropTestsLocalSSL.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DBEDE45BDA60DF1E1C8950C0 /* libPods-InteropTestsLocalSSL.a */; };
@@ -15,6 +16,8 @@
 		3D7C85F6AA68C4A205E3BA16 /* libPods-Tests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 20DFF2F3C97EF098FE5A3171 /* libPods-Tests.a */; };
 		5E8A5DA71D3840B4000F8BC4 /* CoreCronetEnd2EndTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 5E8A5DA61D3840B4000F8BC4 /* CoreCronetEnd2EndTests.m */; };
 		5E8A5DA91D3840B4000F8BC4 /* libTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 635697C71B14FC11007A7283 /* libTests.a */; };
+		5EAD6D271E27047400002378 /* CronetUnitTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 5EAD6D261E27047400002378 /* CronetUnitTests.m */; };
+		5EAD6D291E27047400002378 /* libTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 635697C71B14FC11007A7283 /* libTests.a */; };
 		5EE84BF41D4717E40050C6CC /* InteropTestsRemoteWithCronet.m in Sources */ = {isa = PBXBuildFile; fileRef = 5EE84BF31D4717E40050C6CC /* InteropTestsRemoteWithCronet.m */; };
 		5EE84BF61D4717E40050C6CC /* libTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 635697C71B14FC11007A7283 /* libTests.a */; };
 		5EE84BFE1D471D400050C6CC /* InteropTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 635ED2EB1B1A3BC400FDE5C3 /* InteropTests.m */; };
@@ -52,6 +55,13 @@
 			remoteGlobalIDString = 635697C61B14FC11007A7283;
 			remoteInfo = Tests;
 		};
+		5EAD6D2A1E27047400002378 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 635697BF1B14FC11007A7283 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 635697C61B14FC11007A7283;
+			remoteInfo = Tests;
+		};
 		5EE84BF71D4717E40050C6CC /* PBXContainerItemProxy */ = {
 			isa = PBXContainerItemProxy;
 			containerPortal = 635697BF1B14FC11007A7283 /* Project object */;
@@ -109,6 +119,7 @@
 /* End PBXCopyFilesBuildPhase section */
 
 /* Begin PBXFileReference section */
+		02192CF1FF9534E3D18C65FC /* Pods-CronetUnitTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CronetUnitTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-CronetUnitTests/Pods-CronetUnitTests.release.xcconfig"; sourceTree = "<group>"; };
 		060EF32D7EC0DF67ED617507 /* Pods-Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Tests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Tests/Pods-Tests.debug.xcconfig"; sourceTree = "<group>"; };
 		07D10A965323BEA7FE59A74B /* Pods-RxLibraryUnitTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RxLibraryUnitTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-RxLibraryUnitTests/Pods-RxLibraryUnitTests.debug.xcconfig"; sourceTree = "<group>"; };
 		0A4F89D9C90E9C30990218F0 /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = "<group>"; };
@@ -117,6 +128,7 @@
 		17F60BF2871F6AF85FB3FA12 /* Pods-InteropTestsRemoteWithCronet.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-InteropTestsRemoteWithCronet.debug.xcconfig"; path = "Pods/Target Support Files/Pods-InteropTestsRemoteWithCronet/Pods-InteropTestsRemoteWithCronet.debug.xcconfig"; sourceTree = "<group>"; };
 		20DFF2F3C97EF098FE5A3171 /* libPods-Tests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Tests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
 		35F2B6BF3BAE8F0DC4AFD76E /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; };
+		386712AEACF7C2190C4B8B3F /* Pods-CronetUnitTests.cronet.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CronetUnitTests.cronet.xcconfig"; path = "Pods/Target Support Files/Pods-CronetUnitTests/Pods-CronetUnitTests.cronet.xcconfig"; sourceTree = "<group>"; };
 		3B0861FC805389C52DB260D4 /* Pods-RxLibraryUnitTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RxLibraryUnitTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-RxLibraryUnitTests/Pods-RxLibraryUnitTests.release.xcconfig"; sourceTree = "<group>"; };
 		3F27B2E744482771EB93C394 /* Pods-InteropTestsRemoteWithCronet.cronet.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-InteropTestsRemoteWithCronet.cronet.xcconfig"; path = "Pods/Target Support Files/Pods-InteropTestsRemoteWithCronet/Pods-InteropTestsRemoteWithCronet.cronet.xcconfig"; sourceTree = "<group>"; };
 		4AD97096D13D7416DC91A72A /* Pods-CoreCronetEnd2EndTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CoreCronetEnd2EndTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-CoreCronetEnd2EndTests/Pods-CoreCronetEnd2EndTests.release.xcconfig"; sourceTree = "<group>"; };
@@ -127,6 +139,9 @@
 		5761E98978DDDF136A58CB7E /* Pods-AllTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AllTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-AllTests/Pods-AllTests.release.xcconfig"; sourceTree = "<group>"; };
 		5E8A5DA41D3840B4000F8BC4 /* CoreCronetEnd2EndTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CoreCronetEnd2EndTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
 		5E8A5DA61D3840B4000F8BC4 /* CoreCronetEnd2EndTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CoreCronetEnd2EndTests.m; sourceTree = "<group>"; };
+		5EAD6D241E27047400002378 /* CronetUnitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CronetUnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+		5EAD6D261E27047400002378 /* CronetUnitTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CronetUnitTests.m; sourceTree = "<group>"; };
+		5EAD6D281E27047400002378 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 		5EE84BF11D4717E40050C6CC /* InteropTestsRemoteWithCronet.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = InteropTestsRemoteWithCronet.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
 		5EE84BF31D4717E40050C6CC /* InteropTestsRemoteWithCronet.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = InteropTestsRemoteWithCronet.m; sourceTree = "<group>"; };
 		5EE84BF51D4717E40050C6CC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
@@ -146,6 +161,7 @@
 		63E240CC1B6C4D3A005F3B0E /* InteropTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InteropTests.h; sourceTree = "<group>"; };
 		63E240CD1B6C4E2B005F3B0E /* InteropTestsLocalSSL.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = InteropTestsLocalSSL.m; sourceTree = "<group>"; };
 		63E240CF1B6C63DC005F3B0E /* TestCertificates.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = TestCertificates.bundle; sourceTree = "<group>"; };
+		64F68A9A6A63CC930DD30A6E /* Pods-CronetUnitTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CronetUnitTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-CronetUnitTests/Pods-CronetUnitTests.debug.xcconfig"; sourceTree = "<group>"; };
 		79C68EFFCB5533475D810B79 /* Pods-RxLibraryUnitTests.cronet.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RxLibraryUnitTests.cronet.xcconfig"; path = "Pods/Target Support Files/Pods-RxLibraryUnitTests/Pods-RxLibraryUnitTests.cronet.xcconfig"; sourceTree = "<group>"; };
 		7A2E97E3F469CC2A758D77DE /* Pods-InteropTestsLocalSSL.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-InteropTestsLocalSSL.release.xcconfig"; path = "Pods/Target Support Files/Pods-InteropTestsLocalSSL/Pods-InteropTestsLocalSSL.release.xcconfig"; sourceTree = "<group>"; };
 		9E9444C764F0FFF64A7EB58E /* libPods-InteropTestsRemoteWithCronet.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-InteropTestsRemoteWithCronet.a"; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -153,6 +169,7 @@
 		AA7CB64B4DD9915AE7C03163 /* Pods-InteropTestsLocalCleartext.cronet.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-InteropTestsLocalCleartext.cronet.xcconfig"; path = "Pods/Target Support Files/Pods-InteropTestsLocalCleartext/Pods-InteropTestsLocalCleartext.cronet.xcconfig"; sourceTree = "<group>"; };
 		AC414EF7A6BF76ED02B6E480 /* Pods-InteropTestsRemoteWithCronet.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-InteropTestsRemoteWithCronet.release.xcconfig"; path = "Pods/Target Support Files/Pods-InteropTestsRemoteWithCronet/Pods-InteropTestsRemoteWithCronet.release.xcconfig"; sourceTree = "<group>"; };
 		B94C27C06733CF98CE1B2757 /* Pods-AllTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AllTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-AllTests/Pods-AllTests.debug.xcconfig"; sourceTree = "<group>"; };
+		C6134277D2EB8B380862A03F /* libPods-CronetUnitTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-CronetUnitTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
 		CAE086D5B470DA367D415AB0 /* libPods-AllTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-AllTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
 		DBE059B4AC7A51919467EEC0 /* libPods-InteropTestsRemote.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-InteropTestsRemote.a"; sourceTree = BUILT_PRODUCTS_DIR; };
 		DBEDE45BDA60DF1E1C8950C0 /* libPods-InteropTestsLocalSSL.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-InteropTestsLocalSSL.a"; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -177,6 +194,15 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
+		5EAD6D211E27047400002378 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				5EAD6D291E27047400002378 /* libTests.a in Frameworks */,
+				06467F3A8D01EC493D12ADA2 /* libPods-CronetUnitTests.a in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
 		5EE84BEE1D4717E40050C6CC /* Frameworks */ = {
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
@@ -254,6 +280,7 @@
 				20DFF2F3C97EF098FE5A3171 /* libPods-Tests.a */,
 				FBD98AC417B9882D32B19F28 /* libPods-CoreCronetEnd2EndTests.a */,
 				9E9444C764F0FFF64A7EB58E /* libPods-InteropTestsRemoteWithCronet.a */,
+				C6134277D2EB8B380862A03F /* libPods-CronetUnitTests.a */,
 			);
 			name = Frameworks;
 			sourceTree = "<group>";
@@ -287,6 +314,9 @@
 				3F27B2E744482771EB93C394 /* Pods-InteropTestsRemoteWithCronet.cronet.xcconfig */,
 				79C68EFFCB5533475D810B79 /* Pods-RxLibraryUnitTests.cronet.xcconfig */,
 				F671D4CAD2864FB203B920B4 /* Pods-Tests.cronet.xcconfig */,
+				64F68A9A6A63CC930DD30A6E /* Pods-CronetUnitTests.debug.xcconfig */,
+				386712AEACF7C2190C4B8B3F /* Pods-CronetUnitTests.cronet.xcconfig */,
+				02192CF1FF9534E3D18C65FC /* Pods-CronetUnitTests.release.xcconfig */,
 			);
 			name = Pods;
 			sourceTree = "<group>";
@@ -299,6 +329,15 @@
 			path = CoreCronetEnd2EndTests;
 			sourceTree = "<group>";
 		};
+		5EAD6D251E27047400002378 /* CronetUnitTests */ = {
+			isa = PBXGroup;
+			children = (
+				5EAD6D261E27047400002378 /* CronetUnitTests.m */,
+				5EAD6D281E27047400002378 /* Info.plist */,
+			);
+			path = CronetUnitTests;
+			sourceTree = "<group>";
+		};
 		5EE84BF21D4717E40050C6CC /* InteropTestsRemoteWithCronet */ = {
 			isa = PBXGroup;
 			children = (
@@ -315,6 +354,7 @@
 				63E240CF1B6C63DC005F3B0E /* TestCertificates.bundle */,
 				5E8A5DA51D3840B4000F8BC4 /* CoreCronetEnd2EndTests */,
 				5EE84BF21D4717E40050C6CC /* InteropTestsRemoteWithCronet */,
+				5EAD6D251E27047400002378 /* CronetUnitTests */,
 				635697C81B14FC11007A7283 /* Products */,
 				51E4650F34F854F41FF053B3 /* Pods */,
 				136D535E19727099B941D7B1 /* Frameworks */,
@@ -332,6 +372,7 @@
 				63DC84431BE152B5000708E8 /* InteropTestsLocalCleartext.xctest */,
 				5E8A5DA41D3840B4000F8BC4 /* CoreCronetEnd2EndTests.xctest */,
 				5EE84BF11D4717E40050C6CC /* InteropTestsRemoteWithCronet.xctest */,
+				5EAD6D241E27047400002378 /* CronetUnitTests.xctest */,
 			);
 			name = Products;
 			sourceTree = "<group>";
@@ -384,6 +425,27 @@
 			productReference = 5E8A5DA41D3840B4000F8BC4 /* CoreCronetEnd2EndTests.xctest */;
 			productType = "com.apple.product-type.bundle.unit-test";
 		};
+		5EAD6D231E27047400002378 /* CronetUnitTests */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 5EAD6D2F1E27047400002378 /* Build configuration list for PBXNativeTarget "CronetUnitTests" */;
+			buildPhases = (
+				80E2DDD2EC04A4009F45E933 /* [CP] Check Pods Manifest.lock */,
+				5EAD6D201E27047400002378 /* Sources */,
+				5EAD6D211E27047400002378 /* Frameworks */,
+				5EAD6D221E27047400002378 /* Resources */,
+				A686B9967BB4CB81B1CBF8F8 /* [CP] Embed Pods Frameworks */,
+				051806D6A59B19C8A0B76BED /* [CP] Copy Pods Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				5EAD6D2B1E27047400002378 /* PBXTargetDependency */,
+			);
+			name = CronetUnitTests;
+			productName = CronetUnitTests;
+			productReference = 5EAD6D241E27047400002378 /* CronetUnitTests.xctest */;
+			productType = "com.apple.product-type.bundle.unit-test";
+		};
 		5EE84BF01D4717E40050C6CC /* InteropTestsRemoteWithCronet */ = {
 			isa = PBXNativeTarget;
 			buildConfigurationList = 5EE84BFB1D4717E40050C6CC /* Build configuration list for PBXNativeTarget "InteropTestsRemoteWithCronet" */;
@@ -541,6 +603,9 @@
 					5E8A5DA31D3840B4000F8BC4 = {
 						CreatedOnToolsVersion = 7.3.1;
 					};
+					5EAD6D231E27047400002378 = {
+						CreatedOnToolsVersion = 7.3.1;
+					};
 					5EE84BF01D4717E40050C6CC = {
 						CreatedOnToolsVersion = 7.3.1;
 					};
@@ -584,6 +649,7 @@
 				63DC84421BE152B5000708E8 /* InteropTestsLocalCleartext */,
 				5E8A5DA31D3840B4000F8BC4 /* CoreCronetEnd2EndTests */,
 				5EE84BF01D4717E40050C6CC /* InteropTestsRemoteWithCronet */,
+				5EAD6D231E27047400002378 /* CronetUnitTests */,
 			);
 		};
 /* End PBXProject section */
@@ -596,6 +662,13 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
+		5EAD6D221E27047400002378 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
 		5EE84BEF1D4717E40050C6CC /* Resources */ = {
 			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
@@ -643,6 +716,21 @@
 /* End PBXResourcesBuildPhase section */
 
 /* Begin PBXShellScriptBuildPhase section */
+		051806D6A59B19C8A0B76BED /* [CP] Copy Pods Resources */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+			);
+			name = "[CP] Copy Pods Resources";
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-CronetUnitTests/Pods-CronetUnitTests-resources.sh\"\n";
+			showEnvVarsInLog = 0;
+		};
 		31F8D1C407195CBF0C02929B /* [CP] Embed Pods Frameworks */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
@@ -670,7 +758,7 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n    cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n    exit 1\nfi\n";
+			shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n";
 			showEnvVarsInLog = 0;
 		};
 		4F5690DC0E6AD6663FE78B8B /* [CP] Embed Pods Frameworks */ = {
@@ -700,7 +788,7 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n    cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n    exit 1\nfi\n";
+			shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n";
 			showEnvVarsInLog = 0;
 		};
 		5F14F59509E10C2852014F9E /* [CP] Embed Pods Frameworks */ = {
@@ -760,7 +848,7 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n    cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n    exit 1\nfi\n";
+			shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n";
 			showEnvVarsInLog = 0;
 		};
 		796680C7599CB4ED736DD62A /* [CP] Check Pods Manifest.lock */ = {
@@ -775,7 +863,22 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n    cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n    exit 1\nfi\n";
+			shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n";
+			showEnvVarsInLog = 0;
+		};
+		80E2DDD2EC04A4009F45E933 /* [CP] Check Pods Manifest.lock */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+			);
+			name = "[CP] Check Pods Manifest.lock";
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n";
 			showEnvVarsInLog = 0;
 		};
 		8AD3130D3C58A0FB32FF2A36 /* [CP] Copy Pods Resources */ = {
@@ -820,7 +923,7 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n    cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n    exit 1\nfi\n";
+			shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n";
 			showEnvVarsInLog = 0;
 		};
 		A441F71824DCB9D0CA297748 /* [CP] Copy Pods Resources */ = {
@@ -838,6 +941,21 @@
 			shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-AllTests/Pods-AllTests-resources.sh\"\n";
 			showEnvVarsInLog = 0;
 		};
+		A686B9967BB4CB81B1CBF8F8 /* [CP] Embed Pods Frameworks */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+			);
+			name = "[CP] Embed Pods Frameworks";
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-CronetUnitTests/Pods-CronetUnitTests-frameworks.sh\"\n";
+			showEnvVarsInLog = 0;
+		};
 		A8E3AC66DF770B774114A30E /* [CP] Embed Pods Frameworks */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
@@ -880,7 +998,7 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n    cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n    exit 1\nfi\n";
+			shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n";
 			showEnvVarsInLog = 0;
 		};
 		C0F7B1FF6F88CC5FBF362F4C /* [CP] Check Pods Manifest.lock */ = {
@@ -895,7 +1013,7 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n    cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n    exit 1\nfi\n";
+			shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n";
 			showEnvVarsInLog = 0;
 		};
 		C2E09DC4BD239F71160F0CC1 /* [CP] Copy Pods Resources */ = {
@@ -985,7 +1103,7 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n    cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n    exit 1\nfi\n";
+			shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n";
 			showEnvVarsInLog = 0;
 		};
 /* End PBXShellScriptBuildPhase section */
@@ -999,6 +1117,14 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
+		5EAD6D201E27047400002378 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				5EAD6D271E27047400002378 /* CronetUnitTests.m in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
 		5EE84BED1D4717E40050C6CC /* Sources */ = {
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
@@ -1073,6 +1199,11 @@
 			target = 635697C61B14FC11007A7283 /* Tests */;
 			targetProxy = 5E8A5DAA1D3840B4000F8BC4 /* PBXContainerItemProxy */;
 		};
+		5EAD6D2B1E27047400002378 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 635697C61B14FC11007A7283 /* Tests */;
+			targetProxy = 5EAD6D2A1E27047400002378 /* PBXContainerItemProxy */;
+		};
 		5EE84BF81D4717E40050C6CC /* PBXTargetDependency */ = {
 			isa = PBXTargetDependency;
 			target = 635697C61B14FC11007A7283 /* Tests */;
@@ -1138,6 +1269,53 @@
 			};
 			name = Release;
 		};
+		5EAD6D2C1E27047400002378 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 64F68A9A6A63CC930DD30A6E /* Pods-CronetUnitTests.debug.xcconfig */;
+			buildSettings = {
+				CLANG_ANALYZER_NONNULL = YES;
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				ENABLE_TESTABILITY = YES;
+				INFOPLIST_FILE = CronetUnitTests/Info.plist;
+				IPHONEOS_DEPLOYMENT_TARGET = 9.3;
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+				PRODUCT_BUNDLE_IDENTIFIER = io.grpc.CronetUnitTests;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				USER_HEADER_SEARCH_PATHS = "\"${PODS_ROOT}/../../../..\" $(inherited)";
+			};
+			name = Debug;
+		};
+		5EAD6D2D1E27047400002378 /* Cronet */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 386712AEACF7C2190C4B8B3F /* Pods-CronetUnitTests.cronet.xcconfig */;
+			buildSettings = {
+				CLANG_ANALYZER_NONNULL = YES;
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				INFOPLIST_FILE = CronetUnitTests/Info.plist;
+				IPHONEOS_DEPLOYMENT_TARGET = 9.3;
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+				PRODUCT_BUNDLE_IDENTIFIER = io.grpc.CronetUnitTests;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				USER_HEADER_SEARCH_PATHS = "\"${PODS_ROOT}/../../../..\" $(inherited)";
+			};
+			name = Cronet;
+		};
+		5EAD6D2E1E27047400002378 /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 02192CF1FF9534E3D18C65FC /* Pods-CronetUnitTests.release.xcconfig */;
+			buildSettings = {
+				CLANG_ANALYZER_NONNULL = YES;
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				INFOPLIST_FILE = CronetUnitTests/Info.plist;
+				IPHONEOS_DEPLOYMENT_TARGET = 9.3;
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+				PRODUCT_BUNDLE_IDENTIFIER = io.grpc.CronetUnitTests;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				USER_HEADER_SEARCH_PATHS = "\"${PODS_ROOT}/../../../..\" $(inherited)";
+			};
+			name = Release;
+		};
 		5EC3C7A01D4FC18C000330E2 /* Cronet */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
@@ -1597,6 +1775,16 @@
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 		};
+		5EAD6D2F1E27047400002378 /* Build configuration list for PBXNativeTarget "CronetUnitTests" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				5EAD6D2C1E27047400002378 /* Debug */,
+				5EAD6D2D1E27047400002378 /* Cronet */,
+				5EAD6D2E1E27047400002378 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
 		5EE84BFB1D4717E40050C6CC /* Build configuration list for PBXNativeTarget "InteropTestsRemoteWithCronet" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
diff --git a/src/objective-c/tests/Tests.xcodeproj/xcshareddata/xcschemes/CronetUnitTests.xcscheme b/src/objective-c/tests/Tests.xcodeproj/xcshareddata/xcschemes/CronetUnitTests.xcscheme
new file mode 100644
index 0000000..ea711e0
--- /dev/null
+++ b/src/objective-c/tests/Tests.xcodeproj/xcshareddata/xcschemes/CronetUnitTests.xcscheme
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "0730"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES">
+      <Testables>
+         <TestableReference
+            skipped = "NO">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "5EAD6D231E27047400002378"
+               BuildableName = "CronetUnitTests.xctest"
+               BlueprintName = "CronetUnitTests"
+               ReferencedContainer = "container:Tests.xcodeproj">
+            </BuildableReference>
+         </TestableReference>
+      </Testables>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
+      allowLocationSimulation = "YES">
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>
diff --git a/src/python/grpcio/_spawn_patch.py b/src/python/grpcio/_spawn_patch.py
index 24306f0..75d0a8b 100644
--- a/src/python/grpcio/_spawn_patch.py
+++ b/src/python/grpcio/_spawn_patch.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Patches the spawn() command for windows compilers.
 
 Windows has an 8191 character command line limit, but some compilers
@@ -45,29 +44,32 @@
 
 _classic_spawn = ccompiler.CCompiler.spawn
 
+
 def _commandfile_spawn(self, command):
-  command_length = sum([len(arg) for arg in command])
-  if os.name == 'nt' and command_length > MAX_COMMAND_LENGTH:
-    # Even if this command doesn't support the @command_file, it will
-    # fail as is so we try blindly
-    print('Command line length exceeded, using command file')
-    print(' '.join(command))
-    temporary_directory = tempfile.mkdtemp()
-    command_filename = os.path.abspath(
-    os.path.join(temporary_directory, 'command'))
-    with open(command_filename, 'w') as command_file:
-      escaped_args = ['"' + arg.replace('\\', '\\\\') + '"' for arg in command[1:]]
-      command_file.write(' '.join(escaped_args))
-    modified_command = command[:1] + ['@{}'.format(command_filename)]
-    try:
-      _classic_spawn(self, modified_command)
-    finally:
-      shutil.rmtree(temporary_directory)
-  else:
-    _classic_spawn(self, command)
+    command_length = sum([len(arg) for arg in command])
+    if os.name == 'nt' and command_length > MAX_COMMAND_LENGTH:
+        # Even if this command doesn't support the @command_file, it will
+        # fail as is so we try blindly
+        print('Command line length exceeded, using command file')
+        print(' '.join(command))
+        temporary_directory = tempfile.mkdtemp()
+        command_filename = os.path.abspath(
+            os.path.join(temporary_directory, 'command'))
+        with open(command_filename, 'w') as command_file:
+            escaped_args = [
+                '"' + arg.replace('\\', '\\\\') + '"' for arg in command[1:]
+            ]
+            command_file.write(' '.join(escaped_args))
+        modified_command = command[:1] + ['@{}'.format(command_filename)]
+        try:
+            _classic_spawn(self, modified_command)
+        finally:
+            shutil.rmtree(temporary_directory)
+    else:
+        _classic_spawn(self, command)
 
 
 def monkeypatch_spawn():
-  """Monkeypatching is dumb, but it's either that or we become maintainers of
+    """Monkeypatching is dumb, but it's either that or we become maintainers of
      something much, much bigger."""
-  ccompiler.CCompiler.spawn = _commandfile_spawn
+    ccompiler.CCompiler.spawn = _commandfile_spawn
diff --git a/src/python/grpcio/commands.py b/src/python/grpcio/commands.py
index 701c6af..d813df5 100644
--- a/src/python/grpcio/commands.py
+++ b/src/python/grpcio/commands.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Provides distutils command classes for the GRPC Python setup process."""
 
 import distutils
@@ -87,138 +86,144 @@
 
 
 class CommandError(Exception):
-  """Simple exception class for GRPC custom commands."""
+    """Simple exception class for GRPC custom commands."""
 
 
 # TODO(atash): Remove this once PyPI has better Linux bdist support. See
 # https://bitbucket.org/pypa/pypi/issues/120/binary-wheels-for-linux-are-not-supported
 def _get_grpc_custom_bdist(decorated_basename, target_bdist_basename):
-  """Returns a string path to a bdist file for Linux to install.
+    """Returns a string path to a bdist file for Linux to install.
 
   If we can retrieve a pre-compiled bdist from online, uses it. Else, emits a
   warning and builds from source.
   """
-  # TODO(atash): somehow the name that's returned from `wheel` is different
-  # between different versions of 'wheel' (but from a compatibility standpoint,
-  # the names are compatible); we should have some way of determining name
-  # compatibility in the same way `wheel` does to avoid having to rename all of
-  # the custom wheels that we build/upload to GCS.
+    # TODO(atash): somehow the name that's returned from `wheel` is different
+    # between different versions of 'wheel' (but from a compatibility standpoint,
+    # the names are compatible); we should have some way of determining name
+    # compatibility in the same way `wheel` does to avoid having to rename all of
+    # the custom wheels that we build/upload to GCS.
 
-  # Break import style to ensure that setup.py has had a chance to install the
-  # relevant package.
-  from six.moves.urllib import request
-  decorated_path = decorated_basename + GRPC_CUSTOM_BDIST_EXT
-  try:
-    url = BINARIES_REPOSITORY + '/{target}'.format(target=decorated_path)
-    bdist_data = request.urlopen(url).read()
-  except IOError as error:
-    raise CommandError(
-        '{}\n\nCould not find the bdist {}: {}'
-            .format(traceback.format_exc(), decorated_path, error.message))
-  # Our chosen local bdist path.
-  bdist_path = target_bdist_basename + GRPC_CUSTOM_BDIST_EXT
-  try:
-    with open(bdist_path, 'w') as bdist_file:
-      bdist_file.write(bdist_data)
-  except IOError as error:
-    raise CommandError(
-        '{}\n\nCould not write grpcio bdist: {}'
-            .format(traceback.format_exc(), error.message))
-  return bdist_path
+    # Break import style to ensure that setup.py has had a chance to install the
+    # relevant package.
+    from six.moves.urllib import request
+    decorated_path = decorated_basename + GRPC_CUSTOM_BDIST_EXT
+    try:
+        url = BINARIES_REPOSITORY + '/{target}'.format(target=decorated_path)
+        bdist_data = request.urlopen(url).read()
+    except IOError as error:
+        raise CommandError('{}\n\nCould not find the bdist {}: {}'.format(
+            traceback.format_exc(), decorated_path, error.message))
+    # Our chosen local bdist path.
+    bdist_path = target_bdist_basename + GRPC_CUSTOM_BDIST_EXT
+    try:
+        with open(bdist_path, 'w') as bdist_file:
+            bdist_file.write(bdist_data)
+    except IOError as error:
+        raise CommandError('{}\n\nCould not write grpcio bdist: {}'
+                           .format(traceback.format_exc(), error.message))
+    return bdist_path
 
 
 class SphinxDocumentation(setuptools.Command):
-  """Command to generate documentation via sphinx."""
+    """Command to generate documentation via sphinx."""
 
-  description = 'generate sphinx documentation'
-  user_options = []
+    description = 'generate sphinx documentation'
+    user_options = []
 
-  def initialize_options(self):
-    pass
+    def initialize_options(self):
+        pass
 
-  def finalize_options(self):
-    pass
+    def finalize_options(self):
+        pass
 
-  def run(self):
-    # We import here to ensure that setup.py has had a chance to install the
-    # relevant package eggs first.
-    import sphinx
-    import sphinx.apidoc
-    metadata = self.distribution.metadata
-    src_dir = os.path.join(PYTHON_STEM, 'grpc')
-    sys.path.append(src_dir)
-    sphinx.apidoc.main([
-        '', '--force', '--full', '-H', metadata.name, '-A', metadata.author,
-        '-V', metadata.version, '-R', metadata.version,
-        '-o', os.path.join('doc', 'src'), src_dir])
-    conf_filepath = os.path.join('doc', 'src', 'conf.py')
-    with open(conf_filepath, 'a') as conf_file:
-      conf_file.write(CONF_PY_ADDENDUM)
-    glossary_filepath = os.path.join('doc', 'src', 'grpc.rst')
-    with open(glossary_filepath, 'a') as glossary_filepath:
-      glossary_filepath.write(API_GLOSSARY)
-    sphinx.main(['', os.path.join('doc', 'src'), os.path.join('doc', 'build')])
+    def run(self):
+        # We import here to ensure that setup.py has had a chance to install the
+        # relevant package eggs first.
+        import sphinx
+        import sphinx.apidoc
+        metadata = self.distribution.metadata
+        src_dir = os.path.join(PYTHON_STEM, 'grpc')
+        sys.path.append(src_dir)
+        sphinx.apidoc.main([
+            '', '--force', '--full', '-H', metadata.name, '-A', metadata.author,
+            '-V', metadata.version, '-R', metadata.version, '-o',
+            os.path.join('doc', 'src'), src_dir
+        ])
+        conf_filepath = os.path.join('doc', 'src', 'conf.py')
+        with open(conf_filepath, 'a') as conf_file:
+            conf_file.write(CONF_PY_ADDENDUM)
+        glossary_filepath = os.path.join('doc', 'src', 'grpc.rst')
+        with open(glossary_filepath, 'a') as glossary_filepath:
+            glossary_filepath.write(API_GLOSSARY)
+        sphinx.main(
+            ['', os.path.join('doc', 'src'), os.path.join('doc', 'build')])
 
 
 class BuildProjectMetadata(setuptools.Command):
-  """Command to generate project metadata in a module."""
+    """Command to generate project metadata in a module."""
 
-  description = 'build grpcio project metadata files'
-  user_options = []
+    description = 'build grpcio project metadata files'
+    user_options = []
 
-  def initialize_options(self):
-    pass
+    def initialize_options(self):
+        pass
 
-  def finalize_options(self):
-    pass
+    def finalize_options(self):
+        pass
 
-  def run(self):
-    with open(os.path.join(PYTHON_STEM, 'grpc/_grpcio_metadata.py'), 'w') as module_file:
-      module_file.write('__version__ = """{}"""'.format(
-          self.distribution.get_version()))
+    def run(self):
+        with open(os.path.join(PYTHON_STEM, 'grpc/_grpcio_metadata.py'),
+                  'w') as module_file:
+            module_file.write('__version__ = """{}"""'.format(
+                self.distribution.get_version()))
 
 
 class BuildPy(build_py.build_py):
-  """Custom project build command."""
+    """Custom project build command."""
 
-  def run(self):
-    self.run_command('build_project_metadata')
-    build_py.build_py.run(self)
+    def run(self):
+        self.run_command('build_project_metadata')
+        build_py.build_py.run(self)
 
 
 def _poison_extensions(extensions, message):
-  """Includes a file that will always fail to compile in all extensions."""
-  poison_filename = os.path.join(PYTHON_STEM, 'poison.c')
-  with open(poison_filename, 'w') as poison:
-    poison.write('#error {}'.format(message))
-  for extension in extensions:
-    extension.sources = [poison_filename]
+    """Includes a file that will always fail to compile in all extensions."""
+    poison_filename = os.path.join(PYTHON_STEM, 'poison.c')
+    with open(poison_filename, 'w') as poison:
+        poison.write('#error {}'.format(message))
+    for extension in extensions:
+        extension.sources = [poison_filename]
+
 
 def check_and_update_cythonization(extensions):
-  """Replace .pyx files with their generated counterparts and return whether or
+    """Replace .pyx files with their generated counterparts and return whether or
      not cythonization still needs to occur."""
-  for extension in extensions:
-    generated_pyx_sources = []
-    other_sources = []
-    for source in extension.sources:
-      base, file_ext = os.path.splitext(source)
-      if file_ext == '.pyx':
-        generated_pyx_source = next(
-            (base + gen_ext for gen_ext in ('.c', '.cpp',)
-             if os.path.isfile(base + gen_ext)), None)
-        if generated_pyx_source:
-          generated_pyx_sources.append(generated_pyx_source)
-        else:
-          sys.stderr.write('Cython-generated files are missing...\n')
-          return False
-      else:
-        other_sources.append(source)
-    extension.sources = generated_pyx_sources + other_sources
-  sys.stderr.write('Found cython-generated files...\n')
-  return True
+    for extension in extensions:
+        generated_pyx_sources = []
+        other_sources = []
+        for source in extension.sources:
+            base, file_ext = os.path.splitext(source)
+            if file_ext == '.pyx':
+                generated_pyx_source = next((base + gen_ext
+                                             for gen_ext in (
+                                                 '.c',
+                                                 '.cpp',)
+                                             if os.path.isfile(base + gen_ext)),
+                                            None)
+                if generated_pyx_source:
+                    generated_pyx_sources.append(generated_pyx_source)
+                else:
+                    sys.stderr.write('Cython-generated files are missing...\n')
+                    return False
+            else:
+                other_sources.append(source)
+        extension.sources = generated_pyx_sources + other_sources
+    sys.stderr.write('Found cython-generated files...\n')
+    return True
+
 
 def try_cythonize(extensions, linetracing=False, mandatory=True):
-  """Attempt to cythonize the extensions.
+    """Attempt to cythonize the extensions.
 
   Args:
     extensions: A list of `distutils.extension.Extension`.
@@ -226,78 +231,83 @@
     mandatory: Whether or not having Cython-generated files is mandatory. If it
       is, extensions will be poisoned when they can't be fully generated.
   """
-  try:
-    # Break import style to ensure we have access to Cython post-setup_requires
-    import Cython.Build
-  except ImportError:
-    if mandatory:
-      sys.stderr.write(
-          "This package needs to generate C files with Cython but it cannot. "
-          "Poisoning extension sources to disallow extension commands...")
-      _poison_extensions(
-          extensions,
-          "Extensions have been poisoned due to missing Cython-generated code.")
-    return extensions
-  cython_compiler_directives = {}
-  if linetracing:
-    additional_define_macros = [('CYTHON_TRACE_NOGIL', '1')]
-    cython_compiler_directives['linetrace'] = True
-  return Cython.Build.cythonize(
-    extensions,
-    include_path=[
-      include_dir for extension in extensions for include_dir in extension.include_dirs
-    ] + [CYTHON_STEM],
-    compiler_directives=cython_compiler_directives
-  )
+    try:
+        # Break import style to ensure we have access to Cython post-setup_requires
+        import Cython.Build
+    except ImportError:
+        if mandatory:
+            sys.stderr.write(
+                "This package needs to generate C files with Cython but it cannot. "
+                "Poisoning extension sources to disallow extension commands...")
+            _poison_extensions(
+                extensions,
+                "Extensions have been poisoned due to missing Cython-generated code."
+            )
+        return extensions
+    cython_compiler_directives = {}
+    if linetracing:
+        additional_define_macros = [('CYTHON_TRACE_NOGIL', '1')]
+        cython_compiler_directives['linetrace'] = True
+    return Cython.Build.cythonize(
+        extensions,
+        include_path=[
+            include_dir
+            for extension in extensions
+            for include_dir in extension.include_dirs
+        ] + [CYTHON_STEM],
+        compiler_directives=cython_compiler_directives)
 
 
 class BuildExt(build_ext.build_ext):
-  """Custom build_ext command to enable compiler-specific flags."""
+    """Custom build_ext command to enable compiler-specific flags."""
 
-  C_OPTIONS = {
-      'unix': ('-pthread', '-std=gnu99'),
-      'msvc': (),
-  }
-  LINK_OPTIONS = {}
+    C_OPTIONS = {
+        'unix': ('-pthread', '-std=gnu99'),
+        'msvc': (),
+    }
+    LINK_OPTIONS = {}
 
-  def build_extensions(self):
-    compiler = self.compiler.compiler_type
-    if compiler in BuildExt.C_OPTIONS:
-      for extension in self.extensions:
-        extension.extra_compile_args += list(BuildExt.C_OPTIONS[compiler])
-    if compiler in BuildExt.LINK_OPTIONS:
-      for extension in self.extensions:
-        extension.extra_link_args += list(BuildExt.LINK_OPTIONS[compiler])
-    if not check_and_update_cythonization(self.extensions):
-      self.extensions = try_cythonize(self.extensions)
-    try:
-      build_ext.build_ext.build_extensions(self)
-    except Exception as error:
-      formatted_exception = traceback.format_exc()
-      support.diagnose_build_ext_error(self, error, formatted_exception)
-      raise CommandError(
-          "Failed `build_ext` step:\n{}".format(formatted_exception))
+    def build_extensions(self):
+        compiler = self.compiler.compiler_type
+        if compiler in BuildExt.C_OPTIONS:
+            for extension in self.extensions:
+                extension.extra_compile_args += list(
+                    BuildExt.C_OPTIONS[compiler])
+        if compiler in BuildExt.LINK_OPTIONS:
+            for extension in self.extensions:
+                extension.extra_link_args += list(
+                    BuildExt.LINK_OPTIONS[compiler])
+        if not check_and_update_cythonization(self.extensions):
+            self.extensions = try_cythonize(self.extensions)
+        try:
+            build_ext.build_ext.build_extensions(self)
+        except Exception as error:
+            formatted_exception = traceback.format_exc()
+            support.diagnose_build_ext_error(self, error, formatted_exception)
+            raise CommandError(
+                "Failed `build_ext` step:\n{}".format(formatted_exception))
 
 
 class Gather(setuptools.Command):
-  """Command to gather project dependencies."""
+    """Command to gather project dependencies."""
 
-  description = 'gather dependencies for grpcio'
-  user_options = [
-    ('test', 't', 'flag indicating to gather test dependencies'),
-    ('install', 'i', 'flag indicating to gather install dependencies')
-  ]
+    description = 'gather dependencies for grpcio'
+    user_options = [
+        ('test', 't', 'flag indicating to gather test dependencies'),
+        ('install', 'i', 'flag indicating to gather install dependencies')
+    ]
 
-  def initialize_options(self):
-    self.test = False
-    self.install = False
+    def initialize_options(self):
+        self.test = False
+        self.install = False
 
-  def finalize_options(self):
-    # distutils requires this override.
-    pass
+    def finalize_options(self):
+        # distutils requires this override.
+        pass
 
-  def run(self):
-    if self.install and self.distribution.install_requires:
-      self.distribution.fetch_build_eggs(self.distribution.install_requires)
-    if self.test and self.distribution.tests_require:
-      self.distribution.fetch_build_eggs(self.distribution.tests_require)
+    def run(self):
+        if self.install and self.distribution.install_requires:
+            self.distribution.fetch_build_eggs(
+                self.distribution.install_requires)
+        if self.test and self.distribution.tests_require:
+            self.distribution.fetch_build_eggs(self.distribution.tests_require)
diff --git a/src/python/grpcio/grpc/__init__.py b/src/python/grpcio/grpc/__init__.py
index e3c1015..fe29971 100644
--- a/src/python/grpcio/grpc/__init__.py
+++ b/src/python/grpcio/grpc/__init__.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """gRPC's Python API."""
 
 import abc
@@ -37,28 +36,27 @@
 
 from grpc._cython import cygrpc as _cygrpc
 
-
 ############################## Future Interface  ###############################
 
 
 class FutureTimeoutError(Exception):
-  """Indicates that a method call on a Future timed out."""
+    """Indicates that a method call on a Future timed out."""
 
 
 class FutureCancelledError(Exception):
-  """Indicates that the computation underlying a Future was cancelled."""
+    """Indicates that the computation underlying a Future was cancelled."""
 
 
 class Future(six.with_metaclass(abc.ABCMeta)):
-  """A representation of a computation in another control flow.
+    """A representation of a computation in another control flow.
 
   Computations represented by a Future may be yet to be begun, may be ongoing,
   or may have already completed.
   """
 
-  @abc.abstractmethod
-  def cancel(self):
-    """Attempts to cancel the computation.
+    @abc.abstractmethod
+    def cancel(self):
+        """Attempts to cancel the computation.
 
     This method does not block.
 
@@ -71,11 +69,11 @@
         remote system for which a determination of whether or not it commenced
         before being cancelled cannot be made without blocking.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def cancelled(self):
-    """Describes whether the computation was cancelled.
+    @abc.abstractmethod
+    def cancelled(self):
+        """Describes whether the computation was cancelled.
 
     This method does not block.
 
@@ -85,11 +83,11 @@
         not limited to this object's cancel method not having been called and
         the computation's result having become immediately available.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def running(self):
-    """Describes whether the computation is taking place.
+    @abc.abstractmethod
+    def running(self):
+        """Describes whether the computation is taking place.
 
     This method does not block.
 
@@ -98,11 +96,11 @@
         taking place now, or False if the computation took place in the past or
         was cancelled.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def done(self):
-    """Describes whether the computation has taken place.
+    @abc.abstractmethod
+    def done(self):
+        """Describes whether the computation has taken place.
 
     This method does not block.
 
@@ -111,11 +109,11 @@
         unscheduled or interrupted. False if the computation may possibly be
         executing or scheduled to execute later.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def result(self, timeout=None):
-    """Accesses the outcome of the computation or raises its exception.
+    @abc.abstractmethod
+    def result(self, timeout=None):
+        """Accesses the outcome of the computation or raises its exception.
 
     This method may return immediately or may block.
 
@@ -134,11 +132,11 @@
       Exception: If the computation raised an exception, this call will raise
         the same exception.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def exception(self, timeout=None):
-    """Return the exception raised by the computation.
+    @abc.abstractmethod
+    def exception(self, timeout=None):
+        """Return the exception raised by the computation.
 
     This method may return immediately or may block.
 
@@ -157,11 +155,11 @@
         not terminate within the allotted time.
       FutureCancelledError: If the computation was cancelled.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def traceback(self, timeout=None):
-    """Access the traceback of the exception raised by the computation.
+    @abc.abstractmethod
+    def traceback(self, timeout=None):
+        """Access the traceback of the exception raised by the computation.
 
     This method may return immediately or may block.
 
@@ -180,11 +178,11 @@
         not terminate within the allotted time.
       FutureCancelledError: If the computation was cancelled.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def add_done_callback(self, fn):
-    """Adds a function to be called at completion of the computation.
+    @abc.abstractmethod
+    def add_done_callback(self, fn):
+        """Adds a function to be called at completion of the computation.
 
     The callback will be passed this Future object describing the outcome of
     the computation.
@@ -195,7 +193,7 @@
     Args:
       fn: A callable taking this Future object as its single parameter.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
 ################################  gRPC Enums  ##################################
@@ -203,7 +201,7 @@
 
 @enum.unique
 class ChannelConnectivity(enum.Enum):
-  """Mirrors grpc_connectivity_state in the gRPC Core.
+    """Mirrors grpc_connectivity_state in the gRPC Core.
 
   Attributes:
     IDLE: The channel is idle.
@@ -213,81 +211,80 @@
       recover.
     SHUTDOWN: The channel has seen a failure from which it cannot recover.
   """
-  IDLE              = (_cygrpc.ConnectivityState.idle, 'idle')
-  CONNECTING        = (_cygrpc.ConnectivityState.connecting, 'connecting')
-  READY             = (_cygrpc.ConnectivityState.ready, 'ready')
-  TRANSIENT_FAILURE = (
-      _cygrpc.ConnectivityState.transient_failure, 'transient failure')
-  SHUTDOWN          = (_cygrpc.ConnectivityState.shutdown, 'shutdown')
+    IDLE = (_cygrpc.ConnectivityState.idle, 'idle')
+    CONNECTING = (_cygrpc.ConnectivityState.connecting, 'connecting')
+    READY = (_cygrpc.ConnectivityState.ready, 'ready')
+    TRANSIENT_FAILURE = (_cygrpc.ConnectivityState.transient_failure,
+                         'transient failure')
+    SHUTDOWN = (_cygrpc.ConnectivityState.shutdown, 'shutdown')
 
 
 @enum.unique
 class StatusCode(enum.Enum):
-  """Mirrors grpc_status_code in the gRPC Core."""
-  OK                  = (_cygrpc.StatusCode.ok, 'ok')
-  CANCELLED           = (_cygrpc.StatusCode.cancelled, 'cancelled')
-  UNKNOWN             = (_cygrpc.StatusCode.unknown, 'unknown')
-  INVALID_ARGUMENT    = (
-      _cygrpc.StatusCode.invalid_argument, 'invalid argument')
-  DEADLINE_EXCEEDED   = (
-      _cygrpc.StatusCode.deadline_exceeded, 'deadline exceeded')
-  NOT_FOUND           = (_cygrpc.StatusCode.not_found, 'not found')
-  ALREADY_EXISTS      = (_cygrpc.StatusCode.already_exists, 'already exists')
-  PERMISSION_DENIED   = (
-      _cygrpc.StatusCode.permission_denied, 'permission denied')
-  RESOURCE_EXHAUSTED  = (
-      _cygrpc.StatusCode.resource_exhausted, 'resource exhausted')
-  FAILED_PRECONDITION = (
-      _cygrpc.StatusCode.failed_precondition, 'failed precondition')
-  ABORTED             = (_cygrpc.StatusCode.aborted, 'aborted')
-  OUT_OF_RANGE        = (_cygrpc.StatusCode.out_of_range, 'out of range')
-  UNIMPLEMENTED       = (_cygrpc.StatusCode.unimplemented, 'unimplemented')
-  INTERNAL            = (_cygrpc.StatusCode.internal, 'internal')
-  UNAVAILABLE         = (_cygrpc.StatusCode.unavailable, 'unavailable')
-  DATA_LOSS           = (_cygrpc.StatusCode.data_loss, 'data loss')
-  UNAUTHENTICATED     = (_cygrpc.StatusCode.unauthenticated, 'unauthenticated')
+    """Mirrors grpc_status_code in the gRPC Core."""
+    OK = (_cygrpc.StatusCode.ok, 'ok')
+    CANCELLED = (_cygrpc.StatusCode.cancelled, 'cancelled')
+    UNKNOWN = (_cygrpc.StatusCode.unknown, 'unknown')
+    INVALID_ARGUMENT = (_cygrpc.StatusCode.invalid_argument, 'invalid argument')
+    DEADLINE_EXCEEDED = (_cygrpc.StatusCode.deadline_exceeded,
+                         'deadline exceeded')
+    NOT_FOUND = (_cygrpc.StatusCode.not_found, 'not found')
+    ALREADY_EXISTS = (_cygrpc.StatusCode.already_exists, 'already exists')
+    PERMISSION_DENIED = (_cygrpc.StatusCode.permission_denied,
+                         'permission denied')
+    RESOURCE_EXHAUSTED = (_cygrpc.StatusCode.resource_exhausted,
+                          'resource exhausted')
+    FAILED_PRECONDITION = (_cygrpc.StatusCode.failed_precondition,
+                           'failed precondition')
+    ABORTED = (_cygrpc.StatusCode.aborted, 'aborted')
+    OUT_OF_RANGE = (_cygrpc.StatusCode.out_of_range, 'out of range')
+    UNIMPLEMENTED = (_cygrpc.StatusCode.unimplemented, 'unimplemented')
+    INTERNAL = (_cygrpc.StatusCode.internal, 'internal')
+    UNAVAILABLE = (_cygrpc.StatusCode.unavailable, 'unavailable')
+    DATA_LOSS = (_cygrpc.StatusCode.data_loss, 'data loss')
+    UNAUTHENTICATED = (_cygrpc.StatusCode.unauthenticated, 'unauthenticated')
 
 
 #############################  gRPC Exceptions  ################################
 
 
 class RpcError(Exception):
-  """Raised by the gRPC library to indicate non-OK-status RPC termination."""
+    """Raised by the gRPC library to indicate non-OK-status RPC termination."""
 
 
 ##############################  Shared Context  ################################
 
 
 class RpcContext(six.with_metaclass(abc.ABCMeta)):
-  """Provides RPC-related information and action."""
+    """Provides RPC-related information and action."""
 
-  @abc.abstractmethod
-  def is_active(self):
-    """Describes whether the RPC is active or has terminated."""
-    raise NotImplementedError()
+    @abc.abstractmethod
+    def is_active(self):
+        """Describes whether the RPC is active or has terminated."""
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def time_remaining(self):
-    """Describes the length of allowed time remaining for the RPC.
+    @abc.abstractmethod
+    def time_remaining(self):
+        """Describes the length of allowed time remaining for the RPC.
 
     Returns:
       A nonnegative float indicating the length of allowed time in seconds
       remaining for the RPC to complete before it is considered to have timed
       out, or None if no deadline was specified for the RPC.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def cancel(self):
-    """Cancels the RPC.
+    @abc.abstractmethod
+    def cancel(self):
+        """Cancels the RPC.
 
     Idempotent and has no effect if the RPC has already terminated.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def add_callback(self, callback):
-    """Registers a callback to be called on RPC termination.
+    @abc.abstractmethod
+    def add_callback(self, callback):
+        """Registers a callback to be called on RPC termination.
 
     Args:
       callback: A no-parameter callable to be called on RPC termination.
@@ -297,76 +294,76 @@
         callback was not added and will not later be called (because the RPC
         already terminated or some other reason).
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
 #########################  Invocation-Side Context  ############################
 
 
 class Call(six.with_metaclass(abc.ABCMeta, RpcContext)):
-  """Invocation-side utility object for an RPC."""
+    """Invocation-side utility object for an RPC."""
 
-  @abc.abstractmethod
-  def initial_metadata(self):
-    """Accesses the initial metadata from the service-side of the RPC.
+    @abc.abstractmethod
+    def initial_metadata(self):
+        """Accesses the initial metadata from the service-side of the RPC.
 
     This method blocks until the value is available.
 
     Returns:
       The initial :term:`metadata`.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def trailing_metadata(self):
-    """Accesses the trailing metadata from the service-side of the RPC.
+    @abc.abstractmethod
+    def trailing_metadata(self):
+        """Accesses the trailing metadata from the service-side of the RPC.
 
     This method blocks until the value is available.
 
     Returns:
       The trailing :term:`metadata`.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def code(self):
-    """Accesses the status code emitted by the service-side of the RPC.
+    @abc.abstractmethod
+    def code(self):
+        """Accesses the status code emitted by the service-side of the RPC.
 
     This method blocks until the value is available.
 
     Returns:
       The StatusCode value for the RPC.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def details(self):
-    """Accesses the details value emitted by the service-side of the RPC.
+    @abc.abstractmethod
+    def details(self):
+        """Accesses the details value emitted by the service-side of the RPC.
 
     This method blocks until the value is available.
 
     Returns:
       The details string of the RPC.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
 ############  Authentication & Authorization Interfaces & Classes  #############
 
 
 class ChannelCredentials(object):
-  """A value encapsulating the data required to create a secure Channel.
+    """A value encapsulating the data required to create a secure Channel.
 
   This class has no supported interface - it exists to define the type of its
   instances and its instances exist to be passed to other functions.
   """
 
-  def __init__(self, credentials):
-    self._credentials = credentials
+    def __init__(self, credentials):
+        self._credentials = credentials
 
 
 class CallCredentials(object):
-  """A value encapsulating data asserting an identity over a channel.
+    """A value encapsulating data asserting an identity over a channel.
 
   A CallCredentials may be composed with ChannelCredentials to always assert
   identity for every call over that Channel.
@@ -375,12 +372,12 @@
   instances and its instances exist to be passed to other functions.
   """
 
-  def __init__(self, credentials):
-    self._credentials = credentials
+    def __init__(self, credentials):
+        self._credentials = credentials
 
 
 class AuthMetadataContext(six.with_metaclass(abc.ABCMeta)):
-  """Provides information to call credentials metadata plugins.
+    """Provides information to call credentials metadata plugins.
 
   Attributes:
     service_url: A string URL of the service being called into.
@@ -389,23 +386,23 @@
 
 
 class AuthMetadataPluginCallback(six.with_metaclass(abc.ABCMeta)):
-  """Callback object received by a metadata plugin."""
+    """Callback object received by a metadata plugin."""
 
-  def __call__(self, metadata, error):
-    """Inform the gRPC runtime of the metadata to construct a CallCredentials.
+    def __call__(self, metadata, error):
+        """Inform the gRPC runtime of the metadata to construct a CallCredentials.
 
     Args:
       metadata: The :term:`metadata` used to construct the CallCredentials.
       error: An Exception to indicate error or None to indicate success.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
 class AuthMetadataPlugin(six.with_metaclass(abc.ABCMeta)):
-  """A specification for custom authentication."""
+    """A specification for custom authentication."""
 
-  def __call__(self, context, callback):
-    """Implements authentication by passing metadata to a callback.
+    def __call__(self, context, callback):
+        """Implements authentication by passing metadata to a callback.
 
     Implementations of this method must not block.
 
@@ -415,29 +412,29 @@
       callback: An AuthMetadataPluginCallback to be invoked either synchronously
         or asynchronously.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
 class ServerCredentials(object):
-  """A value encapsulating the data required to open a secure port on a Server.
+    """A value encapsulating the data required to open a secure port on a Server.
 
   This class has no supported interface - it exists to define the type of its
   instances and its instances exist to be passed to other functions.
   """
 
-  def __init__(self, credentials):
-    self._credentials = credentials
+    def __init__(self, credentials):
+        self._credentials = credentials
 
 
 ########################  Multi-Callable Interfaces  ###########################
 
 
 class UnaryUnaryMultiCallable(six.with_metaclass(abc.ABCMeta)):
-  """Affords invoking a unary-unary RPC."""
+    """Affords invoking a unary-unary RPC."""
 
-  @abc.abstractmethod
-  def __call__(self, request, timeout=None, metadata=None, credentials=None):
-    """Synchronously invokes the underlying RPC.
+    @abc.abstractmethod
+    def __call__(self, request, timeout=None, metadata=None, credentials=None):
+        """Synchronously invokes the underlying RPC.
 
     Args:
       request: The request value for the RPC.
@@ -454,11 +451,11 @@
         raised RpcError will also be a Call for the RPC affording the RPC's
         metadata, status code, and details.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def with_call(self, request, timeout=None, metadata=None, credentials=None):
-    """Synchronously invokes the underlying RPC.
+    @abc.abstractmethod
+    def with_call(self, request, timeout=None, metadata=None, credentials=None):
+        """Synchronously invokes the underlying RPC.
 
     Args:
       request: The request value for the RPC.
@@ -475,11 +472,11 @@
         raised RpcError will also be a Call for the RPC affording the RPC's
         metadata, status code, and details.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def future(self, request, timeout=None, metadata=None, credentials=None):
-    """Asynchronously invokes the underlying RPC.
+    @abc.abstractmethod
+    def future(self, request, timeout=None, metadata=None, credentials=None):
+        """Asynchronously invokes the underlying RPC.
 
     Args:
       request: The request value for the RPC.
@@ -490,19 +487,19 @@
 
     Returns:
       An object that is both a Call for the RPC and a Future. In the event of
-        RPC completion, the return Future's result value will be the response
-        message of the RPC. Should the event terminate with non-OK status, the
-        returned Future's exception value will be an RpcError.
+        RPC completion, the return Call-Future's result value will be the
+        response message of the RPC. Should the event terminate with non-OK
+        status, the returned Call-Future's exception value will be an RpcError.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
 class UnaryStreamMultiCallable(six.with_metaclass(abc.ABCMeta)):
-  """Affords invoking a unary-stream RPC."""
+    """Affords invoking a unary-stream RPC."""
 
-  @abc.abstractmethod
-  def __call__(self, request, timeout=None, metadata=None, credentials=None):
-    """Invokes the underlying RPC.
+    @abc.abstractmethod
+    def __call__(self, request, timeout=None, metadata=None, credentials=None):
+        """Invokes the underlying RPC.
 
     Args:
       request: The request value for the RPC.
@@ -513,19 +510,22 @@
 
     Returns:
       An object that is both a Call for the RPC and an iterator of response
-        values. Drawing response values from the returned iterator may raise
-        RpcError indicating termination of the RPC with non-OK status.
+        values. Drawing response values from the returned Call-iterator may
+        raise RpcError indicating termination of the RPC with non-OK status.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
 class StreamUnaryMultiCallable(six.with_metaclass(abc.ABCMeta)):
-  """Affords invoking a stream-unary RPC in any call style."""
+    """Affords invoking a stream-unary RPC in any call style."""
 
-  @abc.abstractmethod
-  def __call__(
-      self, request_iterator, timeout=None, metadata=None, credentials=None):
-    """Synchronously invokes the underlying RPC.
+    @abc.abstractmethod
+    def __call__(self,
+                 request_iterator,
+                 timeout=None,
+                 metadata=None,
+                 credentials=None):
+        """Synchronously invokes the underlying RPC.
 
     Args:
       request_iterator: An iterator that yields request values for the RPC.
@@ -535,20 +535,22 @@
       credentials: An optional CallCredentials for the RPC.
 
     Returns:
-      The response value for the RPC, and a Call for the RPC if with_call was
-        set to True at invocation.
+      The response value for the RPC.
 
     Raises:
       RpcError: Indicating that the RPC terminated with non-OK status. The
         raised RpcError will also be a Call for the RPC affording the RPC's
         metadata, status code, and details.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def with_call(
-      self, request_iterator, timeout=None, metadata=None, credentials=None):
-    """Synchronously invokes the underlying RPC.
+    @abc.abstractmethod
+    def with_call(self,
+                  request_iterator,
+                  timeout=None,
+                  metadata=None,
+                  credentials=None):
+        """Synchronously invokes the underlying RPC.
 
     Args:
       request_iterator: An iterator that yields request values for the RPC.
@@ -565,12 +567,15 @@
         raised RpcError will also be a Call for the RPC affording the RPC's
         metadata, status code, and details.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def future(
-      self, request_iterator, timeout=None, metadata=None, credentials=None):
-    """Asynchronously invokes the underlying RPC.
+    @abc.abstractmethod
+    def future(self,
+               request_iterator,
+               timeout=None,
+               metadata=None,
+               credentials=None):
+        """Asynchronously invokes the underlying RPC.
 
     Args:
       request_iterator: An iterator that yields request values for the RPC.
@@ -581,20 +586,23 @@
 
     Returns:
       An object that is both a Call for the RPC and a Future. In the event of
-        RPC completion, the return Future's result value will be the response
-        message of the RPC. Should the event terminate with non-OK status, the
-        returned Future's exception value will be an RpcError.
+        RPC completion, the return Call-Future's result value will be the
+        response message of the RPC. Should the event terminate with non-OK
+        status, the returned Call-Future's exception value will be an RpcError.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
 class StreamStreamMultiCallable(six.with_metaclass(abc.ABCMeta)):
-  """Affords invoking a stream-stream RPC in any call style."""
+    """Affords invoking a stream-stream RPC in any call style."""
 
-  @abc.abstractmethod
-  def __call__(
-      self, request_iterator, timeout=None, metadata=None, credentials=None):
-    """Invokes the underlying RPC.
+    @abc.abstractmethod
+    def __call__(self,
+                 request_iterator,
+                 timeout=None,
+                 metadata=None,
+                 credentials=None):
+        """Invokes the underlying RPC.
 
     Args:
       request_iterator: An iterator that yields request values for the RPC.
@@ -605,21 +613,21 @@
 
     Returns:
       An object that is both a Call for the RPC and an iterator of response
-        values. Drawing response values from the returned iterator may raise
-        RpcError indicating termination of the RPC with non-OK status.
+        values. Drawing response values from the returned Call-iterator may
+        raise RpcError indicating termination of the RPC with non-OK status.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
 #############################  Channel Interface  ##############################
 
 
 class Channel(six.with_metaclass(abc.ABCMeta)):
-  """Affords RPC invocation via generic methods."""
+    """Affords RPC invocation via generic methods."""
 
-  @abc.abstractmethod
-  def subscribe(self, callback, try_to_connect=False):
-    """Subscribes to this Channel's connectivity.
+    @abc.abstractmethod
+    def subscribe(self, callback, try_to_connect=False):
+        """Subscribes to this Channel's connectivity.
 
     Args:
       callback: A callable to be invoked and passed a ChannelConnectivity value
@@ -631,22 +639,24 @@
         attempt to connect if it is not already connected and ready to conduct
         RPCs.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def unsubscribe(self, callback):
-    """Unsubscribes a callback from this Channel's connectivity.
+    @abc.abstractmethod
+    def unsubscribe(self, callback):
+        """Unsubscribes a callback from this Channel's connectivity.
 
     Args:
       callback: A callable previously registered with this Channel from having
         been passed to its "subscribe" method.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def unary_unary(
-      self, method, request_serializer=None, response_deserializer=None):
-    """Creates a UnaryUnaryMultiCallable for a unary-unary method.
+    @abc.abstractmethod
+    def unary_unary(self,
+                    method,
+                    request_serializer=None,
+                    response_deserializer=None):
+        """Creates a UnaryUnaryMultiCallable for a unary-unary method.
 
     Args:
       method: The name of the RPC method.
@@ -658,12 +668,14 @@
     Returns:
       A UnaryUnaryMultiCallable value for the named unary-unary method.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def unary_stream(
-      self, method, request_serializer=None, response_deserializer=None):
-    """Creates a UnaryStreamMultiCallable for a unary-stream method.
+    @abc.abstractmethod
+    def unary_stream(self,
+                     method,
+                     request_serializer=None,
+                     response_deserializer=None):
+        """Creates a UnaryStreamMultiCallable for a unary-stream method.
 
     Args:
       method: The name of the RPC method.
@@ -675,12 +687,14 @@
     Returns:
       A UnaryStreamMultiCallable value for the name unary-stream method.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def stream_unary(
-      self, method, request_serializer=None, response_deserializer=None):
-    """Creates a StreamUnaryMultiCallable for a stream-unary method.
+    @abc.abstractmethod
+    def stream_unary(self,
+                     method,
+                     request_serializer=None,
+                     response_deserializer=None):
+        """Creates a StreamUnaryMultiCallable for a stream-unary method.
 
     Args:
       method: The name of the RPC method.
@@ -692,12 +706,14 @@
     Returns:
       A StreamUnaryMultiCallable value for the named stream-unary method.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def stream_stream(
-      self, method, request_serializer=None, response_deserializer=None):
-    """Creates a StreamStreamMultiCallable for a stream-stream method.
+    @abc.abstractmethod
+    def stream_stream(self,
+                      method,
+                      request_serializer=None,
+                      response_deserializer=None):
+        """Creates a StreamStreamMultiCallable for a stream-stream method.
 
     Args:
       method: The name of the RPC method.
@@ -709,36 +725,36 @@
     Returns:
       A StreamStreamMultiCallable value for the named stream-stream method.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
 ##########################  Service-Side Context  ##############################
 
 
 class ServicerContext(six.with_metaclass(abc.ABCMeta, RpcContext)):
-  """A context object passed to method implementations."""
+    """A context object passed to method implementations."""
 
-  @abc.abstractmethod
-  def invocation_metadata(self):
-    """Accesses the metadata from the invocation-side of the RPC.
+    @abc.abstractmethod
+    def invocation_metadata(self):
+        """Accesses the metadata from the invocation-side of the RPC.
 
     Returns:
       The invocation :term:`metadata`.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def peer(self):
-    """Identifies the peer that invoked the RPC being serviced.
+    @abc.abstractmethod
+    def peer(self):
+        """Identifies the peer that invoked the RPC being serviced.
 
     Returns:
       A string identifying the peer that invoked the RPC being serviced.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def send_initial_metadata(self, initial_metadata):
-    """Sends the initial metadata value to the invocation-side of the RPC.
+    @abc.abstractmethod
+    def send_initial_metadata(self, initial_metadata):
+        """Sends the initial metadata value to the invocation-side of the RPC.
 
     This method need not be called by method implementations if they have no
     service-side initial metadata to transmit.
@@ -746,11 +762,11 @@
     Args:
       initial_metadata: The initial :term:`metadata`.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def set_trailing_metadata(self, trailing_metadata):
-    """Accepts the trailing metadata value of the RPC.
+    @abc.abstractmethod
+    def set_trailing_metadata(self, trailing_metadata):
+        """Accepts the trailing metadata value of the RPC.
 
     This method need not be called by method implementations if they have no
     service-side trailing metadata to transmit.
@@ -758,11 +774,11 @@
     Args:
       trailing_metadata: The trailing :term:`metadata`.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def set_code(self, code):
-    """Accepts the status code of the RPC.
+    @abc.abstractmethod
+    def set_code(self, code):
+        """Accepts the status code of the RPC.
 
     This method need not be called by method implementations if they wish the
     gRPC runtime to determine the status code of the RPC.
@@ -771,11 +787,11 @@
       code: A StatusCode value to be transmitted to the invocation side of the
         RPC as the status code of the RPC.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def set_details(self, details):
-    """Accepts the service-side details of the RPC.
+    @abc.abstractmethod
+    def set_details(self, details):
+        """Accepts the service-side details of the RPC.
 
     This method need not be called by method implementations if they have no
     details to transmit.
@@ -784,14 +800,14 @@
       details: A string to be transmitted to the invocation side of the RPC as
         the status details of the RPC.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
 #####################  Service-Side Handler Interfaces  ########################
 
 
 class RpcMethodHandler(six.with_metaclass(abc.ABCMeta)):
-  """An implementation of a single RPC method.
+    """An implementation of a single RPC method.
 
   Attributes:
     request_streaming: Whether the RPC supports exactly one request message or
@@ -826,7 +842,7 @@
 
 
 class HandlerCallDetails(six.with_metaclass(abc.ABCMeta)):
-  """Describes an RPC that has just arrived for service.
+    """Describes an RPC that has just arrived for service.
   Attributes:
     method: The method name of the RPC.
     invocation_metadata: The :term:`metadata` from the invocation side of the RPC.
@@ -834,11 +850,11 @@
 
 
 class GenericRpcHandler(six.with_metaclass(abc.ABCMeta)):
-  """An implementation of arbitrarily many RPC methods."""
+    """An implementation of arbitrarily many RPC methods."""
 
-  @abc.abstractmethod
-  def service(self, handler_call_details):
-    """Services an RPC (or not).
+    @abc.abstractmethod
+    def service(self, handler_call_details):
+        """Services an RPC (or not).
 
     Args:
       handler_call_details: A HandlerCallDetails describing the RPC.
@@ -847,11 +863,11 @@
       An RpcMethodHandler with which the RPC may be serviced, or None to
         indicate that this object will not be servicing the RPC.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
 class ServiceRpcHandler(six.with_metaclass(abc.ABCMeta, GenericRpcHandler)):
-  """An implementation of RPC methods belonging to a service.
+    """An implementation of RPC methods belonging to a service.
 
   A service handles RPC methods with structured names of the form
   '/Service.Name/Service.MethodX', where 'Service.Name' is the value
@@ -860,25 +876,25 @@
   service name.
   """
 
-  @abc.abstractmethod
-  def service_name(self):
-    """Returns this services name.
+    @abc.abstractmethod
+    def service_name(self):
+        """Returns this services name.
 
     Returns:
       The service name.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
 #############################  Server Interface  ###############################
 
 
 class Server(six.with_metaclass(abc.ABCMeta)):
-  """Services RPCs."""
+    """Services RPCs."""
 
-  @abc.abstractmethod
-  def add_generic_rpc_handlers(self, generic_rpc_handlers):
-    """Registers GenericRpcHandlers with this Server.
+    @abc.abstractmethod
+    def add_generic_rpc_handlers(self, generic_rpc_handlers):
+        """Registers GenericRpcHandlers with this Server.
 
     This method is only safe to call before the server is started.
 
@@ -886,11 +902,11 @@
       generic_rpc_handlers: An iterable of GenericRpcHandlers that will be used
         to service RPCs after this Server is started.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def add_insecure_port(self, address):
-    """Reserves a port for insecure RPC service once this Server becomes active.
+    @abc.abstractmethod
+    def add_insecure_port(self, address):
+        """Reserves a port for insecure RPC service once this Server becomes active.
 
     This method may only be called before calling this Server's start method is
     called.
@@ -904,11 +920,11 @@
         in the passed address, but will likely be different if the port number
         contained in the passed address was zero.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def add_secure_port(self, address, server_credentials):
-    """Reserves a port for secure RPC service after this Server becomes active.
+    @abc.abstractmethod
+    def add_secure_port(self, address, server_credentials):
+        """Reserves a port for secure RPC service after this Server becomes active.
 
     This method may only be called before calling this Server's start method is
     called.
@@ -923,20 +939,20 @@
         in the passed address, but will likely be different if the port number
         contained in the passed address was zero.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def start(self):
-    """Starts this Server's service of RPCs.
+    @abc.abstractmethod
+    def start(self):
+        """Starts this Server's service of RPCs.
 
     This method may only be called while the server is not serving RPCs (i.e. it
     is not idempotent).
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def stop(self, grace):
-    """Stops this Server's service of RPCs.
+    @abc.abstractmethod
+    def stop(self, grace):
+        """Stops this Server's service of RPCs.
 
     All calls to this method immediately stop service of new RPCs. When existing
     RPCs are aborted is controlled by the grace period parameter passed to this
@@ -967,15 +983,16 @@
       at the time it was stopped or if all RPCs that it had underway completed
       very early in the grace period).
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
 #################################  Functions    ################################
 
 
-def unary_unary_rpc_method_handler(
-    behavior, request_deserializer=None, response_serializer=None):
-  """Creates an RpcMethodHandler for a unary-unary RPC method.
+def unary_unary_rpc_method_handler(behavior,
+                                   request_deserializer=None,
+                                   response_serializer=None):
+    """Creates an RpcMethodHandler for a unary-unary RPC method.
 
   Args:
     behavior: The implementation of an RPC method as a callable behavior taking
@@ -987,15 +1004,16 @@
     An RpcMethodHandler for a unary-unary RPC method constructed from the given
       parameters.
   """
-  from grpc import _utilities
-  return _utilities.RpcMethodHandler(
-      False, False, request_deserializer, response_serializer, behavior, None,
-      None, None)
+    from grpc import _utilities
+    return _utilities.RpcMethodHandler(False, False, request_deserializer,
+                                       response_serializer, behavior, None,
+                                       None, None)
 
 
-def unary_stream_rpc_method_handler(
-    behavior, request_deserializer=None, response_serializer=None):
-  """Creates an RpcMethodHandler for a unary-stream RPC method.
+def unary_stream_rpc_method_handler(behavior,
+                                    request_deserializer=None,
+                                    response_serializer=None):
+    """Creates an RpcMethodHandler for a unary-stream RPC method.
 
   Args:
     behavior: The implementation of an RPC method as a callable behavior taking
@@ -1007,15 +1025,16 @@
     An RpcMethodHandler for a unary-stream RPC method constructed from the
       given parameters.
   """
-  from grpc import _utilities
-  return _utilities.RpcMethodHandler(
-      False, True, request_deserializer, response_serializer, None, behavior,
-      None, None)
+    from grpc import _utilities
+    return _utilities.RpcMethodHandler(False, True, request_deserializer,
+                                       response_serializer, None, behavior,
+                                       None, None)
 
 
-def stream_unary_rpc_method_handler(
-    behavior, request_deserializer=None, response_serializer=None):
-  """Creates an RpcMethodHandler for a stream-unary RPC method.
+def stream_unary_rpc_method_handler(behavior,
+                                    request_deserializer=None,
+                                    response_serializer=None):
+    """Creates an RpcMethodHandler for a stream-unary RPC method.
 
   Args:
     behavior: The implementation of an RPC method as a callable behavior taking
@@ -1027,15 +1046,16 @@
     An RpcMethodHandler for a stream-unary RPC method constructed from the
       given parameters.
   """
-  from grpc import _utilities
-  return _utilities.RpcMethodHandler(
-      True, False, request_deserializer, response_serializer, None, None,
-      behavior, None)
+    from grpc import _utilities
+    return _utilities.RpcMethodHandler(True, False, request_deserializer,
+                                       response_serializer, None, None,
+                                       behavior, None)
 
 
-def stream_stream_rpc_method_handler(
-        behavior, request_deserializer=None, response_serializer=None):
-  """Creates an RpcMethodHandler for a stream-stream RPC method.
+def stream_stream_rpc_method_handler(behavior,
+                                     request_deserializer=None,
+                                     response_serializer=None):
+    """Creates an RpcMethodHandler for a stream-stream RPC method.
 
   Args:
     behavior: The implementation of an RPC method as a callable behavior taking
@@ -1048,14 +1068,14 @@
     An RpcMethodHandler for a stream-stream RPC method constructed from the
       given parameters.
   """
-  from grpc import _utilities
-  return _utilities.RpcMethodHandler(
-      True, True, request_deserializer, response_serializer, None, None, None,
-      behavior)
+    from grpc import _utilities
+    return _utilities.RpcMethodHandler(True, True, request_deserializer,
+                                       response_serializer, None, None, None,
+                                       behavior)
 
 
 def method_handlers_generic_handler(service, method_handlers):
-  """Creates a grpc.GenericRpcHandler from RpcMethodHandlers.
+    """Creates a grpc.GenericRpcHandler from RpcMethodHandlers.
 
   Args:
     service: A service name to be used for the given method handlers.
@@ -1065,13 +1085,14 @@
   Returns:
     A GenericRpcHandler constructed from the given parameters.
   """
-  from grpc import _utilities
-  return _utilities.DictionaryGenericHandler(service, method_handlers)
+    from grpc import _utilities
+    return _utilities.DictionaryGenericHandler(service, method_handlers)
 
 
-def ssl_channel_credentials(
-    root_certificates=None, private_key=None, certificate_chain=None):
-  """Creates a ChannelCredentials for use with an SSL-enabled Channel.
+def ssl_channel_credentials(root_certificates=None,
+                            private_key=None,
+                            certificate_chain=None):
+    """Creates a ChannelCredentials for use with an SSL-enabled Channel.
 
   Args:
     root_certificates: The PEM-encoded root certificates or unset to ask for
@@ -1084,16 +1105,16 @@
   Returns:
     A ChannelCredentials for use with an SSL-enabled Channel.
   """
-  if private_key is not None or certificate_chain is not None:
-    pair = _cygrpc.SslPemKeyCertPair(private_key, certificate_chain)
-  else:
-    pair = None
-  return ChannelCredentials(
-      _cygrpc.channel_credentials_ssl(root_certificates, pair))
+    if private_key is not None or certificate_chain is not None:
+        pair = _cygrpc.SslPemKeyCertPair(private_key, certificate_chain)
+    else:
+        pair = None
+    return ChannelCredentials(
+        _cygrpc.channel_credentials_ssl(root_certificates, pair))
 
 
 def metadata_call_credentials(metadata_plugin, name=None):
-  """Construct CallCredentials from an AuthMetadataPlugin.
+    """Construct CallCredentials from an AuthMetadataPlugin.
 
   Args:
     metadata_plugin: An AuthMetadataPlugin to use as the authentication behavior
@@ -1103,21 +1124,21 @@
   Returns:
     A CallCredentials.
   """
-  from grpc import _plugin_wrapping
-  if name is None:
-    try:
-      effective_name = metadata_plugin.__name__
-    except AttributeError:
-      effective_name = metadata_plugin.__class__.__name__
-  else:
-    effective_name = name
-  return CallCredentials(
-      _plugin_wrapping.call_credentials_metadata_plugin(
-          metadata_plugin, effective_name))
+    from grpc import _plugin_wrapping
+    if name is None:
+        try:
+            effective_name = metadata_plugin.__name__
+        except AttributeError:
+            effective_name = metadata_plugin.__class__.__name__
+    else:
+        effective_name = name
+    return CallCredentials(
+        _plugin_wrapping.call_credentials_metadata_plugin(metadata_plugin,
+                                                          effective_name))
 
 
 def access_token_call_credentials(access_token):
-  """Construct CallCredentials from an access token.
+    """Construct CallCredentials from an access token.
 
   Args:
     access_token: A string to place directly in the http request
@@ -1126,13 +1147,13 @@
   Returns:
     A CallCredentials.
   """
-  from grpc import _auth
-  return metadata_call_credentials(
-      _auth.AccessTokenCallCredentials(access_token))
+    from grpc import _auth
+    return metadata_call_credentials(
+        _auth.AccessTokenCallCredentials(access_token))
 
 
 def composite_call_credentials(*call_credentials):
-  """Compose multiple CallCredentials to make a new CallCredentials.
+    """Compose multiple CallCredentials to make a new CallCredentials.
 
   Args:
     *call_credentials: At least two CallCredentials objects.
@@ -1140,16 +1161,16 @@
   Returns:
     A CallCredentials object composed of the given CallCredentials objects.
   """
-  from grpc import _credential_composition
-  cygrpc_call_credentials = tuple(
-      single_call_credentials._credentials
-      for single_call_credentials in call_credentials)
-  return CallCredentials(
-      _credential_composition.call(cygrpc_call_credentials))
+    from grpc import _credential_composition
+    cygrpc_call_credentials = tuple(
+        single_call_credentials._credentials
+        for single_call_credentials in call_credentials)
+    return CallCredentials(
+        _credential_composition.call(cygrpc_call_credentials))
 
 
 def composite_channel_credentials(channel_credentials, *call_credentials):
-  """Compose a ChannelCredentials and one or more CallCredentials objects.
+    """Compose a ChannelCredentials and one or more CallCredentials objects.
 
   Args:
     channel_credentials: A ChannelCredentials.
@@ -1159,19 +1180,19 @@
     A ChannelCredentials composed of the given ChannelCredentials and
       CallCredentials objects.
   """
-  from grpc import _credential_composition
-  cygrpc_call_credentials = tuple(
-      single_call_credentials._credentials
-      for single_call_credentials in call_credentials)
-  return ChannelCredentials(
-      _credential_composition.channel(
-          channel_credentials._credentials, cygrpc_call_credentials))
+    from grpc import _credential_composition
+    cygrpc_call_credentials = tuple(
+        single_call_credentials._credentials
+        for single_call_credentials in call_credentials)
+    return ChannelCredentials(
+        _credential_composition.channel(channel_credentials._credentials,
+                                        cygrpc_call_credentials))
 
 
-def ssl_server_credentials(
-    private_key_certificate_chain_pairs, root_certificates=None,
-    require_client_auth=False):
-  """Creates a ServerCredentials for use with an SSL-enabled Server.
+def ssl_server_credentials(private_key_certificate_chain_pairs,
+                           root_certificates=None,
+                           require_client_auth=False):
+    """Creates a ServerCredentials for use with an SSL-enabled Server.
 
   Args:
     private_key_certificate_chain_pairs: A nonempty sequence each element of
@@ -1187,23 +1208,23 @@
   Returns:
     A ServerCredentials for use with an SSL-enabled Server.
   """
-  if len(private_key_certificate_chain_pairs) == 0:
-    raise ValueError(
-        'At least one private key-certificate chain pair is required!')
-  elif require_client_auth and root_certificates is None:
-    raise ValueError(
-        'Illegal to require client auth without providing root certificates!')
-  else:
-    return ServerCredentials(
-        _cygrpc.server_credentials_ssl(
-        root_certificates,
-        [_cygrpc.SslPemKeyCertPair(key, pem)
-         for key, pem in private_key_certificate_chain_pairs],
-        require_client_auth))
+    if len(private_key_certificate_chain_pairs) == 0:
+        raise ValueError(
+            'At least one private key-certificate chain pair is required!')
+    elif require_client_auth and root_certificates is None:
+        raise ValueError(
+            'Illegal to require client auth without providing root certificates!'
+        )
+    else:
+        return ServerCredentials(
+            _cygrpc.server_credentials_ssl(root_certificates, [
+                _cygrpc.SslPemKeyCertPair(key, pem)
+                for key, pem in private_key_certificate_chain_pairs
+            ], require_client_auth))
 
 
 def channel_ready_future(channel):
-  """Creates a Future tracking when a Channel is ready.
+    """Creates a Future tracking when a Channel is ready.
 
   Cancelling the returned Future does not tell the given Channel to abandon
   attempts it may have been making to connect; cancelling merely deactivates the
@@ -1216,12 +1237,12 @@
     A Future that matures when the given Channel has connectivity
       ChannelConnectivity.READY.
   """
-  from grpc import _utilities
-  return _utilities.channel_ready_future(channel)
+    from grpc import _utilities
+    return _utilities.channel_ready_future(channel)
 
 
 def insecure_channel(target, options=None):
-  """Creates an insecure Channel to a server.
+    """Creates an insecure Channel to a server.
 
   Args:
     target: The target to which to connect.
@@ -1231,12 +1252,12 @@
   Returns:
     A Channel to the target through which RPCs may be conducted.
   """
-  from grpc import _channel
-  return _channel.Channel(target, () if options is None else options, None)
+    from grpc import _channel
+    return _channel.Channel(target, () if options is None else options, None)
 
 
 def secure_channel(target, credentials, options=None):
-  """Creates a secure Channel to a server.
+    """Creates a secure Channel to a server.
 
   Args:
     target: The target to which to connect.
@@ -1247,13 +1268,13 @@
   Returns:
     A Channel to the target through which RPCs may be conducted.
   """
-  from grpc import _channel
-  return _channel.Channel(target, () if options is None else options,
-                          credentials._credentials)
+    from grpc import _channel
+    return _channel.Channel(target, () if options is None else options,
+                            credentials._credentials)
 
 
 def server(thread_pool, handlers=None, options=None):
-  """Creates a Server with which RPCs can be serviced.
+    """Creates a Server with which RPCs can be serviced.
 
   Args:
     thread_pool: A futures.ThreadPoolExecutor to be used by the returned Server
@@ -1269,14 +1290,13 @@
   Returns:
     A Server with which RPCs can be serviced.
   """
-  from grpc import _server
-  return _server.Server(thread_pool, () if handlers is None else handlers,
-                        () if options is None else options)
+    from grpc import _server
+    return _server.Server(thread_pool, () if handlers is None else handlers, ()
+                          if options is None else options)
 
 
 ###################################  __all__  #################################
 
-
 __all__ = (
     'FutureTimeoutError',
     'FutureCancelledError',
@@ -1317,26 +1337,23 @@
     'channel_ready_future',
     'insecure_channel',
     'secure_channel',
-    'server',
-)
-
+    'server',)
 
 ############################### Extension Shims ################################
 
-
 # Here to maintain backwards compatibility; avoid using these in new code!
 try:
-  import grpc_tools
-  sys.modules.update({'grpc.tools': grpc_tools})
+    import grpc_tools
+    sys.modules.update({'grpc.tools': grpc_tools})
 except ImportError:
-  pass
+    pass
 try:
-  import grpc_health
-  sys.modules.update({'grpc.health': grpc_health})
+    import grpc_health
+    sys.modules.update({'grpc.health': grpc_health})
 except ImportError:
-  pass
+    pass
 try:
-  import grpc_reflection
-  sys.modules.update({'grpc.reflection': grpc_reflection})
+    import grpc_reflection
+    sys.modules.update({'grpc.reflection': grpc_reflection})
 except ImportError:
-  pass
+    pass
diff --git a/src/python/grpcio/grpc/_auth.py b/src/python/grpcio/grpc/_auth.py
index dea3221..e8a90cf 100644
--- a/src/python/grpcio/grpc/_auth.py
+++ b/src/python/grpcio/grpc/_auth.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """GRPCAuthMetadataPlugins for standard authentication."""
 
 import inspect
@@ -36,51 +35,53 @@
 
 
 def _sign_request(callback, token, error):
-  metadata = (('authorization', 'Bearer {}'.format(token)),)
-  callback(metadata, error)
+    metadata = (('authorization', 'Bearer {}'.format(token)),)
+    callback(metadata, error)
 
 
 class GoogleCallCredentials(grpc.AuthMetadataPlugin):
-  """Metadata wrapper for GoogleCredentials from the oauth2client library."""
+    """Metadata wrapper for GoogleCredentials from the oauth2client library."""
 
-  def __init__(self, credentials):
-    self._credentials = credentials
-    self._pool = futures.ThreadPoolExecutor(max_workers=1)
+    def __init__(self, credentials):
+        self._credentials = credentials
+        self._pool = futures.ThreadPoolExecutor(max_workers=1)
 
-    # Hack to determine if these are JWT creds and we need to pass
-    # additional_claims when getting a token
-    if 'additional_claims' in inspect.getargspec(
-        credentials.get_access_token).args:
-      self._is_jwt = True
-    else:
-      self._is_jwt = False
+        # Hack to determine if these are JWT creds and we need to pass
+        # additional_claims when getting a token
+        if 'additional_claims' in inspect.getargspec(
+                credentials.get_access_token).args:
+            self._is_jwt = True
+        else:
+            self._is_jwt = False
 
-  def __call__(self, context, callback):
-    # MetadataPlugins cannot block (see grpc.beta.interfaces.py)
-    if self._is_jwt:
-      future = self._pool.submit(self._credentials.get_access_token,
-                                 additional_claims={'aud': context.service_url})
-    else:
-      future = self._pool.submit(self._credentials.get_access_token)
-    future.add_done_callback(lambda x: self._get_token_callback(callback, x))
+    def __call__(self, context, callback):
+        # MetadataPlugins cannot block (see grpc.beta.interfaces.py)
+        if self._is_jwt:
+            future = self._pool.submit(
+                self._credentials.get_access_token,
+                additional_claims={'aud': context.service_url})
+        else:
+            future = self._pool.submit(self._credentials.get_access_token)
+        future.add_done_callback(
+            lambda x: self._get_token_callback(callback, x))
 
-  def _get_token_callback(self, callback, future):
-    try:
-      access_token = future.result().access_token
-    except Exception as e:
-      _sign_request(callback, None, e)
-    else:
-      _sign_request(callback, access_token, None)
+    def _get_token_callback(self, callback, future):
+        try:
+            access_token = future.result().access_token
+        except Exception as e:
+            _sign_request(callback, None, e)
+        else:
+            _sign_request(callback, access_token, None)
 
-  def __del__(self):
-    self._pool.shutdown(wait=False)
+    def __del__(self):
+        self._pool.shutdown(wait=False)
 
 
 class AccessTokenCallCredentials(grpc.AuthMetadataPlugin):
-  """Metadata wrapper for raw access token credentials."""
+    """Metadata wrapper for raw access token credentials."""
 
-  def __init__(self, access_token):
-    self._access_token = access_token
+    def __init__(self, access_token):
+        self._access_token = access_token
 
-  def __call__(self, context, callback):
-    _sign_request(callback, self._access_token, None)
+    def __call__(self, context, callback):
+        _sign_request(callback, self._access_token, None)
diff --git a/src/python/grpcio/grpc/_channel.py b/src/python/grpcio/grpc/_channel.py
index e8c6a99..5a8a3d4 100644
--- a/src/python/grpcio/grpc/_channel.py
+++ b/src/python/grpcio/grpc/_channel.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Invocation-side implementation of gRPC Python."""
 
 import sys
@@ -52,692 +51,710 @@
     cygrpc.OperationType.send_close_from_client,
     cygrpc.OperationType.receive_initial_metadata,
     cygrpc.OperationType.receive_message,
-    cygrpc.OperationType.receive_status_on_client,
-)
+    cygrpc.OperationType.receive_status_on_client,)
 _UNARY_STREAM_INITIAL_DUE = (
     cygrpc.OperationType.send_initial_metadata,
     cygrpc.OperationType.send_message,
     cygrpc.OperationType.send_close_from_client,
     cygrpc.OperationType.receive_initial_metadata,
-    cygrpc.OperationType.receive_status_on_client,
-)
+    cygrpc.OperationType.receive_status_on_client,)
 _STREAM_UNARY_INITIAL_DUE = (
     cygrpc.OperationType.send_initial_metadata,
     cygrpc.OperationType.receive_initial_metadata,
     cygrpc.OperationType.receive_message,
-    cygrpc.OperationType.receive_status_on_client,
-)
+    cygrpc.OperationType.receive_status_on_client,)
 _STREAM_STREAM_INITIAL_DUE = (
     cygrpc.OperationType.send_initial_metadata,
     cygrpc.OperationType.receive_initial_metadata,
-    cygrpc.OperationType.receive_status_on_client,
-)
+    cygrpc.OperationType.receive_status_on_client,)
 
 _CHANNEL_SUBSCRIPTION_CALLBACK_ERROR_LOG_MESSAGE = (
     'Exception calling channel subscription callback!')
 
 
 def _deadline(timeout):
-  if timeout is None:
-    return None, _INFINITE_FUTURE
-  else:
-    deadline = time.time() + timeout
-    return deadline, cygrpc.Timespec(deadline)
+    if timeout is None:
+        return None, _INFINITE_FUTURE
+    else:
+        deadline = time.time() + timeout
+        return deadline, cygrpc.Timespec(deadline)
 
 
 def _unknown_code_details(unknown_cygrpc_code, details):
-  return 'Server sent unknown code {} and details "{}"'.format(
-      unknown_cygrpc_code, details)
+    return 'Server sent unknown code {} and details "{}"'.format(
+        unknown_cygrpc_code, details)
 
 
 def _wait_once_until(condition, until):
-  if until is None:
-    condition.wait()
-  else:
-    remaining = until - time.time()
-    if remaining < 0:
-      raise grpc.FutureTimeoutError()
+    if until is None:
+        condition.wait()
     else:
-      condition.wait(timeout=remaining)
+        remaining = until - time.time()
+        if remaining < 0:
+            raise grpc.FutureTimeoutError()
+        else:
+            condition.wait(timeout=remaining)
+
 
 _INTERNAL_CALL_ERROR_MESSAGE_FORMAT = (
     'Internal gRPC call error %d. ' +
     'Please report to https://github.com/grpc/grpc/issues')
 
+
 def _check_call_error(call_error, metadata):
-  if call_error == cygrpc.CallError.invalid_metadata:
-    raise ValueError('metadata was invalid: %s' % metadata)
-  elif call_error != cygrpc.CallError.ok:
-    raise ValueError(_INTERNAL_CALL_ERROR_MESSAGE_FORMAT % call_error)
+    if call_error == cygrpc.CallError.invalid_metadata:
+        raise ValueError('metadata was invalid: %s' % metadata)
+    elif call_error != cygrpc.CallError.ok:
+        raise ValueError(_INTERNAL_CALL_ERROR_MESSAGE_FORMAT % call_error)
+
 
 def _call_error_set_RPCstate(state, call_error, metadata):
-  if call_error == cygrpc.CallError.invalid_metadata:
-    _abort(state, grpc.StatusCode.INTERNAL, 'metadata was invalid: %s' % metadata)
-  else:
-    _abort(state, grpc.StatusCode.INTERNAL, 
-        _INTERNAL_CALL_ERROR_MESSAGE_FORMAT % call_error)
+    if call_error == cygrpc.CallError.invalid_metadata:
+        _abort(state, grpc.StatusCode.INTERNAL,
+               'metadata was invalid: %s' % metadata)
+    else:
+        _abort(state, grpc.StatusCode.INTERNAL,
+               _INTERNAL_CALL_ERROR_MESSAGE_FORMAT % call_error)
+
 
 class _RPCState(object):
 
-  def __init__(self, due, initial_metadata, trailing_metadata, code, details):
-    self.condition = threading.Condition()
-    # The cygrpc.OperationType objects representing events due from the RPC's
-    # completion queue.
-    self.due = set(due)
-    self.initial_metadata = initial_metadata
-    self.response = None
-    self.trailing_metadata = trailing_metadata
-    self.code = code
-    self.details = details
-    # The semantics of grpc.Future.cancel and grpc.Future.cancelled are
-    # slightly wonky, so they have to be tracked separately from the rest of the
-    # result of the RPC. This field tracks whether cancellation was requested
-    # prior to termination of the RPC.
-    self.cancelled = False
-    self.callbacks = []
+    def __init__(self, due, initial_metadata, trailing_metadata, code, details):
+        self.condition = threading.Condition()
+        # The cygrpc.OperationType objects representing events due from the RPC's
+        # completion queue.
+        self.due = set(due)
+        self.initial_metadata = initial_metadata
+        self.response = None
+        self.trailing_metadata = trailing_metadata
+        self.code = code
+        self.details = details
+        # The semantics of grpc.Future.cancel and grpc.Future.cancelled are
+        # slightly wonky, so they have to be tracked separately from the rest of the
+        # result of the RPC. This field tracks whether cancellation was requested
+        # prior to termination of the RPC.
+        self.cancelled = False
+        self.callbacks = []
 
 
 def _abort(state, code, details):
-  if state.code is None:
-    state.code = code
-    state.details = details
-    if state.initial_metadata is None:
-      state.initial_metadata = _EMPTY_METADATA
-    state.trailing_metadata = _EMPTY_METADATA
+    if state.code is None:
+        state.code = code
+        state.details = details
+        if state.initial_metadata is None:
+            state.initial_metadata = _EMPTY_METADATA
+        state.trailing_metadata = _EMPTY_METADATA
 
 
 def _handle_event(event, state, response_deserializer):
-  callbacks = []
-  for batch_operation in event.batch_operations:
-    operation_type = batch_operation.type
-    state.due.remove(operation_type)
-    if operation_type == cygrpc.OperationType.receive_initial_metadata:
-      state.initial_metadata = batch_operation.received_metadata
-    elif operation_type == cygrpc.OperationType.receive_message:
-      serialized_response = batch_operation.received_message.bytes()
-      if serialized_response is not None:
-        response = _common.deserialize(
-            serialized_response, response_deserializer)
-        if response is None:
-          details = 'Exception deserializing response!'
-          _abort(state, grpc.StatusCode.INTERNAL, details)
-        else:
-          state.response = response
-    elif operation_type == cygrpc.OperationType.receive_status_on_client:
-      state.trailing_metadata = batch_operation.received_metadata
-      if state.code is None:
-        code = _common.CYGRPC_STATUS_CODE_TO_STATUS_CODE.get(
-            batch_operation.received_status_code)
-        if code is None:
-          state.code = grpc.StatusCode.UNKNOWN
-          state.details = _unknown_code_details(
-              batch_operation.received_status_code,
-              batch_operation.received_status_details)
-        else:
-          state.code = code
-          state.details = batch_operation.received_status_details
-      callbacks.extend(state.callbacks)
-      state.callbacks = None
-  return callbacks
+    callbacks = []
+    for batch_operation in event.batch_operations:
+        operation_type = batch_operation.type
+        state.due.remove(operation_type)
+        if operation_type == cygrpc.OperationType.receive_initial_metadata:
+            state.initial_metadata = batch_operation.received_metadata
+        elif operation_type == cygrpc.OperationType.receive_message:
+            serialized_response = batch_operation.received_message.bytes()
+            if serialized_response is not None:
+                response = _common.deserialize(serialized_response,
+                                               response_deserializer)
+                if response is None:
+                    details = 'Exception deserializing response!'
+                    _abort(state, grpc.StatusCode.INTERNAL, details)
+                else:
+                    state.response = response
+        elif operation_type == cygrpc.OperationType.receive_status_on_client:
+            state.trailing_metadata = batch_operation.received_metadata
+            if state.code is None:
+                code = _common.CYGRPC_STATUS_CODE_TO_STATUS_CODE.get(
+                    batch_operation.received_status_code)
+                if code is None:
+                    state.code = grpc.StatusCode.UNKNOWN
+                    state.details = _unknown_code_details(
+                        batch_operation.received_status_code,
+                        batch_operation.received_status_details)
+                else:
+                    state.code = code
+                    state.details = batch_operation.received_status_details
+            callbacks.extend(state.callbacks)
+            state.callbacks = None
+    return callbacks
 
 
 def _event_handler(state, call, response_deserializer):
-  def handle_event(event):
-    with state.condition:
-      callbacks = _handle_event(event, state, response_deserializer)
-      state.condition.notify_all()
-      done = not state.due
-    for callback in callbacks:
-      callback()
-    return call if done else None
-  return handle_event
+
+    def handle_event(event):
+        with state.condition:
+            callbacks = _handle_event(event, state, response_deserializer)
+            state.condition.notify_all()
+            done = not state.due
+        for callback in callbacks:
+            callback()
+        return call if done else None
+
+    return handle_event
 
 
-def _consume_request_iterator(
-    request_iterator, state, call, request_serializer):
-  event_handler = _event_handler(state, call, None)
+def _consume_request_iterator(request_iterator, state, call,
+                              request_serializer):
+    event_handler = _event_handler(state, call, None)
 
-  def consume_request_iterator():
-    while True:
-      try:
-        request = next(request_iterator)
-      except StopIteration:
-        break
-      except Exception as e:
-        logging.exception("Exception iterating requests!")
-        call.cancel()
-        _abort(state, grpc.StatusCode.UNKNOWN, "Exception iterating requests!")
-        return
-      serialized_request = _common.serialize(request, request_serializer)
-      with state.condition:
-        if state.code is None and not state.cancelled:
-          if serialized_request is None:
-            call.cancel()
-            details = 'Exception serializing request!'
-            _abort(state, grpc.StatusCode.INTERNAL, details)
-            return
-          else:
-            operations = (
-                cygrpc.operation_send_message(
-                    serialized_request, _EMPTY_FLAGS),
-            )
-            call.start_client_batch(cygrpc.Operations(operations),
-                                    event_handler)
-            state.due.add(cygrpc.OperationType.send_message)
-            while True:
-              state.condition.wait()
-              if state.code is None:
-                if cygrpc.OperationType.send_message not in state.due:
-                  break
-              else:
+    def consume_request_iterator():
+        while True:
+            try:
+                request = next(request_iterator)
+            except StopIteration:
+                break
+            except Exception as e:
+                logging.exception("Exception iterating requests!")
+                call.cancel()
+                _abort(state, grpc.StatusCode.UNKNOWN,
+                       "Exception iterating requests!")
                 return
-        else:
-          return
-    with state.condition:
-      if state.code is None:
-        operations = (
-            cygrpc.operation_send_close_from_client(_EMPTY_FLAGS),
-        )
-        call.start_client_batch(cygrpc.Operations(operations), event_handler)
-        state.due.add(cygrpc.OperationType.send_close_from_client)
+            serialized_request = _common.serialize(request, request_serializer)
+            with state.condition:
+                if state.code is None and not state.cancelled:
+                    if serialized_request is None:
+                        call.cancel()
+                        details = 'Exception serializing request!'
+                        _abort(state, grpc.StatusCode.INTERNAL, details)
+                        return
+                    else:
+                        operations = (cygrpc.operation_send_message(
+                            serialized_request, _EMPTY_FLAGS),)
+                        call.start_client_batch(
+                            cygrpc.Operations(operations), event_handler)
+                        state.due.add(cygrpc.OperationType.send_message)
+                        while True:
+                            state.condition.wait()
+                            if state.code is None:
+                                if cygrpc.OperationType.send_message not in state.due:
+                                    break
+                            else:
+                                return
+                else:
+                    return
+        with state.condition:
+            if state.code is None:
+                operations = (
+                    cygrpc.operation_send_close_from_client(_EMPTY_FLAGS),)
+                call.start_client_batch(
+                    cygrpc.Operations(operations), event_handler)
+                state.due.add(cygrpc.OperationType.send_close_from_client)
 
-  def stop_consumption_thread(timeout):
-    with state.condition:
-      if state.code is None:
-        call.cancel()
-        state.cancelled = True
-        _abort(state, grpc.StatusCode.CANCELLED, 'Cancelled!')
-        state.condition.notify_all()
+    def stop_consumption_thread(timeout):
+        with state.condition:
+            if state.code is None:
+                call.cancel()
+                state.cancelled = True
+                _abort(state, grpc.StatusCode.CANCELLED, 'Cancelled!')
+                state.condition.notify_all()
 
-  consumption_thread = _common.CleanupThread(
-      stop_consumption_thread, target=consume_request_iterator)
-  consumption_thread.start()
+    consumption_thread = _common.CleanupThread(
+        stop_consumption_thread, target=consume_request_iterator)
+    consumption_thread.start()
 
 
 class _Rendezvous(grpc.RpcError, grpc.Future, grpc.Call):
 
-  def __init__(self, state, call, response_deserializer, deadline):
-    super(_Rendezvous, self).__init__()
-    self._state = state
-    self._call = call
-    self._response_deserializer = response_deserializer
-    self._deadline = deadline
+    def __init__(self, state, call, response_deserializer, deadline):
+        super(_Rendezvous, self).__init__()
+        self._state = state
+        self._call = call
+        self._response_deserializer = response_deserializer
+        self._deadline = deadline
 
-  def cancel(self):
-    with self._state.condition:
-      if self._state.code is None:
-        self._call.cancel()
-        self._state.cancelled = True
-        _abort(self._state, grpc.StatusCode.CANCELLED, 'Cancelled!')
-        self._state.condition.notify_all()
-      return False
+    def cancel(self):
+        with self._state.condition:
+            if self._state.code is None:
+                self._call.cancel()
+                self._state.cancelled = True
+                _abort(self._state, grpc.StatusCode.CANCELLED, 'Cancelled!')
+                self._state.condition.notify_all()
+            return False
 
-  def cancelled(self):
-    with self._state.condition:
-      return self._state.cancelled
+    def cancelled(self):
+        with self._state.condition:
+            return self._state.cancelled
 
-  def running(self):
-    with self._state.condition:
-      return self._state.code is None
+    def running(self):
+        with self._state.condition:
+            return self._state.code is None
 
-  def done(self):
-    with self._state.condition:
-      return self._state.code is not None
+    def done(self):
+        with self._state.condition:
+            return self._state.code is not None
 
-  def result(self, timeout=None):
-    until = None if timeout is None else time.time() + timeout
-    with self._state.condition:
-      while True:
-        if self._state.code is None:
-          _wait_once_until(self._state.condition, until)
-        elif self._state.code is grpc.StatusCode.OK:
-          return self._state.response
-        elif self._state.cancelled:
-          raise grpc.FutureCancelledError()
+    def result(self, timeout=None):
+        until = None if timeout is None else time.time() + timeout
+        with self._state.condition:
+            while True:
+                if self._state.code is None:
+                    _wait_once_until(self._state.condition, until)
+                elif self._state.code is grpc.StatusCode.OK:
+                    return self._state.response
+                elif self._state.cancelled:
+                    raise grpc.FutureCancelledError()
+                else:
+                    raise self
+
+    def exception(self, timeout=None):
+        until = None if timeout is None else time.time() + timeout
+        with self._state.condition:
+            while True:
+                if self._state.code is None:
+                    _wait_once_until(self._state.condition, until)
+                elif self._state.code is grpc.StatusCode.OK:
+                    return None
+                elif self._state.cancelled:
+                    raise grpc.FutureCancelledError()
+                else:
+                    return self
+
+    def traceback(self, timeout=None):
+        until = None if timeout is None else time.time() + timeout
+        with self._state.condition:
+            while True:
+                if self._state.code is None:
+                    _wait_once_until(self._state.condition, until)
+                elif self._state.code is grpc.StatusCode.OK:
+                    return None
+                elif self._state.cancelled:
+                    raise grpc.FutureCancelledError()
+                else:
+                    try:
+                        raise self
+                    except grpc.RpcError:
+                        return sys.exc_info()[2]
+
+    def add_done_callback(self, fn):
+        with self._state.condition:
+            if self._state.code is None:
+                self._state.callbacks.append(lambda: fn(self))
+                return
+
+        fn(self)
+
+    def _next(self):
+        with self._state.condition:
+            if self._state.code is None:
+                event_handler = _event_handler(self._state, self._call,
+                                               self._response_deserializer)
+                self._call.start_client_batch(
+                    cygrpc.Operations(
+                        (cygrpc.operation_receive_message(_EMPTY_FLAGS),)),
+                    event_handler)
+                self._state.due.add(cygrpc.OperationType.receive_message)
+            elif self._state.code is grpc.StatusCode.OK:
+                raise StopIteration()
+            else:
+                raise self
+            while True:
+                self._state.condition.wait()
+                if self._state.response is not None:
+                    response = self._state.response
+                    self._state.response = None
+                    return response
+                elif cygrpc.OperationType.receive_message not in self._state.due:
+                    if self._state.code is grpc.StatusCode.OK:
+                        raise StopIteration()
+                    elif self._state.code is not None:
+                        raise self
+
+    def __iter__(self):
+        return self
+
+    def __next__(self):
+        return self._next()
+
+    def next(self):
+        return self._next()
+
+    def is_active(self):
+        with self._state.condition:
+            return self._state.code is None
+
+    def time_remaining(self):
+        if self._deadline is None:
+            return None
         else:
-          raise self
+            return max(self._deadline - time.time(), 0)
 
-  def exception(self, timeout=None):
-    until = None if timeout is None else time.time() + timeout
-    with self._state.condition:
-      while True:
-        if self._state.code is None:
-          _wait_once_until(self._state.condition, until)
-        elif self._state.code is grpc.StatusCode.OK:
-          return None
-        elif self._state.cancelled:
-          raise grpc.FutureCancelledError()
-        else:
-          return self
+    def add_callback(self, callback):
+        with self._state.condition:
+            if self._state.callbacks is None:
+                return False
+            else:
+                self._state.callbacks.append(callback)
+                return True
 
-  def traceback(self, timeout=None):
-    until = None if timeout is None else time.time() + timeout
-    with self._state.condition:
-      while True:
-        if self._state.code is None:
-          _wait_once_until(self._state.condition, until)
-        elif self._state.code is grpc.StatusCode.OK:
-          return None
-        elif self._state.cancelled:
-          raise grpc.FutureCancelledError()
-        else:
-          try:
-            raise self
-          except grpc.RpcError:
-            return sys.exc_info()[2]
+    def initial_metadata(self):
+        with self._state.condition:
+            while self._state.initial_metadata is None:
+                self._state.condition.wait()
+            return _common.application_metadata(self._state.initial_metadata)
 
-  def add_done_callback(self, fn):
-    with self._state.condition:
-      if self._state.code is None:
-        self._state.callbacks.append(lambda: fn(self))
-        return
+    def trailing_metadata(self):
+        with self._state.condition:
+            while self._state.trailing_metadata is None:
+                self._state.condition.wait()
+            return _common.application_metadata(self._state.trailing_metadata)
 
-    fn(self)
+    def code(self):
+        with self._state.condition:
+            while self._state.code is None:
+                self._state.condition.wait()
+            return self._state.code
 
-  def _next(self):
-    with self._state.condition:
-      if self._state.code is None:
-        event_handler = _event_handler(
-            self._state, self._call, self._response_deserializer)
-        self._call.start_client_batch(
-            cygrpc.Operations(
-                (cygrpc.operation_receive_message(_EMPTY_FLAGS),)),
-            event_handler)
-        self._state.due.add(cygrpc.OperationType.receive_message)
-      elif self._state.code is grpc.StatusCode.OK:
-        raise StopIteration()
-      else:
-        raise self
-      while True:
-        self._state.condition.wait()
-        if self._state.response is not None:
-          response = self._state.response
-          self._state.response = None
-          return response
-        elif cygrpc.OperationType.receive_message not in self._state.due:
-          if self._state.code is grpc.StatusCode.OK:
-            raise StopIteration()
-          elif self._state.code is not None:
-            raise self
+    def details(self):
+        with self._state.condition:
+            while self._state.details is None:
+                self._state.condition.wait()
+            return _common.decode(self._state.details)
 
-  def __iter__(self):
-    return self
+    def _repr(self):
+        with self._state.condition:
+            if self._state.code is None:
+                return '<_Rendezvous object of in-flight RPC>'
+            else:
+                return '<_Rendezvous of RPC that terminated with ({}, {})>'.format(
+                    self._state.code, _common.decode(self._state.details))
 
-  def __next__(self):
-    return self._next()
+    def __repr__(self):
+        return self._repr()
 
-  def next(self):
-    return self._next()
+    def __str__(self):
+        return self._repr()
 
-  def is_active(self):
-    with self._state.condition:
-      return self._state.code is None
-
-  def time_remaining(self):
-    if self._deadline is None:
-      return None
-    else:
-      return max(self._deadline - time.time(), 0)
-
-  def add_callback(self, callback):
-    with self._state.condition:
-      if self._state.callbacks is None:
-        return False
-      else:
-        self._state.callbacks.append(callback)
-        return True
-
-  def initial_metadata(self):
-    with self._state.condition:
-      while self._state.initial_metadata is None:
-        self._state.condition.wait()
-      return _common.application_metadata(self._state.initial_metadata)
-
-  def trailing_metadata(self):
-    with self._state.condition:
-      while self._state.trailing_metadata is None:
-        self._state.condition.wait()
-      return _common.application_metadata(self._state.trailing_metadata)
-
-  def code(self):
-    with self._state.condition:
-      while self._state.code is None:
-        self._state.condition.wait()
-      return self._state.code
-
-  def details(self):
-    with self._state.condition:
-      while self._state.details is None:
-        self._state.condition.wait()
-      return _common.decode(self._state.details)
-
-  def _repr(self):
-    with self._state.condition:
-      if self._state.code is None:
-        return '<_Rendezvous object of in-flight RPC>'
-      else:
-        return '<_Rendezvous of RPC that terminated with ({}, {})>'.format(
-            self._state.code, _common.decode(self._state.details))
-
-  def __repr__(self):
-    return self._repr()
-
-  def __str__(self):
-    return self._repr()
-
-  def __del__(self):
-    with self._state.condition:
-      if self._state.code is None:
-        self._call.cancel()
-        self._state.cancelled = True
-        self._state.code = grpc.StatusCode.CANCELLED
-        self._state.condition.notify_all()
+    def __del__(self):
+        with self._state.condition:
+            if self._state.code is None:
+                self._call.cancel()
+                self._state.cancelled = True
+                self._state.code = grpc.StatusCode.CANCELLED
+                self._state.condition.notify_all()
 
 
 def _start_unary_request(request, timeout, request_serializer):
-  deadline, deadline_timespec = _deadline(timeout)
-  serialized_request = _common.serialize(request, request_serializer)
-  if serialized_request is None:
-    state = _RPCState(
-        (), _EMPTY_METADATA, _EMPTY_METADATA, grpc.StatusCode.INTERNAL,
-        'Exception serializing request!')
-    rendezvous = _Rendezvous(state, None, None, deadline)
-    return deadline, deadline_timespec, None, rendezvous
-  else:
-    return deadline, deadline_timespec, serialized_request, None
+    deadline, deadline_timespec = _deadline(timeout)
+    serialized_request = _common.serialize(request, request_serializer)
+    if serialized_request is None:
+        state = _RPCState((), _EMPTY_METADATA, _EMPTY_METADATA,
+                          grpc.StatusCode.INTERNAL,
+                          'Exception serializing request!')
+        rendezvous = _Rendezvous(state, None, None, deadline)
+        return deadline, deadline_timespec, None, rendezvous
+    else:
+        return deadline, deadline_timespec, serialized_request, None
 
 
 def _end_unary_response_blocking(state, with_call, deadline):
-  if state.code is grpc.StatusCode.OK:
-    if with_call:
-      rendezvous = _Rendezvous(state, None, None, deadline)
-      return state.response, rendezvous
+    if state.code is grpc.StatusCode.OK:
+        if with_call:
+            rendezvous = _Rendezvous(state, None, None, deadline)
+            return state.response, rendezvous
+        else:
+            return state.response
     else:
-      return state.response
-  else:
-    raise _Rendezvous(state, None, None, deadline)
+        raise _Rendezvous(state, None, None, deadline)
 
 
 class _UnaryUnaryMultiCallable(grpc.UnaryUnaryMultiCallable):
 
-  def __init__(
-      self, channel, managed_call, method, request_serializer,
-      response_deserializer):
-    self._channel = channel
-    self._managed_call = managed_call
-    self._method = method
-    self._request_serializer = request_serializer
-    self._response_deserializer = response_deserializer
+    def __init__(self, channel, managed_call, method, request_serializer,
+                 response_deserializer):
+        self._channel = channel
+        self._managed_call = managed_call
+        self._method = method
+        self._request_serializer = request_serializer
+        self._response_deserializer = response_deserializer
 
-  def _prepare(self, request, timeout, metadata):
-    deadline, deadline_timespec, serialized_request, rendezvous = (
-        _start_unary_request(request, timeout, self._request_serializer))
-    if serialized_request is None:
-      return None, None, None, None, rendezvous
-    else:
-      state = _RPCState(_UNARY_UNARY_INITIAL_DUE, None, None, None, None)
-      operations = (
-          cygrpc.operation_send_initial_metadata(
-              _common.cygrpc_metadata(metadata), _EMPTY_FLAGS),
-          cygrpc.operation_send_message(serialized_request, _EMPTY_FLAGS),
-          cygrpc.operation_send_close_from_client(_EMPTY_FLAGS),
-          cygrpc.operation_receive_initial_metadata(_EMPTY_FLAGS),
-          cygrpc.operation_receive_message(_EMPTY_FLAGS),
-          cygrpc.operation_receive_status_on_client(_EMPTY_FLAGS),
-      )
-      return state, operations, deadline, deadline_timespec, None
+    def _prepare(self, request, timeout, metadata):
+        deadline, deadline_timespec, serialized_request, rendezvous = (
+            _start_unary_request(request, timeout, self._request_serializer))
+        if serialized_request is None:
+            return None, None, None, None, rendezvous
+        else:
+            state = _RPCState(_UNARY_UNARY_INITIAL_DUE, None, None, None, None)
+            operations = (
+                cygrpc.operation_send_initial_metadata(
+                    _common.cygrpc_metadata(metadata), _EMPTY_FLAGS),
+                cygrpc.operation_send_message(serialized_request, _EMPTY_FLAGS),
+                cygrpc.operation_send_close_from_client(_EMPTY_FLAGS),
+                cygrpc.operation_receive_initial_metadata(_EMPTY_FLAGS),
+                cygrpc.operation_receive_message(_EMPTY_FLAGS),
+                cygrpc.operation_receive_status_on_client(_EMPTY_FLAGS),)
+            return state, operations, deadline, deadline_timespec, None
 
-  def _blocking(self, request, timeout, metadata, credentials):
-    state, operations, deadline, deadline_timespec, rendezvous = self._prepare(
-        request, timeout, metadata)
-    if rendezvous:
-      raise rendezvous
-    else:
-      completion_queue = cygrpc.CompletionQueue()
-      call = self._channel.create_call(
-          None, 0, completion_queue, self._method, None, deadline_timespec)
-      if credentials is not None:
-        call.set_credentials(credentials._credentials)
-      call_error = call.start_client_batch(cygrpc.Operations(operations), None)
-      _check_call_error(call_error, metadata)
-      _handle_event(completion_queue.poll(), state, self._response_deserializer)
-      return state, deadline
+    def _blocking(self, request, timeout, metadata, credentials):
+        state, operations, deadline, deadline_timespec, rendezvous = self._prepare(
+            request, timeout, metadata)
+        if rendezvous:
+            raise rendezvous
+        else:
+            completion_queue = cygrpc.CompletionQueue()
+            call = self._channel.create_call(None, 0, completion_queue,
+                                             self._method, None,
+                                             deadline_timespec)
+            if credentials is not None:
+                call.set_credentials(credentials._credentials)
+            call_error = call.start_client_batch(
+                cygrpc.Operations(operations), None)
+            _check_call_error(call_error, metadata)
+            _handle_event(completion_queue.poll(), state,
+                          self._response_deserializer)
+            return state, deadline
 
-  def __call__(self, request, timeout=None, metadata=None, credentials=None):
-    state, deadline, = self._blocking(request, timeout, metadata, credentials)
-    return _end_unary_response_blocking(state, False, deadline)
+    def __call__(self, request, timeout=None, metadata=None, credentials=None):
+        state, deadline, = self._blocking(request, timeout, metadata,
+                                          credentials)
+        return _end_unary_response_blocking(state, False, deadline)
 
-  def with_call(self, request, timeout=None, metadata=None, credentials=None):
-    state, deadline, = self._blocking(request, timeout, metadata, credentials)
-    return _end_unary_response_blocking(state, True, deadline)
+    def with_call(self, request, timeout=None, metadata=None, credentials=None):
+        state, deadline, = self._blocking(request, timeout, metadata,
+                                          credentials)
+        return _end_unary_response_blocking(state, True, deadline)
 
-  def future(self, request, timeout=None, metadata=None, credentials=None):
-    state, operations, deadline, deadline_timespec, rendezvous = self._prepare(
-        request, timeout, metadata)
-    if rendezvous:
-      return rendezvous
-    else:
-      call, drive_call = self._managed_call(
-          None, 0, self._method, None, deadline_timespec)
-      if credentials is not None:
-        call.set_credentials(credentials._credentials)
-      event_handler = _event_handler(state, call, self._response_deserializer)
-      with state.condition:
-        call_error = call.start_client_batch(cygrpc.Operations(operations),
-            event_handler)
-        if call_error != cygrpc.CallError.ok:
-          _call_error_set_RPCstate(state, call_error, metadata)
-          return _Rendezvous(state, None, None, deadline)
-        drive_call()
-      return _Rendezvous(state, call, self._response_deserializer, deadline)
+    def future(self, request, timeout=None, metadata=None, credentials=None):
+        state, operations, deadline, deadline_timespec, rendezvous = self._prepare(
+            request, timeout, metadata)
+        if rendezvous:
+            return rendezvous
+        else:
+            call, drive_call = self._managed_call(None, 0, self._method, None,
+                                                  deadline_timespec)
+            if credentials is not None:
+                call.set_credentials(credentials._credentials)
+            event_handler = _event_handler(state, call,
+                                           self._response_deserializer)
+            with state.condition:
+                call_error = call.start_client_batch(
+                    cygrpc.Operations(operations), event_handler)
+                if call_error != cygrpc.CallError.ok:
+                    _call_error_set_RPCstate(state, call_error, metadata)
+                    return _Rendezvous(state, None, None, deadline)
+                drive_call()
+            return _Rendezvous(state, call, self._response_deserializer,
+                               deadline)
 
 
 class _UnaryStreamMultiCallable(grpc.UnaryStreamMultiCallable):
 
-  def __init__(
-      self, channel, managed_call, method, request_serializer,
-      response_deserializer):
-    self._channel = channel
-    self._managed_call = managed_call
-    self._method = method
-    self._request_serializer = request_serializer
-    self._response_deserializer = response_deserializer
+    def __init__(self, channel, managed_call, method, request_serializer,
+                 response_deserializer):
+        self._channel = channel
+        self._managed_call = managed_call
+        self._method = method
+        self._request_serializer = request_serializer
+        self._response_deserializer = response_deserializer
 
-  def __call__(self, request, timeout=None, metadata=None, credentials=None):
-    deadline, deadline_timespec, serialized_request, rendezvous = (
-        _start_unary_request(request, timeout, self._request_serializer))
-    if serialized_request is None:
-      raise rendezvous
-    else:
-      state = _RPCState(_UNARY_STREAM_INITIAL_DUE, None, None, None, None)
-      call, drive_call = self._managed_call(
-          None, 0, self._method, None, deadline_timespec)
-      if credentials is not None:
-        call.set_credentials(credentials._credentials)
-      event_handler = _event_handler(state, call, self._response_deserializer)
-      with state.condition:
-        call.start_client_batch(
-            cygrpc.Operations(
-                (cygrpc.operation_receive_initial_metadata(_EMPTY_FLAGS),)),
-            event_handler)
-        operations = (
-            cygrpc.operation_send_initial_metadata(
-                _common.cygrpc_metadata(metadata), _EMPTY_FLAGS),
-            cygrpc.operation_send_message(serialized_request, _EMPTY_FLAGS),
-            cygrpc.operation_send_close_from_client(_EMPTY_FLAGS),
-            cygrpc.operation_receive_status_on_client(_EMPTY_FLAGS),
-        )
-        call_error = call.start_client_batch(cygrpc.Operations(operations),
-            event_handler)
-        if call_error != cygrpc.CallError.ok:
-          _call_error_set_RPCstate(state, call_error, metadata)
-          return _Rendezvous(state, None, None, deadline)
-        drive_call()
-      return _Rendezvous(state, call, self._response_deserializer, deadline)
+    def __call__(self, request, timeout=None, metadata=None, credentials=None):
+        deadline, deadline_timespec, serialized_request, rendezvous = (
+            _start_unary_request(request, timeout, self._request_serializer))
+        if serialized_request is None:
+            raise rendezvous
+        else:
+            state = _RPCState(_UNARY_STREAM_INITIAL_DUE, None, None, None, None)
+            call, drive_call = self._managed_call(None, 0, self._method, None,
+                                                  deadline_timespec)
+            if credentials is not None:
+                call.set_credentials(credentials._credentials)
+            event_handler = _event_handler(state, call,
+                                           self._response_deserializer)
+            with state.condition:
+                call.start_client_batch(
+                    cygrpc.Operations((
+                        cygrpc.operation_receive_initial_metadata(_EMPTY_FLAGS),
+                    )), event_handler)
+                operations = (
+                    cygrpc.operation_send_initial_metadata(
+                        _common.cygrpc_metadata(metadata), _EMPTY_FLAGS),
+                    cygrpc.operation_send_message(serialized_request,
+                                                  _EMPTY_FLAGS),
+                    cygrpc.operation_send_close_from_client(_EMPTY_FLAGS),
+                    cygrpc.operation_receive_status_on_client(_EMPTY_FLAGS),)
+                call_error = call.start_client_batch(
+                    cygrpc.Operations(operations), event_handler)
+                if call_error != cygrpc.CallError.ok:
+                    _call_error_set_RPCstate(state, call_error, metadata)
+                    return _Rendezvous(state, None, None, deadline)
+                drive_call()
+            return _Rendezvous(state, call, self._response_deserializer,
+                               deadline)
 
 
 class _StreamUnaryMultiCallable(grpc.StreamUnaryMultiCallable):
 
-  def __init__(
-      self, channel, managed_call, method, request_serializer,
-      response_deserializer):
-    self._channel = channel
-    self._managed_call = managed_call
-    self._method = method
-    self._request_serializer = request_serializer
-    self._response_deserializer = response_deserializer
+    def __init__(self, channel, managed_call, method, request_serializer,
+                 response_deserializer):
+        self._channel = channel
+        self._managed_call = managed_call
+        self._method = method
+        self._request_serializer = request_serializer
+        self._response_deserializer = response_deserializer
 
-  def _blocking(self, request_iterator, timeout, metadata, credentials):
-    deadline, deadline_timespec = _deadline(timeout)
-    state = _RPCState(_STREAM_UNARY_INITIAL_DUE, None, None, None, None)
-    completion_queue = cygrpc.CompletionQueue()
-    call = self._channel.create_call(
-        None, 0, completion_queue, self._method, None, deadline_timespec)
-    if credentials is not None:
-      call.set_credentials(credentials._credentials)
-    with state.condition:
-      call.start_client_batch(
-          cygrpc.Operations(
-              (cygrpc.operation_receive_initial_metadata(_EMPTY_FLAGS),)),
-          None)
-      operations = (
-          cygrpc.operation_send_initial_metadata(
-              _common.cygrpc_metadata(metadata), _EMPTY_FLAGS),
-          cygrpc.operation_receive_message(_EMPTY_FLAGS),
-          cygrpc.operation_receive_status_on_client(_EMPTY_FLAGS),
-      )
-      call_error = call.start_client_batch(cygrpc.Operations(operations), None)
-      _check_call_error(call_error, metadata)
-      _consume_request_iterator(
-          request_iterator, state, call, self._request_serializer)
-    while True:
-      event = completion_queue.poll()
-      with state.condition:
-        _handle_event(event, state, self._response_deserializer)
-        state.condition.notify_all()
-        if not state.due:
-          break
-    return state, deadline
+    def _blocking(self, request_iterator, timeout, metadata, credentials):
+        deadline, deadline_timespec = _deadline(timeout)
+        state = _RPCState(_STREAM_UNARY_INITIAL_DUE, None, None, None, None)
+        completion_queue = cygrpc.CompletionQueue()
+        call = self._channel.create_call(None, 0, completion_queue,
+                                         self._method, None, deadline_timespec)
+        if credentials is not None:
+            call.set_credentials(credentials._credentials)
+        with state.condition:
+            call.start_client_batch(
+                cygrpc.Operations(
+                    (cygrpc.operation_receive_initial_metadata(_EMPTY_FLAGS),)),
+                None)
+            operations = (
+                cygrpc.operation_send_initial_metadata(
+                    _common.cygrpc_metadata(metadata), _EMPTY_FLAGS),
+                cygrpc.operation_receive_message(_EMPTY_FLAGS),
+                cygrpc.operation_receive_status_on_client(_EMPTY_FLAGS),)
+            call_error = call.start_client_batch(
+                cygrpc.Operations(operations), None)
+            _check_call_error(call_error, metadata)
+            _consume_request_iterator(request_iterator, state, call,
+                                      self._request_serializer)
+        while True:
+            event = completion_queue.poll()
+            with state.condition:
+                _handle_event(event, state, self._response_deserializer)
+                state.condition.notify_all()
+                if not state.due:
+                    break
+        return state, deadline
 
-  def __call__(
-      self, request_iterator, timeout=None, metadata=None, credentials=None):
-    state, deadline, = self._blocking(
-        request_iterator, timeout, metadata, credentials)
-    return _end_unary_response_blocking(state, False, deadline)
+    def __call__(self,
+                 request_iterator,
+                 timeout=None,
+                 metadata=None,
+                 credentials=None):
+        state, deadline, = self._blocking(request_iterator, timeout, metadata,
+                                          credentials)
+        return _end_unary_response_blocking(state, False, deadline)
 
-  def with_call(
-      self, request_iterator, timeout=None, metadata=None, credentials=None):
-    state, deadline, = self._blocking(
-        request_iterator, timeout, metadata, credentials)
-    return _end_unary_response_blocking(state, True, deadline)
+    def with_call(self,
+                  request_iterator,
+                  timeout=None,
+                  metadata=None,
+                  credentials=None):
+        state, deadline, = self._blocking(request_iterator, timeout, metadata,
+                                          credentials)
+        return _end_unary_response_blocking(state, True, deadline)
 
-  def future(
-      self, request_iterator, timeout=None, metadata=None, credentials=None):
-    deadline, deadline_timespec = _deadline(timeout)
-    state = _RPCState(_STREAM_UNARY_INITIAL_DUE, None, None, None, None)
-    call, drive_call = self._managed_call(
-        None, 0, self._method, None, deadline_timespec)
-    if credentials is not None:
-      call.set_credentials(credentials._credentials)
-    event_handler = _event_handler(state, call, self._response_deserializer)
-    with state.condition:
-      call.start_client_batch(
-          cygrpc.Operations(
-              (cygrpc.operation_receive_initial_metadata(_EMPTY_FLAGS),)),
-          event_handler)
-      operations = (
-          cygrpc.operation_send_initial_metadata(
-              _common.cygrpc_metadata(metadata), _EMPTY_FLAGS),
-          cygrpc.operation_receive_message(_EMPTY_FLAGS),
-          cygrpc.operation_receive_status_on_client(_EMPTY_FLAGS),
-      )
-      call_error = call.start_client_batch(cygrpc.Operations(operations),
-          event_handler)
-      if call_error != cygrpc.CallError.ok:
-        _call_error_set_RPCstate(state, call_error, metadata)
-        return _Rendezvous(state, None, None, deadline)
-      drive_call()
-      _consume_request_iterator(
-          request_iterator, state, call, self._request_serializer)
-    return _Rendezvous(state, call, self._response_deserializer, deadline)
+    def future(self,
+               request_iterator,
+               timeout=None,
+               metadata=None,
+               credentials=None):
+        deadline, deadline_timespec = _deadline(timeout)
+        state = _RPCState(_STREAM_UNARY_INITIAL_DUE, None, None, None, None)
+        call, drive_call = self._managed_call(None, 0, self._method, None,
+                                              deadline_timespec)
+        if credentials is not None:
+            call.set_credentials(credentials._credentials)
+        event_handler = _event_handler(state, call, self._response_deserializer)
+        with state.condition:
+            call.start_client_batch(
+                cygrpc.Operations(
+                    (cygrpc.operation_receive_initial_metadata(_EMPTY_FLAGS),)),
+                event_handler)
+            operations = (
+                cygrpc.operation_send_initial_metadata(
+                    _common.cygrpc_metadata(metadata), _EMPTY_FLAGS),
+                cygrpc.operation_receive_message(_EMPTY_FLAGS),
+                cygrpc.operation_receive_status_on_client(_EMPTY_FLAGS),)
+            call_error = call.start_client_batch(
+                cygrpc.Operations(operations), event_handler)
+            if call_error != cygrpc.CallError.ok:
+                _call_error_set_RPCstate(state, call_error, metadata)
+                return _Rendezvous(state, None, None, deadline)
+            drive_call()
+            _consume_request_iterator(request_iterator, state, call,
+                                      self._request_serializer)
+        return _Rendezvous(state, call, self._response_deserializer, deadline)
 
 
 class _StreamStreamMultiCallable(grpc.StreamStreamMultiCallable):
 
-  def __init__(
-      self, channel, managed_call, method, request_serializer,
-      response_deserializer):
-    self._channel = channel
-    self._managed_call = managed_call
-    self._method = method
-    self._request_serializer = request_serializer
-    self._response_deserializer = response_deserializer
+    def __init__(self, channel, managed_call, method, request_serializer,
+                 response_deserializer):
+        self._channel = channel
+        self._managed_call = managed_call
+        self._method = method
+        self._request_serializer = request_serializer
+        self._response_deserializer = response_deserializer
 
-  def __call__(
-      self, request_iterator, timeout=None, metadata=None, credentials=None):
-    deadline, deadline_timespec = _deadline(timeout)
-    state = _RPCState(_STREAM_STREAM_INITIAL_DUE, None, None, None, None)
-    call, drive_call = self._managed_call(
-        None, 0, self._method, None, deadline_timespec)
-    if credentials is not None:
-      call.set_credentials(credentials._credentials)
-    event_handler = _event_handler(state, call, self._response_deserializer)
-    with state.condition:
-      call.start_client_batch(
-          cygrpc.Operations(
-              (cygrpc.operation_receive_initial_metadata(_EMPTY_FLAGS),)),
-          event_handler)
-      operations = (
-          cygrpc.operation_send_initial_metadata(
-              _common.cygrpc_metadata(metadata), _EMPTY_FLAGS),
-          cygrpc.operation_receive_status_on_client(_EMPTY_FLAGS),
-      )
-      call_error = call.start_client_batch(cygrpc.Operations(operations),
-          event_handler)
-      if call_error != cygrpc.CallError.ok:
-        _call_error_set_RPCstate(state, call_error, metadata)
-        return _Rendezvous(state, None, None, deadline)
-      drive_call()
-      _consume_request_iterator(
-          request_iterator, state, call, self._request_serializer)
-    return _Rendezvous(state, call, self._response_deserializer, deadline)
+    def __call__(self,
+                 request_iterator,
+                 timeout=None,
+                 metadata=None,
+                 credentials=None):
+        deadline, deadline_timespec = _deadline(timeout)
+        state = _RPCState(_STREAM_STREAM_INITIAL_DUE, None, None, None, None)
+        call, drive_call = self._managed_call(None, 0, self._method, None,
+                                              deadline_timespec)
+        if credentials is not None:
+            call.set_credentials(credentials._credentials)
+        event_handler = _event_handler(state, call, self._response_deserializer)
+        with state.condition:
+            call.start_client_batch(
+                cygrpc.Operations(
+                    (cygrpc.operation_receive_initial_metadata(_EMPTY_FLAGS),)),
+                event_handler)
+            operations = (
+                cygrpc.operation_send_initial_metadata(
+                    _common.cygrpc_metadata(metadata), _EMPTY_FLAGS),
+                cygrpc.operation_receive_status_on_client(_EMPTY_FLAGS),)
+            call_error = call.start_client_batch(
+                cygrpc.Operations(operations), event_handler)
+            if call_error != cygrpc.CallError.ok:
+                _call_error_set_RPCstate(state, call_error, metadata)
+                return _Rendezvous(state, None, None, deadline)
+            drive_call()
+            _consume_request_iterator(request_iterator, state, call,
+                                      self._request_serializer)
+        return _Rendezvous(state, call, self._response_deserializer, deadline)
 
 
 class _ChannelCallState(object):
 
-  def __init__(self, channel):
-    self.lock = threading.Lock()
-    self.channel = channel
-    self.completion_queue = cygrpc.CompletionQueue()
-    self.managed_calls = None
+    def __init__(self, channel):
+        self.lock = threading.Lock()
+        self.channel = channel
+        self.completion_queue = cygrpc.CompletionQueue()
+        self.managed_calls = None
 
 
 def _run_channel_spin_thread(state):
-  def channel_spin():
-    while True:
-      event = state.completion_queue.poll()
-      completed_call = event.tag(event)
-      if completed_call is not None:
+
+    def channel_spin():
+        while True:
+            event = state.completion_queue.poll()
+            completed_call = event.tag(event)
+            if completed_call is not None:
+                with state.lock:
+                    state.managed_calls.remove(completed_call)
+                    if not state.managed_calls:
+                        state.managed_calls = None
+                        return
+
+    def stop_channel_spin(timeout):
         with state.lock:
-          state.managed_calls.remove(completed_call)
-          if not state.managed_calls:
-            state.managed_calls = None
-            return
+            if state.managed_calls is not None:
+                for call in state.managed_calls:
+                    call.cancel()
 
-  def stop_channel_spin(timeout):
-    with state.lock:
-      if state.managed_calls is not None:
-        for call in state.managed_calls:
-          call.cancel()
-
-  channel_spin_thread = _common.CleanupThread(
-      stop_channel_spin, target=channel_spin)
-  channel_spin_thread.start()
+    channel_spin_thread = _common.CleanupThread(
+        stop_channel_spin, target=channel_spin)
+    channel_spin_thread.start()
 
 
 def _channel_managed_call_management(state):
-  def create(parent, flags, method, host, deadline):
-    """Creates a managed cygrpc.Call and a function to call to drive it.
+
+    def create(parent, flags, method, host, deadline):
+        """Creates a managed cygrpc.Call and a function to call to drive it.
 
     If operations are successfully added to the returned cygrpc.Call, the
     returned function must be called. If operations are not successfully added
@@ -754,193 +771,213 @@
       A cygrpc.Call with which to conduct an RPC and a function to call if
         operations are successfully started on the call.
     """
-    call = state.channel.create_call(
-        parent, flags, state.completion_queue, method, host, deadline)
+        call = state.channel.create_call(parent, flags, state.completion_queue,
+                                         method, host, deadline)
 
-    def drive():
-      with state.lock:
-        if state.managed_calls is None:
-          state.managed_calls = set((call,))
-          _run_channel_spin_thread(state)
-        else:
-          state.managed_calls.add(call)
+        def drive():
+            with state.lock:
+                if state.managed_calls is None:
+                    state.managed_calls = set((call,))
+                    _run_channel_spin_thread(state)
+                else:
+                    state.managed_calls.add(call)
 
-    return call, drive
-  return create
+        return call, drive
+
+    return create
 
 
 class _ChannelConnectivityState(object):
 
-  def __init__(self, channel):
-    self.lock = threading.Lock()
-    self.channel = channel
-    self.polling = False
-    self.connectivity = None
-    self.try_to_connect = False
-    self.callbacks_and_connectivities = []
-    self.delivering = False
+    def __init__(self, channel):
+        self.lock = threading.Lock()
+        self.channel = channel
+        self.polling = False
+        self.connectivity = None
+        self.try_to_connect = False
+        self.callbacks_and_connectivities = []
+        self.delivering = False
 
 
 def _deliveries(state):
-  callbacks_needing_update = []
-  for callback_and_connectivity in state.callbacks_and_connectivities:
-    callback, callback_connectivity, = callback_and_connectivity
-    if callback_connectivity is not state.connectivity:
-      callbacks_needing_update.append(callback)
-      callback_and_connectivity[1] = state.connectivity
-  return callbacks_needing_update
+    callbacks_needing_update = []
+    for callback_and_connectivity in state.callbacks_and_connectivities:
+        callback, callback_connectivity, = callback_and_connectivity
+        if callback_connectivity is not state.connectivity:
+            callbacks_needing_update.append(callback)
+            callback_and_connectivity[1] = state.connectivity
+    return callbacks_needing_update
 
 
 def _deliver(state, initial_connectivity, initial_callbacks):
-  connectivity = initial_connectivity
-  callbacks = initial_callbacks
-  while True:
-    for callback in callbacks:
-      callable_util.call_logging_exceptions(
-          callback, _CHANNEL_SUBSCRIPTION_CALLBACK_ERROR_LOG_MESSAGE,
-          connectivity)
-    with state.lock:
-      callbacks = _deliveries(state)
-      if callbacks:
-        connectivity = state.connectivity
-      else:
-        state.delivering = False
-        return
+    connectivity = initial_connectivity
+    callbacks = initial_callbacks
+    while True:
+        for callback in callbacks:
+            callable_util.call_logging_exceptions(
+                callback, _CHANNEL_SUBSCRIPTION_CALLBACK_ERROR_LOG_MESSAGE,
+                connectivity)
+        with state.lock:
+            callbacks = _deliveries(state)
+            if callbacks:
+                connectivity = state.connectivity
+            else:
+                state.delivering = False
+                return
 
 
 def _spawn_delivery(state, callbacks):
-  delivering_thread = threading.Thread(
-      target=_deliver, args=(state, state.connectivity, callbacks,))
-  delivering_thread.start()
-  state.delivering = True
+    delivering_thread = threading.Thread(
+        target=_deliver, args=(
+            state,
+            state.connectivity,
+            callbacks,))
+    delivering_thread.start()
+    state.delivering = True
 
 
 # NOTE(https://github.com/grpc/grpc/issues/3064): We'd rather not poll.
 def _poll_connectivity(state, channel, initial_try_to_connect):
-  try_to_connect = initial_try_to_connect
-  connectivity = channel.check_connectivity_state(try_to_connect)
-  with state.lock:
-    state.connectivity = (
-        _common.CYGRPC_CONNECTIVITY_STATE_TO_CHANNEL_CONNECTIVITY[
-            connectivity])
-    callbacks = tuple(
-        callback for callback, unused_but_known_to_be_none_connectivity
-        in state.callbacks_and_connectivities)
-    for callback_and_connectivity in state.callbacks_and_connectivities:
-      callback_and_connectivity[1] = state.connectivity
-    if callbacks:
-      _spawn_delivery(state, callbacks)
-  completion_queue = cygrpc.CompletionQueue()
-  while True:
-    channel.watch_connectivity_state(
-        connectivity, cygrpc.Timespec(time.time() + 0.2),
-        completion_queue, None)
-    event = completion_queue.poll()
+    try_to_connect = initial_try_to_connect
+    connectivity = channel.check_connectivity_state(try_to_connect)
     with state.lock:
-      if not state.callbacks_and_connectivities and not state.try_to_connect:
-        state.polling = False
-        state.connectivity = None
-        break
-      try_to_connect = state.try_to_connect
-      state.try_to_connect = False
-    if event.success or try_to_connect:
-      connectivity = channel.check_connectivity_state(try_to_connect)
-      with state.lock:
         state.connectivity = (
-            _common.CYGRPC_CONNECTIVITY_STATE_TO_CHANNEL_CONNECTIVITY[
-                connectivity])
-        if not state.delivering:
-          callbacks = _deliveries(state)
-          if callbacks:
+            _common.
+            CYGRPC_CONNECTIVITY_STATE_TO_CHANNEL_CONNECTIVITY[connectivity])
+        callbacks = tuple(callback
+                          for callback, unused_but_known_to_be_none_connectivity
+                          in state.callbacks_and_connectivities)
+        for callback_and_connectivity in state.callbacks_and_connectivities:
+            callback_and_connectivity[1] = state.connectivity
+        if callbacks:
             _spawn_delivery(state, callbacks)
+    completion_queue = cygrpc.CompletionQueue()
+    while True:
+        channel.watch_connectivity_state(connectivity,
+                                         cygrpc.Timespec(time.time() + 0.2),
+                                         completion_queue, None)
+        event = completion_queue.poll()
+        with state.lock:
+            if not state.callbacks_and_connectivities and not state.try_to_connect:
+                state.polling = False
+                state.connectivity = None
+                break
+            try_to_connect = state.try_to_connect
+            state.try_to_connect = False
+        if event.success or try_to_connect:
+            connectivity = channel.check_connectivity_state(try_to_connect)
+            with state.lock:
+                state.connectivity = (
+                    _common.CYGRPC_CONNECTIVITY_STATE_TO_CHANNEL_CONNECTIVITY[
+                        connectivity])
+                if not state.delivering:
+                    callbacks = _deliveries(state)
+                    if callbacks:
+                        _spawn_delivery(state, callbacks)
 
 
 def _moot(state):
-  with state.lock:
-    del state.callbacks_and_connectivities[:]
+    with state.lock:
+        del state.callbacks_and_connectivities[:]
 
 
 def _subscribe(state, callback, try_to_connect):
-  with state.lock:
-    if not state.callbacks_and_connectivities and not state.polling:
-      def cancel_all_subscriptions(timeout):
-        _moot(state)
-      polling_thread = _common.CleanupThread(
-          cancel_all_subscriptions, target=_poll_connectivity,
-          args=(state, state.channel, bool(try_to_connect)))
-      polling_thread.start()
-      state.polling = True
-      state.callbacks_and_connectivities.append([callback, None])
-    elif not state.delivering and state.connectivity is not None:
-      _spawn_delivery(state, (callback,))
-      state.try_to_connect |= bool(try_to_connect)
-      state.callbacks_and_connectivities.append(
-          [callback, state.connectivity])
-    else:
-      state.try_to_connect |= bool(try_to_connect)
-      state.callbacks_and_connectivities.append([callback, None])
+    with state.lock:
+        if not state.callbacks_and_connectivities and not state.polling:
+
+            def cancel_all_subscriptions(timeout):
+                _moot(state)
+
+            polling_thread = _common.CleanupThread(
+                cancel_all_subscriptions,
+                target=_poll_connectivity,
+                args=(state, state.channel, bool(try_to_connect)))
+            polling_thread.start()
+            state.polling = True
+            state.callbacks_and_connectivities.append([callback, None])
+        elif not state.delivering and state.connectivity is not None:
+            _spawn_delivery(state, (callback,))
+            state.try_to_connect |= bool(try_to_connect)
+            state.callbacks_and_connectivities.append(
+                [callback, state.connectivity])
+        else:
+            state.try_to_connect |= bool(try_to_connect)
+            state.callbacks_and_connectivities.append([callback, None])
 
 
 def _unsubscribe(state, callback):
-  with state.lock:
-    for index, (subscribed_callback, unused_connectivity) in enumerate(
-        state.callbacks_and_connectivities):
-      if callback == subscribed_callback:
-        state.callbacks_and_connectivities.pop(index)
-        break
+    with state.lock:
+        for index, (subscribed_callback, unused_connectivity
+                   ) in enumerate(state.callbacks_and_connectivities):
+            if callback == subscribed_callback:
+                state.callbacks_and_connectivities.pop(index)
+                break
 
 
 def _options(options):
-  return list(options) + [
-      (cygrpc.ChannelArgKey.primary_user_agent_string, _USER_AGENT)]
+    return list(options) + [
+        (cygrpc.ChannelArgKey.primary_user_agent_string, _USER_AGENT)
+    ]
 
 
 class Channel(grpc.Channel):
-  """A cygrpc.Channel-backed implementation of grpc.Channel."""
+    """A cygrpc.Channel-backed implementation of grpc.Channel."""
 
-  def __init__(self, target, options, credentials):
-    """Constructor.
+    def __init__(self, target, options, credentials):
+        """Constructor.
 
     Args:
       target: The target to which to connect.
       options: Configuration options for the channel.
       credentials: A cygrpc.ChannelCredentials or None.
     """
-    self._channel = cygrpc.Channel(
-        _common.encode(target), _common.channel_args(_options(options)),
-        credentials)
-    self._call_state = _ChannelCallState(self._channel)
-    self._connectivity_state = _ChannelConnectivityState(self._channel)
+        self._channel = cygrpc.Channel(
+            _common.encode(target),
+            _common.channel_args(_options(options)), credentials)
+        self._call_state = _ChannelCallState(self._channel)
+        self._connectivity_state = _ChannelConnectivityState(self._channel)
 
-  def subscribe(self, callback, try_to_connect=None):
-    _subscribe(self._connectivity_state, callback, try_to_connect)
+    def subscribe(self, callback, try_to_connect=None):
+        _subscribe(self._connectivity_state, callback, try_to_connect)
 
-  def unsubscribe(self, callback):
-    _unsubscribe(self._connectivity_state, callback)
+    def unsubscribe(self, callback):
+        _unsubscribe(self._connectivity_state, callback)
 
-  def unary_unary(
-      self, method, request_serializer=None, response_deserializer=None):
-    return _UnaryUnaryMultiCallable(
-        self._channel, _channel_managed_call_management(self._call_state),
-        _common.encode(method), request_serializer, response_deserializer)
+    def unary_unary(self,
+                    method,
+                    request_serializer=None,
+                    response_deserializer=None):
+        return _UnaryUnaryMultiCallable(
+            self._channel,
+            _channel_managed_call_management(self._call_state),
+            _common.encode(method), request_serializer, response_deserializer)
 
-  def unary_stream(
-      self, method, request_serializer=None, response_deserializer=None):
-    return _UnaryStreamMultiCallable(
-        self._channel, _channel_managed_call_management(self._call_state),
-        _common.encode(method), request_serializer, response_deserializer)
+    def unary_stream(self,
+                     method,
+                     request_serializer=None,
+                     response_deserializer=None):
+        return _UnaryStreamMultiCallable(
+            self._channel,
+            _channel_managed_call_management(self._call_state),
+            _common.encode(method), request_serializer, response_deserializer)
 
-  def stream_unary(
-      self, method, request_serializer=None, response_deserializer=None):
-    return _StreamUnaryMultiCallable(
-        self._channel, _channel_managed_call_management(self._call_state),
-        _common.encode(method), request_serializer, response_deserializer)
+    def stream_unary(self,
+                     method,
+                     request_serializer=None,
+                     response_deserializer=None):
+        return _StreamUnaryMultiCallable(
+            self._channel,
+            _channel_managed_call_management(self._call_state),
+            _common.encode(method), request_serializer, response_deserializer)
 
-  def stream_stream(
-      self, method, request_serializer=None, response_deserializer=None):
-    return _StreamStreamMultiCallable(
-        self._channel, _channel_managed_call_management(self._call_state),
-        _common.encode(method), request_serializer, response_deserializer)
+    def stream_stream(self,
+                      method,
+                      request_serializer=None,
+                      response_deserializer=None):
+        return _StreamStreamMultiCallable(
+            self._channel,
+            _channel_managed_call_management(self._call_state),
+            _common.encode(method), request_serializer, response_deserializer)
 
-  def __del__(self):
-    _moot(self._connectivity_state)
+    def __del__(self):
+        _moot(self._connectivity_state)
diff --git a/src/python/grpcio/grpc/_common.py b/src/python/grpcio/grpc/_common.py
index cc0984c..7ef2571 100644
--- a/src/python/grpcio/grpc/_common.py
+++ b/src/python/grpcio/grpc/_common.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Shared implementation."""
 
 import logging
@@ -45,9 +44,8 @@
     cygrpc.ConnectivityState.connecting: grpc.ChannelConnectivity.CONNECTING,
     cygrpc.ConnectivityState.ready: grpc.ChannelConnectivity.READY,
     cygrpc.ConnectivityState.transient_failure:
-        grpc.ChannelConnectivity.TRANSIENT_FAILURE,
-    cygrpc.ConnectivityState.shutdown:
-        grpc.ChannelConnectivity.SHUTDOWN,
+    grpc.ChannelConnectivity.TRANSIENT_FAILURE,
+    cygrpc.ConnectivityState.shutdown: grpc.ChannelConnectivity.SHUTDOWN,
 }
 
 CYGRPC_STATUS_CODE_TO_STATUS_CODE = {
@@ -77,83 +75,88 @@
 
 
 def encode(s):
-  if isinstance(s, bytes):
-    return s
-  else:
-    return s.encode('ascii')
+    if isinstance(s, bytes):
+        return s
+    else:
+        return s.encode('ascii')
 
 
 def decode(b):
-  if isinstance(b, str):
-    return b
-  else:
-    try:
-      return b.decode('utf8')
-    except UnicodeDecodeError:
-      logging.exception('Invalid encoding on {}'.format(b))
-      return b.decode('latin1')
+    if isinstance(b, str):
+        return b
+    else:
+        try:
+            return b.decode('utf8')
+        except UnicodeDecodeError:
+            logging.exception('Invalid encoding on {}'.format(b))
+            return b.decode('latin1')
 
 
 def channel_args(options):
-  channel_args = []
-  for key, value in options:
-    if isinstance(value, six.string_types):
-      channel_args.append(cygrpc.ChannelArg(encode(key), encode(value)))
-    else:
-      channel_args.append(cygrpc.ChannelArg(encode(key), value))
-  return cygrpc.ChannelArgs(channel_args)
+    channel_args = []
+    for key, value in options:
+        if isinstance(value, six.string_types):
+            channel_args.append(cygrpc.ChannelArg(encode(key), encode(value)))
+        else:
+            channel_args.append(cygrpc.ChannelArg(encode(key), value))
+    return cygrpc.ChannelArgs(channel_args)
 
 
 def cygrpc_metadata(application_metadata):
-  return _EMPTY_METADATA if application_metadata is None else cygrpc.Metadata(
-      cygrpc.Metadatum(encode(key), encode(value))
-      for key, value in application_metadata)
+    return _EMPTY_METADATA if application_metadata is None else cygrpc.Metadata(
+        cygrpc.Metadatum(encode(key), encode(value))
+        for key, value in application_metadata)
 
 
 def application_metadata(cygrpc_metadata):
-  if cygrpc_metadata is None:
-    return ()
-  else:
-    return tuple(
-        (decode(key), value if key[-4:] == b'-bin' else decode(value))
-        for key, value in cygrpc_metadata)
+    if cygrpc_metadata is None:
+        return ()
+    else:
+        return tuple((decode(key), value
+                      if key[-4:] == b'-bin' else decode(value))
+                     for key, value in cygrpc_metadata)
 
 
 def _transform(message, transformer, exception_message):
-  if transformer is None:
-    return message
-  else:
-    try:
-      return transformer(message)
-    except Exception:  # pylint: disable=broad-except
-      logging.exception(exception_message)
-      return None
+    if transformer is None:
+        return message
+    else:
+        try:
+            return transformer(message)
+        except Exception:  # pylint: disable=broad-except
+            logging.exception(exception_message)
+            return None
 
 
 def serialize(message, serializer):
-  return _transform(message, serializer, 'Exception serializing message!')
+    return _transform(message, serializer, 'Exception serializing message!')
 
 
 def deserialize(serialized_message, deserializer):
-  return _transform(serialized_message, deserializer,
-                    'Exception deserializing message!')
+    return _transform(serialized_message, deserializer,
+                      'Exception deserializing message!')
 
 
 def fully_qualified_method(group, method):
-  return '/{}/{}'.format(group, method)
+    return '/{}/{}'.format(group, method)
 
 
 class CleanupThread(threading.Thread):
-  """A threading.Thread subclass supporting custom behavior on join().
+    """A threading.Thread subclass supporting custom behavior on join().
 
   On Python Interpreter exit, Python will attempt to join outstanding threads
   prior to garbage collection.  We may need to do additional cleanup, and
   we accomplish this by overriding the join() method.
   """
 
-  def __init__(self, behavior, group=None, target=None, name=None,
-               args=(), kwargs={}):
-    """Constructor.
+    def __init__(self,
+                 behavior,
+                 group=None,
+                 target=None,
+                 name=None,
+                 args=(),
+                 kwargs={}):
+        """Constructor.
 
     Args:
       behavior (function): Function called on join() with a single
@@ -169,15 +172,15 @@
       kwargs (dict[str,object]): A dictionary of keyword arguments to
            pass to `target`.
     """
-    super(CleanupThread, self).__init__(group=group, target=target,
-                                        name=name, args=args, kwargs=kwargs)
-    self._behavior = behavior
+        super(CleanupThread, self).__init__(
+            group=group, target=target, name=name, args=args, kwargs=kwargs)
+        self._behavior = behavior
 
-  def join(self, timeout=None):
-    start_time = time.time()
-    self._behavior(timeout)
-    end_time = time.time()
-    if timeout is not None:
-      timeout -= end_time - start_time
-      timeout = max(timeout, 0)
-    super(CleanupThread, self).join(timeout)
+    def join(self, timeout=None):
+        start_time = time.time()
+        self._behavior(timeout)
+        end_time = time.time()
+        if timeout is not None:
+            timeout -= end_time - start_time
+            timeout = max(timeout, 0)
+        super(CleanupThread, self).join(timeout)
diff --git a/src/python/grpcio/grpc/_credential_composition.py b/src/python/grpcio/grpc/_credential_composition.py
index 9cb5508..bdf017b 100644
--- a/src/python/grpcio/grpc/_credential_composition.py
+++ b/src/python/grpcio/grpc/_credential_composition.py
@@ -31,18 +31,18 @@
 
 
 def _call(call_credentialses):
-  call_credentials_iterator = iter(call_credentialses)
-  composition = next(call_credentials_iterator)
-  for additional_call_credentials in call_credentials_iterator:
-    composition = cygrpc.call_credentials_composite(
-        composition, additional_call_credentials)
-  return composition
+    call_credentials_iterator = iter(call_credentialses)
+    composition = next(call_credentials_iterator)
+    for additional_call_credentials in call_credentials_iterator:
+        composition = cygrpc.call_credentials_composite(
+            composition, additional_call_credentials)
+    return composition
 
 
 def call(call_credentialses):
-  return _call(call_credentialses)
+    return _call(call_credentialses)
 
 
 def channel(channel_credentials, call_credentialses):
-  return cygrpc.channel_credentials_composite(
-      channel_credentials, _call(call_credentialses))
+    return cygrpc.channel_credentials_composite(channel_credentials,
+                                                _call(call_credentialses))
diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi
index 04872b9..4d98819 100644
--- a/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi
+++ b/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi
@@ -29,6 +29,8 @@
 
 cimport cpython
 
+import traceback
+
 
 cdef class ChannelCredentials:
 
@@ -138,15 +140,22 @@
 cdef void plugin_get_metadata(
     void *state, grpc_auth_metadata_context context,
     grpc_credentials_plugin_metadata_cb cb, void *user_data) with gil:
+  called_flag = [False]
   def python_callback(
       Metadata metadata, grpc_status_code status,
       bytes error_details):
     cb(user_data, metadata.c_metadata_array.metadata,
        metadata.c_metadata_array.count, status, error_details)
+    called_flag[0] = True
   cdef CredentialsMetadataPlugin self = <CredentialsMetadataPlugin>state
   cdef AuthMetadataContext cy_context = AuthMetadataContext()
   cy_context.context = context
-  self.plugin_callback(cy_context, python_callback)
+  try:
+    self.plugin_callback(cy_context, python_callback)
+  except Exception as error:
+    if not called_flag[0]:
+      cb(user_data, Metadata([]).c_metadata_array.metadata,
+         0, StatusCode.unknown, traceback.format_exc().encode())
 
 cdef void plugin_destroy_c_plugin_state(void *state) with gil:
   cpython.Py_DECREF(<CredentialsMetadataPlugin>state)
diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi
index cadfce6..69b837c 100644
--- a/src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi
+++ b/src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi
@@ -174,6 +174,25 @@
   def infinite_past():
     return Timespec(float("-inf"))
 
+  def __richcmp__(Timespec self not None, Timespec other not None, int op):
+    cdef gpr_timespec self_c_time = self.c_time
+    cdef gpr_timespec other_c_time = other.c_time
+    cdef int result = gpr_time_cmp(self_c_time, other_c_time)
+    if op == 0:  # <
+      return result < 0
+    elif op == 2:  # ==
+      return result == 0
+    elif op == 4:  # >
+      return result > 0
+    elif op == 1:  # <=
+      return result <= 0
+    elif op == 3:  # !=
+      return result != 0
+    elif op == 5:  # >=
+      return result >= 0
+    else:
+      raise ValueError('__richcmp__ `op` contract violated')
+
 
 cdef class CallDetails:
 
diff --git a/src/python/grpcio/grpc/_plugin_wrapping.py b/src/python/grpcio/grpc/_plugin_wrapping.py
index 7cb5218..bb9a42f 100644
--- a/src/python/grpcio/grpc/_plugin_wrapping.py
+++ b/src/python/grpcio/grpc/_plugin_wrapping.py
@@ -36,82 +36,82 @@
 
 
 class AuthMetadataContext(
-    collections.namedtuple(
-        'AuthMetadataContext', ('service_url', 'method_name',)),
-    grpc.AuthMetadataContext):
-  pass
+        collections.namedtuple('AuthMetadataContext', (
+            'service_url',
+            'method_name',)), grpc.AuthMetadataContext):
+    pass
 
 
 class AuthMetadataPluginCallback(grpc.AuthMetadataContext):
 
-  def __init__(self, callback):
-    self._callback = callback
+    def __init__(self, callback):
+        self._callback = callback
 
-  def __call__(self, metadata, error):
-    self._callback(metadata, error)
+    def __call__(self, metadata, error):
+        self._callback(metadata, error)
 
 
 class _WrappedCygrpcCallback(object):
 
-  def __init__(self, cygrpc_callback):
-    self.is_called = False
-    self.error = None
-    self.is_called_lock = threading.Lock()
-    self.cygrpc_callback = cygrpc_callback
+    def __init__(self, cygrpc_callback):
+        self.is_called = False
+        self.error = None
+        self.is_called_lock = threading.Lock()
+        self.cygrpc_callback = cygrpc_callback
 
-  def _invoke_failure(self, error):
-    # TODO(atash) translate different Exception superclasses into different
-    # status codes.
-    self.cygrpc_callback(
-        _common.EMPTY_METADATA, cygrpc.StatusCode.internal,
-        _common.encode(str(error)))
+    def _invoke_failure(self, error):
+        # TODO(atash) translate different Exception superclasses into different
+        # status codes.
+        self.cygrpc_callback(_common.EMPTY_METADATA, cygrpc.StatusCode.internal,
+                             _common.encode(str(error)))
 
-  def _invoke_success(self, metadata):
-    try:
-      cygrpc_metadata = _common.cygrpc_metadata(metadata)
-    except Exception as error:
-      self._invoke_failure(error)
-      return
-    self.cygrpc_callback(cygrpc_metadata, cygrpc.StatusCode.ok, b'')
+    def _invoke_success(self, metadata):
+        try:
+            cygrpc_metadata = _common.cygrpc_metadata(metadata)
+        except Exception as error:
+            self._invoke_failure(error)
+            return
+        self.cygrpc_callback(cygrpc_metadata, cygrpc.StatusCode.ok, b'')
 
-  def __call__(self, metadata, error):
-    with self.is_called_lock:
-      if self.is_called:
-        raise RuntimeError('callback should only ever be invoked once')
-      if self.error:
-        self._invoke_failure(self.error)
-        return
-      self.is_called = True
-    if error is None:
-      self._invoke_success(metadata)
-    else:
-      self._invoke_failure(error)
+    def __call__(self, metadata, error):
+        with self.is_called_lock:
+            if self.is_called:
+                raise RuntimeError('callback should only ever be invoked once')
+            if self.error:
+                self._invoke_failure(self.error)
+                return
+            self.is_called = True
+        if error is None:
+            self._invoke_success(metadata)
+        else:
+            self._invoke_failure(error)
 
-  def notify_failure(self, error):
-    with self.is_called_lock:
-      if not self.is_called:
-        self.error = error
+    def notify_failure(self, error):
+        with self.is_called_lock:
+            if not self.is_called:
+                self.error = error
 
 
 class _WrappedPlugin(object):
 
-  def __init__(self, plugin):
-    self.plugin = plugin
+    def __init__(self, plugin):
+        self.plugin = plugin
 
-  def __call__(self, context, cygrpc_callback):
-    wrapped_cygrpc_callback = _WrappedCygrpcCallback(cygrpc_callback)
-    wrapped_context = AuthMetadataContext(
-        _common.decode(context.service_url), _common.decode(context.method_name))
-    try:
-      self.plugin(
-          wrapped_context, AuthMetadataPluginCallback(wrapped_cygrpc_callback))
-    except Exception as error:
-      wrapped_cygrpc_callback.notify_failure(error)
-      raise
+    def __call__(self, context, cygrpc_callback):
+        wrapped_cygrpc_callback = _WrappedCygrpcCallback(cygrpc_callback)
+        wrapped_context = AuthMetadataContext(
+            _common.decode(context.service_url),
+            _common.decode(context.method_name))
+        try:
+            self.plugin(wrapped_context,
+                        AuthMetadataPluginCallback(wrapped_cygrpc_callback))
+        except Exception as error:
+            wrapped_cygrpc_callback.notify_failure(error)
+            raise
 
 
 def call_credentials_metadata_plugin(plugin, name):
-  """
+    """
   Args:
     plugin: A callable accepting a grpc.AuthMetadataContext
       object and a callback (itself accepting a list of metadata key/value
@@ -119,5 +119,6 @@
       called, but need not be called in plugin's invocation.
       plugin's invocation must be non-blocking.
   """
-  return cygrpc.call_credentials_metadata_plugin(
-      cygrpc.CredentialsMetadataPlugin(_WrappedPlugin(plugin), _common.encode(name)))
+    return cygrpc.call_credentials_metadata_plugin(
+        cygrpc.CredentialsMetadataPlugin(
+            _WrappedPlugin(plugin), _common.encode(name)))
diff --git a/src/python/grpcio/grpc/_server.py b/src/python/grpcio/grpc/_server.py
index 5223712..cbbe2dc 100644
--- a/src/python/grpcio/grpc/_server.py
+++ b/src/python/grpcio/grpc/_server.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Service-side implementation of gRPC Python."""
 
 import collections
@@ -64,692 +63,716 @@
 
 
 def _serialized_request(request_event):
-  return request_event.batch_operations[0].received_message.bytes()
+    return request_event.batch_operations[0].received_message.bytes()
 
 
 def _application_code(code):
-  cygrpc_code = _common.STATUS_CODE_TO_CYGRPC_STATUS_CODE.get(code)
-  return cygrpc.StatusCode.unknown if cygrpc_code is None else cygrpc_code
+    cygrpc_code = _common.STATUS_CODE_TO_CYGRPC_STATUS_CODE.get(code)
+    return cygrpc.StatusCode.unknown if cygrpc_code is None else cygrpc_code
 
 
 def _completion_code(state):
-  if state.code is None:
-    return cygrpc.StatusCode.ok
-  else:
-    return _application_code(state.code)
+    if state.code is None:
+        return cygrpc.StatusCode.ok
+    else:
+        return _application_code(state.code)
 
 
 def _abortion_code(state, code):
-  if state.code is None:
-    return code
-  else:
-    return _application_code(state.code)
+    if state.code is None:
+        return code
+    else:
+        return _application_code(state.code)
 
 
 def _details(state):
-  return b'' if state.details is None else state.details
+    return b'' if state.details is None else state.details
 
 
 class _HandlerCallDetails(
-    collections.namedtuple(
-        '_HandlerCallDetails', ('method', 'invocation_metadata',)),
-    grpc.HandlerCallDetails):
-  pass
+        collections.namedtuple('_HandlerCallDetails', (
+            'method',
+            'invocation_metadata',)), grpc.HandlerCallDetails):
+    pass
 
 
 class _RPCState(object):
 
-  def __init__(self):
-    self.condition = threading.Condition()
-    self.due = set()
-    self.request = None
-    self.client = _OPEN
-    self.initial_metadata_allowed = True
-    self.disable_next_compression = False
-    self.trailing_metadata = None
-    self.code = None
-    self.details = None
-    self.statused = False
-    self.rpc_errors = []
-    self.callbacks = []
+    def __init__(self):
+        self.condition = threading.Condition()
+        self.due = set()
+        self.request = None
+        self.client = _OPEN
+        self.initial_metadata_allowed = True
+        self.disable_next_compression = False
+        self.trailing_metadata = None
+        self.code = None
+        self.details = None
+        self.statused = False
+        self.rpc_errors = []
+        self.callbacks = []
 
 
 def _raise_rpc_error(state):
-  rpc_error = grpc.RpcError()
-  state.rpc_errors.append(rpc_error)
-  raise rpc_error
+    rpc_error = grpc.RpcError()
+    state.rpc_errors.append(rpc_error)
+    raise rpc_error
 
 
 def _possibly_finish_call(state, token):
-  state.due.remove(token)
-  if (state.client is _CANCELLED or state.statused) and not state.due:
-    callbacks = state.callbacks
-    state.callbacks = None
-    return state, callbacks
-  else:
-    return None, ()
+    state.due.remove(token)
+    if (state.client is _CANCELLED or state.statused) and not state.due:
+        callbacks = state.callbacks
+        state.callbacks = None
+        return state, callbacks
+    else:
+        return None, ()
 
 
 def _send_status_from_server(state, token):
-  def send_status_from_server(unused_send_status_from_server_event):
-    with state.condition:
-      return _possibly_finish_call(state, token)
-  return send_status_from_server
+
+    def send_status_from_server(unused_send_status_from_server_event):
+        with state.condition:
+            return _possibly_finish_call(state, token)
+
+    return send_status_from_server
 
 
 def _abort(state, call, code, details):
-  if state.client is not _CANCELLED:
-    effective_code = _abortion_code(state, code)
-    effective_details = details if state.details is None else state.details
-    if state.initial_metadata_allowed:
-      operations = (
-          cygrpc.operation_send_initial_metadata(
-              _EMPTY_METADATA, _EMPTY_FLAGS),
-          cygrpc.operation_send_status_from_server(
-              _common.cygrpc_metadata(state.trailing_metadata), effective_code,
-              effective_details, _EMPTY_FLAGS),
-      )
-      token = _SEND_INITIAL_METADATA_AND_SEND_STATUS_FROM_SERVER_TOKEN
-    else:
-      operations = (
-          cygrpc.operation_send_status_from_server(
-              _common.cygrpc_metadata(state.trailing_metadata), effective_code,
-              effective_details, _EMPTY_FLAGS),
-      )
-      token = _SEND_STATUS_FROM_SERVER_TOKEN
-    call.start_server_batch(
-        cygrpc.Operations(operations),
-        _send_status_from_server(state, token))
-    state.statused = True
-    state.due.add(token)
+    if state.client is not _CANCELLED:
+        effective_code = _abortion_code(state, code)
+        effective_details = details if state.details is None else state.details
+        if state.initial_metadata_allowed:
+            operations = (
+                cygrpc.operation_send_initial_metadata(_EMPTY_METADATA,
+                                                       _EMPTY_FLAGS),
+                cygrpc.operation_send_status_from_server(
+                    _common.cygrpc_metadata(state.trailing_metadata),
+                    effective_code, effective_details, _EMPTY_FLAGS),)
+            token = _SEND_INITIAL_METADATA_AND_SEND_STATUS_FROM_SERVER_TOKEN
+        else:
+            operations = (cygrpc.operation_send_status_from_server(
+                _common.cygrpc_metadata(state.trailing_metadata),
+                effective_code, effective_details, _EMPTY_FLAGS),)
+            token = _SEND_STATUS_FROM_SERVER_TOKEN
+        call.start_server_batch(
+            cygrpc.Operations(operations),
+            _send_status_from_server(state, token))
+        state.statused = True
+        state.due.add(token)
 
 
 def _receive_close_on_server(state):
-  def receive_close_on_server(receive_close_on_server_event):
-    with state.condition:
-      if receive_close_on_server_event.batch_operations[0].received_cancelled:
-        state.client = _CANCELLED
-      elif state.client is _OPEN:
-        state.client = _CLOSED
-      state.condition.notify_all()
-      return _possibly_finish_call(state, _RECEIVE_CLOSE_ON_SERVER_TOKEN)
-  return receive_close_on_server
+
+    def receive_close_on_server(receive_close_on_server_event):
+        with state.condition:
+            if receive_close_on_server_event.batch_operations[
+                    0].received_cancelled:
+                state.client = _CANCELLED
+            elif state.client is _OPEN:
+                state.client = _CLOSED
+            state.condition.notify_all()
+            return _possibly_finish_call(state, _RECEIVE_CLOSE_ON_SERVER_TOKEN)
+
+    return receive_close_on_server
 
 
 def _receive_message(state, call, request_deserializer):
-  def receive_message(receive_message_event):
-    serialized_request = _serialized_request(receive_message_event)
-    if serialized_request is None:
-      with state.condition:
-        if state.client is _OPEN:
-          state.client = _CLOSED
-        state.condition.notify_all()
-        return _possibly_finish_call(state, _RECEIVE_MESSAGE_TOKEN)
-    else:
-      request = _common.deserialize(serialized_request, request_deserializer)
-      with state.condition:
-        if request is None:
-          _abort(
-              state, call, cygrpc.StatusCode.internal,
-              b'Exception deserializing request!')
+
+    def receive_message(receive_message_event):
+        serialized_request = _serialized_request(receive_message_event)
+        if serialized_request is None:
+            with state.condition:
+                if state.client is _OPEN:
+                    state.client = _CLOSED
+                state.condition.notify_all()
+                return _possibly_finish_call(state, _RECEIVE_MESSAGE_TOKEN)
         else:
-          state.request = request
-        state.condition.notify_all()
-        return _possibly_finish_call(state, _RECEIVE_MESSAGE_TOKEN)
-  return receive_message
+            request = _common.deserialize(serialized_request,
+                                          request_deserializer)
+            with state.condition:
+                if request is None:
+                    _abort(state, call, cygrpc.StatusCode.internal,
+                           b'Exception deserializing request!')
+                else:
+                    state.request = request
+                state.condition.notify_all()
+                return _possibly_finish_call(state, _RECEIVE_MESSAGE_TOKEN)
+
+    return receive_message
 
 
 def _send_initial_metadata(state):
-  def send_initial_metadata(unused_send_initial_metadata_event):
-    with state.condition:
-      return _possibly_finish_call(state, _SEND_INITIAL_METADATA_TOKEN)
-  return send_initial_metadata
+
+    def send_initial_metadata(unused_send_initial_metadata_event):
+        with state.condition:
+            return _possibly_finish_call(state, _SEND_INITIAL_METADATA_TOKEN)
+
+    return send_initial_metadata
 
 
 def _send_message(state, token):
-  def send_message(unused_send_message_event):
-    with state.condition:
-      state.condition.notify_all()
-      return _possibly_finish_call(state, token)
-  return send_message
+
+    def send_message(unused_send_message_event):
+        with state.condition:
+            state.condition.notify_all()
+            return _possibly_finish_call(state, token)
+
+    return send_message
 
 
 class _Context(grpc.ServicerContext):
 
-  def __init__(self, rpc_event, state, request_deserializer):
-    self._rpc_event = rpc_event
-    self._state = state
-    self._request_deserializer = request_deserializer
+    def __init__(self, rpc_event, state, request_deserializer):
+        self._rpc_event = rpc_event
+        self._state = state
+        self._request_deserializer = request_deserializer
 
-  def is_active(self):
-    with self._state.condition:
-      return self._state.client is not _CANCELLED and not self._state.statused
+    def is_active(self):
+        with self._state.condition:
+            return self._state.client is not _CANCELLED and not self._state.statused
 
-  def time_remaining(self):
-    return max(self._rpc_event.request_call_details.deadline - time.time(), 0)
+    def time_remaining(self):
+        return max(
+            float(self._rpc_event.request_call_details.deadline) - time.time(),
+            0)
 
-  def cancel(self):
-    self._rpc_event.operation_call.cancel()
+    def cancel(self):
+        self._rpc_event.operation_call.cancel()
 
-  def add_callback(self, callback):
-    with self._state.condition:
-      if self._state.callbacks is None:
-        return False
-      else:
-        self._state.callbacks.append(callback)
-        return True
+    def add_callback(self, callback):
+        with self._state.condition:
+            if self._state.callbacks is None:
+                return False
+            else:
+                self._state.callbacks.append(callback)
+                return True
 
-  def disable_next_message_compression(self):
-    with self._state.condition:
-      self._state.disable_next_compression = True
+    def disable_next_message_compression(self):
+        with self._state.condition:
+            self._state.disable_next_compression = True
 
-  def invocation_metadata(self):
-    return _common.application_metadata(self._rpc_event.request_metadata)
+    def invocation_metadata(self):
+        return _common.application_metadata(self._rpc_event.request_metadata)
 
-  def peer(self):
-    return _common.decode(self._rpc_event.operation_call.peer())
+    def peer(self):
+        return _common.decode(self._rpc_event.operation_call.peer())
 
-  def send_initial_metadata(self, initial_metadata):
-    with self._state.condition:
-      if self._state.client is _CANCELLED:
-        _raise_rpc_error(self._state)
-      else:
-        if self._state.initial_metadata_allowed:
-          operation = cygrpc.operation_send_initial_metadata(
-              _common.cygrpc_metadata(initial_metadata), _EMPTY_FLAGS)
-          self._rpc_event.operation_call.start_server_batch(
-              cygrpc.Operations((operation,)),
-              _send_initial_metadata(self._state))
-          self._state.initial_metadata_allowed = False
-          self._state.due.add(_SEND_INITIAL_METADATA_TOKEN)
-        else:
-          raise ValueError('Initial metadata no longer allowed!')
+    def send_initial_metadata(self, initial_metadata):
+        with self._state.condition:
+            if self._state.client is _CANCELLED:
+                _raise_rpc_error(self._state)
+            else:
+                if self._state.initial_metadata_allowed:
+                    operation = cygrpc.operation_send_initial_metadata(
+                        _common.cygrpc_metadata(initial_metadata), _EMPTY_FLAGS)
+                    self._rpc_event.operation_call.start_server_batch(
+                        cygrpc.Operations((operation,)),
+                        _send_initial_metadata(self._state))
+                    self._state.initial_metadata_allowed = False
+                    self._state.due.add(_SEND_INITIAL_METADATA_TOKEN)
+                else:
+                    raise ValueError('Initial metadata no longer allowed!')
 
-  def set_trailing_metadata(self, trailing_metadata):
-    with self._state.condition:
-      self._state.trailing_metadata = _common.cygrpc_metadata(
-          trailing_metadata)
+    def set_trailing_metadata(self, trailing_metadata):
+        with self._state.condition:
+            self._state.trailing_metadata = _common.cygrpc_metadata(
+                trailing_metadata)
 
-  def set_code(self, code):
-    with self._state.condition:
-      self._state.code = code
+    def set_code(self, code):
+        with self._state.condition:
+            self._state.code = code
 
-  def set_details(self, details):
-    with self._state.condition:
-      self._state.details = _common.encode(details)
+    def set_details(self, details):
+        with self._state.condition:
+            self._state.details = _common.encode(details)
 
 
 class _RequestIterator(object):
 
-  def __init__(self, state, call, request_deserializer):
-    self._state = state
-    self._call = call
-    self._request_deserializer = request_deserializer
+    def __init__(self, state, call, request_deserializer):
+        self._state = state
+        self._call = call
+        self._request_deserializer = request_deserializer
 
-  def _raise_or_start_receive_message(self):
-    if self._state.client is _CANCELLED:
-      _raise_rpc_error(self._state)
-    elif self._state.client is _CLOSED or self._state.statused:
-      raise StopIteration()
-    else:
-      self._call.start_server_batch(
-          cygrpc.Operations((cygrpc.operation_receive_message(_EMPTY_FLAGS),)),
-          _receive_message(self._state, self._call, self._request_deserializer))
-      self._state.due.add(_RECEIVE_MESSAGE_TOKEN)
+    def _raise_or_start_receive_message(self):
+        if self._state.client is _CANCELLED:
+            _raise_rpc_error(self._state)
+        elif self._state.client is _CLOSED or self._state.statused:
+            raise StopIteration()
+        else:
+            self._call.start_server_batch(
+                cygrpc.Operations(
+                    (cygrpc.operation_receive_message(_EMPTY_FLAGS),)),
+                _receive_message(self._state, self._call,
+                                 self._request_deserializer))
+            self._state.due.add(_RECEIVE_MESSAGE_TOKEN)
 
-  def _look_for_request(self):
-    if self._state.client is _CANCELLED:
-      _raise_rpc_error(self._state)
-    elif (self._state.request is None and
-          _RECEIVE_MESSAGE_TOKEN not in self._state.due):
-      raise StopIteration()
-    else:
-      request = self._state.request
-      self._state.request = None
-      return request
+    def _look_for_request(self):
+        if self._state.client is _CANCELLED:
+            _raise_rpc_error(self._state)
+        elif (self._state.request is None and
+              _RECEIVE_MESSAGE_TOKEN not in self._state.due):
+            raise StopIteration()
+        else:
+            request = self._state.request
+            self._state.request = None
+            return request
 
-  def _next(self):
-    with self._state.condition:
-      self._raise_or_start_receive_message()
-      while True:
-        self._state.condition.wait()
-        request = self._look_for_request()
-        if request is not None:
-          return request
+    def _next(self):
+        with self._state.condition:
+            self._raise_or_start_receive_message()
+            while True:
+                self._state.condition.wait()
+                request = self._look_for_request()
+                if request is not None:
+                    return request
 
-  def __iter__(self):
-    return self
+    def __iter__(self):
+        return self
 
-  def __next__(self):
-    return self._next()
+    def __next__(self):
+        return self._next()
 
-  def next(self):
-    return self._next()
+    def next(self):
+        return self._next()
 
 
 def _unary_request(rpc_event, state, request_deserializer):
-  def unary_request():
-    with state.condition:
-      if state.client is _CANCELLED or state.statused:
-        return None
-      else:
-        start_server_batch_result = rpc_event.operation_call.start_server_batch(
-            cygrpc.Operations(
-                (cygrpc.operation_receive_message(_EMPTY_FLAGS),)),
-            _receive_message(
-                state, rpc_event.operation_call, request_deserializer))
-        state.due.add(_RECEIVE_MESSAGE_TOKEN)
-        while True:
-          state.condition.wait()
-          if state.request is None:
-            if state.client is _CLOSED:
-              details = '"{}" requires exactly one request message.'.format(
-                  rpc_event.request_call_details.method)
-              _abort(
-                  state, rpc_event.operation_call,
-                  cygrpc.StatusCode.unimplemented, _common.encode(details))
-              return None
-            elif state.client is _CANCELLED:
-              return None
-          else:
-            request = state.request
-            state.request = None
-            return request
-  return unary_request
+
+    def unary_request():
+        with state.condition:
+            if state.client is _CANCELLED or state.statused:
+                return None
+            else:
+                start_server_batch_result = rpc_event.operation_call.start_server_batch(
+                    cygrpc.Operations(
+                        (cygrpc.operation_receive_message(_EMPTY_FLAGS),)),
+                    _receive_message(state, rpc_event.operation_call,
+                                     request_deserializer))
+                state.due.add(_RECEIVE_MESSAGE_TOKEN)
+                while True:
+                    state.condition.wait()
+                    if state.request is None:
+                        if state.client is _CLOSED:
+                            details = '"{}" requires exactly one request message.'.format(
+                                rpc_event.request_call_details.method)
+                            _abort(state, rpc_event.operation_call,
+                                   cygrpc.StatusCode.unimplemented,
+                                   _common.encode(details))
+                            return None
+                        elif state.client is _CANCELLED:
+                            return None
+                    else:
+                        request = state.request
+                        state.request = None
+                        return request
+
+    return unary_request
 
 
 def _call_behavior(rpc_event, state, behavior, argument, request_deserializer):
-  context = _Context(rpc_event, state, request_deserializer)
-  try:
-    return behavior(argument, context), True
-  except Exception as e:  # pylint: disable=broad-except
-    with state.condition:
-      if e not in state.rpc_errors:
-        details = 'Exception calling application: {}'.format(e)
-        logging.exception(details)
-        _abort(state, rpc_event.operation_call,
-               cygrpc.StatusCode.unknown, _common.encode(details))
-    return None, False
+    context = _Context(rpc_event, state, request_deserializer)
+    try:
+        return behavior(argument, context), True
+    except Exception as e:  # pylint: disable=broad-except
+        with state.condition:
+            if e not in state.rpc_errors:
+                details = 'Exception calling application: {}'.format(e)
+                logging.exception(details)
+                _abort(state, rpc_event.operation_call,
+                       cygrpc.StatusCode.unknown, _common.encode(details))
+        return None, False
 
 
 def _take_response_from_response_iterator(rpc_event, state, response_iterator):
-  try:
-    return next(response_iterator), True
-  except StopIteration:
-    return None, True
-  except Exception as e:  # pylint: disable=broad-except
-    with state.condition:
-      if e not in state.rpc_errors:
-        details = 'Exception iterating responses: {}'.format(e)
-        logging.exception(details)
-        _abort(state, rpc_event.operation_call,
-               cygrpc.StatusCode.unknown, _common.encode(details))
-    return None, False
+    try:
+        return next(response_iterator), True
+    except StopIteration:
+        return None, True
+    except Exception as e:  # pylint: disable=broad-except
+        with state.condition:
+            if e not in state.rpc_errors:
+                details = 'Exception iterating responses: {}'.format(e)
+                logging.exception(details)
+                _abort(state, rpc_event.operation_call,
+                       cygrpc.StatusCode.unknown, _common.encode(details))
+        return None, False
 
 
 def _serialize_response(rpc_event, state, response, response_serializer):
-  serialized_response = _common.serialize(response, response_serializer)
-  if serialized_response is None:
-    with state.condition:
-      _abort(
-          state, rpc_event.operation_call, cygrpc.StatusCode.internal,
-          b'Failed to serialize response!')
-    return None
-  else:
-    return serialized_response
+    serialized_response = _common.serialize(response, response_serializer)
+    if serialized_response is None:
+        with state.condition:
+            _abort(state, rpc_event.operation_call, cygrpc.StatusCode.internal,
+                   b'Failed to serialize response!')
+        return None
+    else:
+        return serialized_response
 
 
 def _send_response(rpc_event, state, serialized_response):
-  with state.condition:
-    if state.client is _CANCELLED or state.statused:
-      return False
-    else:
-      if state.initial_metadata_allowed:
-        operations = (
-            cygrpc.operation_send_initial_metadata(
-                _EMPTY_METADATA, _EMPTY_FLAGS),
-            cygrpc.operation_send_message(serialized_response, _EMPTY_FLAGS),
-        )
-        state.initial_metadata_allowed = False
-        token = _SEND_INITIAL_METADATA_AND_SEND_MESSAGE_TOKEN
-      else:
-        operations = (
-            cygrpc.operation_send_message(serialized_response, _EMPTY_FLAGS),
-        )
-        token = _SEND_MESSAGE_TOKEN
-      rpc_event.operation_call.start_server_batch(
-          cygrpc.Operations(operations), _send_message(state, token))
-      state.due.add(token)
-      while True:
-        state.condition.wait()
-        if token not in state.due:
-          return state.client is not _CANCELLED and not state.statused
+    with state.condition:
+        if state.client is _CANCELLED or state.statused:
+            return False
+        else:
+            if state.initial_metadata_allowed:
+                operations = (
+                    cygrpc.operation_send_initial_metadata(_EMPTY_METADATA,
+                                                           _EMPTY_FLAGS),
+                    cygrpc.operation_send_message(serialized_response,
+                                                  _EMPTY_FLAGS),)
+                state.initial_metadata_allowed = False
+                token = _SEND_INITIAL_METADATA_AND_SEND_MESSAGE_TOKEN
+            else:
+                operations = (cygrpc.operation_send_message(serialized_response,
+                                                            _EMPTY_FLAGS),)
+                token = _SEND_MESSAGE_TOKEN
+            rpc_event.operation_call.start_server_batch(
+                cygrpc.Operations(operations), _send_message(state, token))
+            state.due.add(token)
+            while True:
+                state.condition.wait()
+                if token not in state.due:
+                    return state.client is not _CANCELLED and not state.statused
 
 
 def _status(rpc_event, state, serialized_response):
-  with state.condition:
-    if state.client is not _CANCELLED:
-      trailing_metadata = _common.cygrpc_metadata(state.trailing_metadata)
-      code = _completion_code(state)
-      details = _details(state)
-      operations = [
-          cygrpc.operation_send_status_from_server(
-              trailing_metadata, code, details, _EMPTY_FLAGS),
-      ]
-      if state.initial_metadata_allowed:
-        operations.append(
-            cygrpc.operation_send_initial_metadata(
-                _EMPTY_METADATA, _EMPTY_FLAGS))
-      if serialized_response is not None:
-        operations.append(cygrpc.operation_send_message(
-            serialized_response, _EMPTY_FLAGS))
-      rpc_event.operation_call.start_server_batch(
-          cygrpc.Operations(operations),
-          _send_status_from_server(state, _SEND_STATUS_FROM_SERVER_TOKEN))
-      state.statused = True
-      state.due.add(_SEND_STATUS_FROM_SERVER_TOKEN)
+    with state.condition:
+        if state.client is not _CANCELLED:
+            trailing_metadata = _common.cygrpc_metadata(state.trailing_metadata)
+            code = _completion_code(state)
+            details = _details(state)
+            operations = [
+                cygrpc.operation_send_status_from_server(
+                    trailing_metadata, code, details, _EMPTY_FLAGS),
+            ]
+            if state.initial_metadata_allowed:
+                operations.append(
+                    cygrpc.operation_send_initial_metadata(_EMPTY_METADATA,
+                                                           _EMPTY_FLAGS))
+            if serialized_response is not None:
+                operations.append(
+                    cygrpc.operation_send_message(serialized_response,
+                                                  _EMPTY_FLAGS))
+            rpc_event.operation_call.start_server_batch(
+                cygrpc.Operations(operations),
+                _send_status_from_server(state, _SEND_STATUS_FROM_SERVER_TOKEN))
+            state.statused = True
+            state.due.add(_SEND_STATUS_FROM_SERVER_TOKEN)
 
 
-def _unary_response_in_pool(
-    rpc_event, state, behavior, argument_thunk, request_deserializer,
-    response_serializer):
-  argument = argument_thunk()
-  if argument is not None:
-    response, proceed = _call_behavior(
-        rpc_event, state, behavior, argument, request_deserializer)
-    if proceed:
-      serialized_response = _serialize_response(
-          rpc_event, state, response, response_serializer)
-      if serialized_response is not None:
-        _status(rpc_event, state, serialized_response)
-
-
-def _stream_response_in_pool(
-    rpc_event, state, behavior, argument_thunk, request_deserializer,
-    response_serializer):
-  argument = argument_thunk()
-  if argument is not None:
-    response_iterator, proceed = _call_behavior(
-        rpc_event, state, behavior, argument, request_deserializer)
-    if proceed:
-      while True:
-        response, proceed = _take_response_from_response_iterator(
-            rpc_event, state, response_iterator)
+def _unary_response_in_pool(rpc_event, state, behavior, argument_thunk,
+                            request_deserializer, response_serializer):
+    argument = argument_thunk()
+    if argument is not None:
+        response, proceed = _call_behavior(rpc_event, state, behavior, argument,
+                                           request_deserializer)
         if proceed:
-          if response is None:
-            _status(rpc_event, state, None)
-            break
-          else:
             serialized_response = _serialize_response(
                 rpc_event, state, response, response_serializer)
             if serialized_response is not None:
-              proceed = _send_response(rpc_event, state, serialized_response)
-              if not proceed:
-                break
-            else:
-              break
-        else:
-          break
+                _status(rpc_event, state, serialized_response)
+
+
+def _stream_response_in_pool(rpc_event, state, behavior, argument_thunk,
+                             request_deserializer, response_serializer):
+    argument = argument_thunk()
+    if argument is not None:
+        response_iterator, proceed = _call_behavior(
+            rpc_event, state, behavior, argument, request_deserializer)
+        if proceed:
+            while True:
+                response, proceed = _take_response_from_response_iterator(
+                    rpc_event, state, response_iterator)
+                if proceed:
+                    if response is None:
+                        _status(rpc_event, state, None)
+                        break
+                    else:
+                        serialized_response = _serialize_response(
+                            rpc_event, state, response, response_serializer)
+                        if serialized_response is not None:
+                            proceed = _send_response(rpc_event, state,
+                                                     serialized_response)
+                            if not proceed:
+                                break
+                        else:
+                            break
+                else:
+                    break
 
 
 def _handle_unary_unary(rpc_event, state, method_handler, thread_pool):
-  unary_request = _unary_request(
-      rpc_event, state, method_handler.request_deserializer)
-  thread_pool.submit(
-      _unary_response_in_pool, rpc_event, state, method_handler.unary_unary,
-      unary_request, method_handler.request_deserializer,
-      method_handler.response_serializer)
+    unary_request = _unary_request(rpc_event, state,
+                                   method_handler.request_deserializer)
+    thread_pool.submit(_unary_response_in_pool, rpc_event, state,
+                       method_handler.unary_unary, unary_request,
+                       method_handler.request_deserializer,
+                       method_handler.response_serializer)
 
 
 def _handle_unary_stream(rpc_event, state, method_handler, thread_pool):
-  unary_request = _unary_request(
-      rpc_event, state, method_handler.request_deserializer)
-  thread_pool.submit(
-      _stream_response_in_pool, rpc_event, state, method_handler.unary_stream,
-      unary_request, method_handler.request_deserializer,
-      method_handler.response_serializer)
+    unary_request = _unary_request(rpc_event, state,
+                                   method_handler.request_deserializer)
+    thread_pool.submit(_stream_response_in_pool, rpc_event, state,
+                       method_handler.unary_stream, unary_request,
+                       method_handler.request_deserializer,
+                       method_handler.response_serializer)
 
 
 def _handle_stream_unary(rpc_event, state, method_handler, thread_pool):
-  request_iterator = _RequestIterator(
-      state, rpc_event.operation_call, method_handler.request_deserializer)
-  thread_pool.submit(
-      _unary_response_in_pool, rpc_event, state, method_handler.stream_unary,
-      lambda: request_iterator, method_handler.request_deserializer,
-      method_handler.response_serializer)
+    request_iterator = _RequestIterator(state, rpc_event.operation_call,
+                                        method_handler.request_deserializer)
+    thread_pool.submit(_unary_response_in_pool, rpc_event, state,
+                       method_handler.stream_unary, lambda: request_iterator,
+                       method_handler.request_deserializer,
+                       method_handler.response_serializer)
 
 
 def _handle_stream_stream(rpc_event, state, method_handler, thread_pool):
-  request_iterator = _RequestIterator(
-      state, rpc_event.operation_call, method_handler.request_deserializer)
-  thread_pool.submit(
-      _stream_response_in_pool, rpc_event, state, method_handler.stream_stream,
-      lambda: request_iterator, method_handler.request_deserializer,
-      method_handler.response_serializer)
+    request_iterator = _RequestIterator(state, rpc_event.operation_call,
+                                        method_handler.request_deserializer)
+    thread_pool.submit(_stream_response_in_pool, rpc_event, state,
+                       method_handler.stream_stream, lambda: request_iterator,
+                       method_handler.request_deserializer,
+                       method_handler.response_serializer)
 
 
 def _find_method_handler(rpc_event, generic_handlers):
-  for generic_handler in generic_handlers:
-    method_handler = generic_handler.service(
-        _HandlerCallDetails(
-            _common.decode(rpc_event.request_call_details.method),
-            rpc_event.request_metadata))
-    if method_handler is not None:
-      return method_handler
-  else:
-    return None
+    for generic_handler in generic_handlers:
+        method_handler = generic_handler.service(
+            _HandlerCallDetails(
+                _common.decode(rpc_event.request_call_details.method),
+                rpc_event.request_metadata))
+        if method_handler is not None:
+            return method_handler
+    else:
+        return None
 
 
 def _handle_unrecognized_method(rpc_event):
-  operations = (
-      cygrpc.operation_send_initial_metadata(_EMPTY_METADATA, _EMPTY_FLAGS),
-      cygrpc.operation_receive_close_on_server(_EMPTY_FLAGS),
-      cygrpc.operation_send_status_from_server(
-          _EMPTY_METADATA, cygrpc.StatusCode.unimplemented,
-          b'Method not found!', _EMPTY_FLAGS),
-  )
-  rpc_state = _RPCState()
-  rpc_event.operation_call.start_server_batch(
-      operations, lambda ignored_event: (rpc_state, (),))
-  return rpc_state
+    operations = (
+        cygrpc.operation_send_initial_metadata(_EMPTY_METADATA, _EMPTY_FLAGS),
+        cygrpc.operation_receive_close_on_server(_EMPTY_FLAGS),
+        cygrpc.operation_send_status_from_server(
+            _EMPTY_METADATA, cygrpc.StatusCode.unimplemented,
+            b'Method not found!', _EMPTY_FLAGS),)
+    rpc_state = _RPCState()
+    rpc_event.operation_call.start_server_batch(operations,
+                                                lambda ignored_event: (
+                                                    rpc_state,
+                                                    (),))
+    return rpc_state
 
 
 def _handle_with_method_handler(rpc_event, method_handler, thread_pool):
-  state = _RPCState()
-  with state.condition:
-    rpc_event.operation_call.start_server_batch(
-        cygrpc.Operations(
-            (cygrpc.operation_receive_close_on_server(_EMPTY_FLAGS),)),
-        _receive_close_on_server(state))
-    state.due.add(_RECEIVE_CLOSE_ON_SERVER_TOKEN)
-    if method_handler.request_streaming:
-      if method_handler.response_streaming:
-        _handle_stream_stream(rpc_event, state, method_handler, thread_pool)
-      else:
-        _handle_stream_unary(rpc_event, state, method_handler, thread_pool)
-    else:
-      if method_handler.response_streaming:
-        _handle_unary_stream(rpc_event, state, method_handler, thread_pool)
-      else:
-        _handle_unary_unary(rpc_event, state, method_handler, thread_pool)
-    return state
+    state = _RPCState()
+    with state.condition:
+        rpc_event.operation_call.start_server_batch(
+            cygrpc.Operations(
+                (cygrpc.operation_receive_close_on_server(_EMPTY_FLAGS),)),
+            _receive_close_on_server(state))
+        state.due.add(_RECEIVE_CLOSE_ON_SERVER_TOKEN)
+        if method_handler.request_streaming:
+            if method_handler.response_streaming:
+                _handle_stream_stream(rpc_event, state, method_handler,
+                                      thread_pool)
+            else:
+                _handle_stream_unary(rpc_event, state, method_handler,
+                                     thread_pool)
+        else:
+            if method_handler.response_streaming:
+                _handle_unary_stream(rpc_event, state, method_handler,
+                                     thread_pool)
+            else:
+                _handle_unary_unary(rpc_event, state, method_handler,
+                                    thread_pool)
+        return state
 
 
 def _handle_call(rpc_event, generic_handlers, thread_pool):
-  if rpc_event.request_call_details.method is not None:
-    method_handler = _find_method_handler(rpc_event, generic_handlers)
-    if method_handler is None:
-      return _handle_unrecognized_method(rpc_event)
+    if rpc_event.request_call_details.method is not None:
+        method_handler = _find_method_handler(rpc_event, generic_handlers)
+        if method_handler is None:
+            return _handle_unrecognized_method(rpc_event)
+        else:
+            return _handle_with_method_handler(rpc_event, method_handler,
+                                               thread_pool)
     else:
-      return _handle_with_method_handler(rpc_event, method_handler, thread_pool)
-  else:
-    return None
+        return None
 
 
 @enum.unique
 class _ServerStage(enum.Enum):
-  STOPPED = 'stopped'
-  STARTED = 'started'
-  GRACE = 'grace'
+    STOPPED = 'stopped'
+    STARTED = 'started'
+    GRACE = 'grace'
 
 
 class _ServerState(object):
 
-  def __init__(self, completion_queue, server, generic_handlers, thread_pool):
-    self.lock = threading.Lock()
-    self.completion_queue = completion_queue
-    self.server = server
-    self.generic_handlers = list(generic_handlers)
-    self.thread_pool = thread_pool
-    self.stage = _ServerStage.STOPPED
-    self.shutdown_events = None
+    def __init__(self, completion_queue, server, generic_handlers, thread_pool):
+        self.lock = threading.Lock()
+        self.completion_queue = completion_queue
+        self.server = server
+        self.generic_handlers = list(generic_handlers)
+        self.thread_pool = thread_pool
+        self.stage = _ServerStage.STOPPED
+        self.shutdown_events = None
 
-    # TODO(https://github.com/grpc/grpc/issues/6597): eliminate these fields.
-    self.rpc_states = set()
-    self.due = set()
+        # TODO(https://github.com/grpc/grpc/issues/6597): eliminate these fields.
+        self.rpc_states = set()
+        self.due = set()
 
 
 def _add_generic_handlers(state, generic_handlers):
-  with state.lock:
-    state.generic_handlers.extend(generic_handlers)
+    with state.lock:
+        state.generic_handlers.extend(generic_handlers)
 
 
 def _add_insecure_port(state, address):
-  with state.lock:
-    return state.server.add_http2_port(address)
+    with state.lock:
+        return state.server.add_http2_port(address)
 
 
 def _add_secure_port(state, address, server_credentials):
-  with state.lock:
-    return state.server.add_http2_port(address, server_credentials._credentials)
+    with state.lock:
+        return state.server.add_http2_port(address,
+                                           server_credentials._credentials)
 
 
 def _request_call(state):
-  state.server.request_call(
-      state.completion_queue, state.completion_queue, _REQUEST_CALL_TAG)
-  state.due.add(_REQUEST_CALL_TAG)
+    state.server.request_call(state.completion_queue, state.completion_queue,
+                              _REQUEST_CALL_TAG)
+    state.due.add(_REQUEST_CALL_TAG)
 
 
 # TODO(https://github.com/grpc/grpc/issues/6597): delete this function.
 def _stop_serving(state):
-  if not state.rpc_states and not state.due:
-    for shutdown_event in state.shutdown_events:
-      shutdown_event.set()
-    state.stage = _ServerStage.STOPPED
-    return True
-  else:
-    return False
+    if not state.rpc_states and not state.due:
+        for shutdown_event in state.shutdown_events:
+            shutdown_event.set()
+        state.stage = _ServerStage.STOPPED
+        return True
+    else:
+        return False
 
 
 def _serve(state):
-  while True:
-    event = state.completion_queue.poll()
-    if event.tag is _SHUTDOWN_TAG:
-      with state.lock:
-        state.due.remove(_SHUTDOWN_TAG)
-        if _stop_serving(state):
-          return
-    elif event.tag is _REQUEST_CALL_TAG:
-      with state.lock:
-        state.due.remove(_REQUEST_CALL_TAG)
-        rpc_state = _handle_call(
-            event, state.generic_handlers, state.thread_pool)
-        if rpc_state is not None:
-          state.rpc_states.add(rpc_state)
-        if state.stage is _ServerStage.STARTED:
-          _request_call(state)
-        elif _stop_serving(state):
-          return
-    else:
-      rpc_state, callbacks = event.tag(event)
-      for callback in callbacks:
-        callable_util.call_logging_exceptions(
-            callback, 'Exception calling callback!')
-      if rpc_state is not None:
-        with state.lock:
-          state.rpc_states.remove(rpc_state)
-          if _stop_serving(state):
-            return
+    while True:
+        event = state.completion_queue.poll()
+        if event.tag is _SHUTDOWN_TAG:
+            with state.lock:
+                state.due.remove(_SHUTDOWN_TAG)
+                if _stop_serving(state):
+                    return
+        elif event.tag is _REQUEST_CALL_TAG:
+            with state.lock:
+                state.due.remove(_REQUEST_CALL_TAG)
+                rpc_state = _handle_call(event, state.generic_handlers,
+                                         state.thread_pool)
+                if rpc_state is not None:
+                    state.rpc_states.add(rpc_state)
+                if state.stage is _ServerStage.STARTED:
+                    _request_call(state)
+                elif _stop_serving(state):
+                    return
+        else:
+            rpc_state, callbacks = event.tag(event)
+            for callback in callbacks:
+                callable_util.call_logging_exceptions(
+                    callback, 'Exception calling callback!')
+            if rpc_state is not None:
+                with state.lock:
+                    state.rpc_states.remove(rpc_state)
+                    if _stop_serving(state):
+                        return
 
 
 def _stop(state, grace):
-  with state.lock:
-    if state.stage is _ServerStage.STOPPED:
-      shutdown_event = threading.Event()
-      shutdown_event.set()
-      return shutdown_event
-    else:
-      if state.stage is _ServerStage.STARTED:
-        state.server.shutdown(state.completion_queue, _SHUTDOWN_TAG)
-        state.stage = _ServerStage.GRACE
-        state.shutdown_events = []
-        state.due.add(_SHUTDOWN_TAG)
-      shutdown_event = threading.Event()
-      state.shutdown_events.append(shutdown_event)
-      if grace is None:
-        state.server.cancel_all_calls()
-        # TODO(https://github.com/grpc/grpc/issues/6597): delete this loop.
-        for rpc_state in state.rpc_states:
-          with rpc_state.condition:
-            rpc_state.client = _CANCELLED
-            rpc_state.condition.notify_all()
-      else:
-        def cancel_all_calls_after_grace():
-          shutdown_event.wait(timeout=grace)
-          with state.lock:
-            state.server.cancel_all_calls()
-            # TODO(https://github.com/grpc/grpc/issues/6597): delete this loop.
-            for rpc_state in state.rpc_states:
-              with rpc_state.condition:
-                rpc_state.client = _CANCELLED
-                rpc_state.condition.notify_all()
-        thread = threading.Thread(target=cancel_all_calls_after_grace)
-        thread.start()
-        return shutdown_event
-  shutdown_event.wait()
-  return shutdown_event
+    with state.lock:
+        if state.stage is _ServerStage.STOPPED:
+            shutdown_event = threading.Event()
+            shutdown_event.set()
+            return shutdown_event
+        else:
+            if state.stage is _ServerStage.STARTED:
+                state.server.shutdown(state.completion_queue, _SHUTDOWN_TAG)
+                state.stage = _ServerStage.GRACE
+                state.shutdown_events = []
+                state.due.add(_SHUTDOWN_TAG)
+            shutdown_event = threading.Event()
+            state.shutdown_events.append(shutdown_event)
+            if grace is None:
+                state.server.cancel_all_calls()
+                # TODO(https://github.com/grpc/grpc/issues/6597): delete this loop.
+                for rpc_state in state.rpc_states:
+                    with rpc_state.condition:
+                        rpc_state.client = _CANCELLED
+                        rpc_state.condition.notify_all()
+            else:
+
+                def cancel_all_calls_after_grace():
+                    shutdown_event.wait(timeout=grace)
+                    with state.lock:
+                        state.server.cancel_all_calls()
+                        # TODO(https://github.com/grpc/grpc/issues/6597): delete this loop.
+                        for rpc_state in state.rpc_states:
+                            with rpc_state.condition:
+                                rpc_state.client = _CANCELLED
+                                rpc_state.condition.notify_all()
+
+                thread = threading.Thread(target=cancel_all_calls_after_grace)
+                thread.start()
+                return shutdown_event
+    shutdown_event.wait()
+    return shutdown_event
 
 
 def _start(state):
-  with state.lock:
-    if state.stage is not _ServerStage.STOPPED:
-      raise ValueError('Cannot start already-started server!')
-    state.server.start()
-    state.stage = _ServerStage.STARTED
-    _request_call(state)    
-    def cleanup_server(timeout):
-      if timeout is None:
-        _stop(state, _UNEXPECTED_EXIT_SERVER_GRACE).wait()
-      else:
-        _stop(state, timeout).wait()
+    with state.lock:
+        if state.stage is not _ServerStage.STOPPED:
+            raise ValueError('Cannot start already-started server!')
+        state.server.start()
+        state.stage = _ServerStage.STARTED
+        _request_call(state)
 
-    thread = _common.CleanupThread(
-        cleanup_server, target=_serve, args=(state,))
-    thread.start()
+        def cleanup_server(timeout):
+            if timeout is None:
+                _stop(state, _UNEXPECTED_EXIT_SERVER_GRACE).wait()
+            else:
+                _stop(state, timeout).wait()
+
+        thread = _common.CleanupThread(
+            cleanup_server, target=_serve, args=(state,))
+        thread.start()
+
 
 class Server(grpc.Server):
 
-  def __init__(self, thread_pool, generic_handlers, options):
-    completion_queue = cygrpc.CompletionQueue()
-    server = cygrpc.Server(_common.channel_args(options))
-    server.register_completion_queue(completion_queue)
-    self._state = _ServerState(
-        completion_queue, server, generic_handlers, thread_pool)
+    def __init__(self, thread_pool, generic_handlers, options):
+        completion_queue = cygrpc.CompletionQueue()
+        server = cygrpc.Server(_common.channel_args(options))
+        server.register_completion_queue(completion_queue)
+        self._state = _ServerState(completion_queue, server, generic_handlers,
+                                   thread_pool)
 
-  def add_generic_rpc_handlers(self, generic_rpc_handlers):
-    _add_generic_handlers(self._state, generic_rpc_handlers)
+    def add_generic_rpc_handlers(self, generic_rpc_handlers):
+        _add_generic_handlers(self._state, generic_rpc_handlers)
 
-  def add_insecure_port(self, address):
-    return _add_insecure_port(self._state, _common.encode(address))
+    def add_insecure_port(self, address):
+        return _add_insecure_port(self._state, _common.encode(address))
 
-  def add_secure_port(self, address, server_credentials):
-    return _add_secure_port(self._state, _common.encode(address), server_credentials)
+    def add_secure_port(self, address, server_credentials):
+        return _add_secure_port(self._state,
+                                _common.encode(address), server_credentials)
 
-  def start(self):
-    _start(self._state)
+    def start(self):
+        _start(self._state)
 
-  def stop(self, grace):
-    return _stop(self._state, grace)
+    def stop(self, grace):
+        return _stop(self._state, grace)
 
-  def __del__(self):
-    _stop(self._state, None)
+    def __del__(self):
+        _stop(self._state, None)
diff --git a/src/python/grpcio/grpc/_utilities.py b/src/python/grpcio/grpc/_utilities.py
index a375896..7c602eb 100644
--- a/src/python/grpcio/grpc/_utilities.py
+++ b/src/python/grpcio/grpc/_utilities.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Internal utilities for gRPC Python."""
 
 import collections
@@ -44,132 +43,136 @@
 
 
 class RpcMethodHandler(
-    collections.namedtuple(
-        '_RpcMethodHandler',
-        ('request_streaming', 'response_streaming', 'request_deserializer',
-         'response_serializer', 'unary_unary', 'unary_stream', 'stream_unary',
-         'stream_stream',)),
-    grpc.RpcMethodHandler):
-  pass
+        collections.namedtuple('_RpcMethodHandler', (
+            'request_streaming',
+            'response_streaming',
+            'request_deserializer',
+            'response_serializer',
+            'unary_unary',
+            'unary_stream',
+            'stream_unary',
+            'stream_stream',)), grpc.RpcMethodHandler):
+    pass
 
 
 class DictionaryGenericHandler(grpc.ServiceRpcHandler):
 
-  def __init__(self, service, method_handlers):
-    self._name = service
-    self._method_handlers = {
-        _common.fully_qualified_method(service, method): method_handler
-        for method, method_handler in six.iteritems(method_handlers)}
+    def __init__(self, service, method_handlers):
+        self._name = service
+        self._method_handlers = {
+            _common.fully_qualified_method(service, method): method_handler
+            for method, method_handler in six.iteritems(method_handlers)
+        }
 
-  def service_name(self):
-    return self._name
+    def service_name(self):
+        return self._name
 
-  def service(self, handler_call_details):
-    return self._method_handlers.get(handler_call_details.method)
+    def service(self, handler_call_details):
+        return self._method_handlers.get(handler_call_details.method)
 
 
 class _ChannelReadyFuture(grpc.Future):
 
-  def __init__(self, channel):
-    self._condition = threading.Condition()
-    self._channel = channel
+    def __init__(self, channel):
+        self._condition = threading.Condition()
+        self._channel = channel
 
-    self._matured = False
-    self._cancelled = False
-    self._done_callbacks = []
+        self._matured = False
+        self._cancelled = False
+        self._done_callbacks = []
 
-  def _block(self, timeout):
-    until = None if timeout is None else time.time() + timeout
-    with self._condition:
-      while True:
-        if self._cancelled:
-          raise grpc.FutureCancelledError()
-        elif self._matured:
-          return
-        else:
-          if until is None:
-            self._condition.wait()
-          else:
-            remaining = until - time.time()
-            if remaining < 0:
-              raise grpc.FutureTimeoutError()
+    def _block(self, timeout):
+        until = None if timeout is None else time.time() + timeout
+        with self._condition:
+            while True:
+                if self._cancelled:
+                    raise grpc.FutureCancelledError()
+                elif self._matured:
+                    return
+                else:
+                    if until is None:
+                        self._condition.wait()
+                    else:
+                        remaining = until - time.time()
+                        if remaining < 0:
+                            raise grpc.FutureTimeoutError()
+                        else:
+                            self._condition.wait(timeout=remaining)
+
+    def _update(self, connectivity):
+        with self._condition:
+            if (not self._cancelled and
+                    connectivity is grpc.ChannelConnectivity.READY):
+                self._matured = True
+                self._channel.unsubscribe(self._update)
+                self._condition.notify_all()
+                done_callbacks = tuple(self._done_callbacks)
+                self._done_callbacks = None
             else:
-              self._condition.wait(timeout=remaining)
+                return
 
-  def _update(self, connectivity):
-    with self._condition:
-      if (not self._cancelled and
-          connectivity is grpc.ChannelConnectivity.READY):
-        self._matured = True
-        self._channel.unsubscribe(self._update)
-        self._condition.notify_all()
-        done_callbacks = tuple(self._done_callbacks)
-        self._done_callbacks = None
-      else:
-        return
+        for done_callback in done_callbacks:
+            callable_util.call_logging_exceptions(
+                done_callback, _DONE_CALLBACK_EXCEPTION_LOG_MESSAGE, self)
 
-    for done_callback in done_callbacks:
-      callable_util.call_logging_exceptions(
-          done_callback, _DONE_CALLBACK_EXCEPTION_LOG_MESSAGE, self)
+    def cancel(self):
+        with self._condition:
+            if not self._matured:
+                self._cancelled = True
+                self._channel.unsubscribe(self._update)
+                self._condition.notify_all()
+                done_callbacks = tuple(self._done_callbacks)
+                self._done_callbacks = None
+            else:
+                return False
 
-  def cancel(self):
-    with self._condition:
-      if not self._matured:
-        self._cancelled = True
-        self._channel.unsubscribe(self._update)
-        self._condition.notify_all()
-        done_callbacks = tuple(self._done_callbacks)
-        self._done_callbacks = None
-      else:
-        return False
+        for done_callback in done_callbacks:
+            callable_util.call_logging_exceptions(
+                done_callback, _DONE_CALLBACK_EXCEPTION_LOG_MESSAGE, self)
 
-    for done_callback in done_callbacks:
-      callable_util.call_logging_exceptions(
-          done_callback, _DONE_CALLBACK_EXCEPTION_LOG_MESSAGE, self)
+    def cancelled(self):
+        with self._condition:
+            return self._cancelled
 
-  def cancelled(self):
-    with self._condition:
-      return self._cancelled
+    def running(self):
+        with self._condition:
+            return not self._cancelled and not self._matured
 
-  def running(self):
-    with self._condition:
-      return not self._cancelled and not self._matured
+    def done(self):
+        with self._condition:
+            return self._cancelled or self._matured
 
-  def done(self):
-    with self._condition:
-      return self._cancelled or self._matured
+    def result(self, timeout=None):
+        self._block(timeout)
+        return None
 
-  def result(self, timeout=None):
-    self._block(timeout)
-    return None
+    def exception(self, timeout=None):
+        self._block(timeout)
+        return None
 
-  def exception(self, timeout=None):
-    self._block(timeout)
-    return None
+    def traceback(self, timeout=None):
+        self._block(timeout)
+        return None
 
-  def traceback(self, timeout=None):
-    self._block(timeout)
-    return None
+    def add_done_callback(self, fn):
+        with self._condition:
+            if not self._cancelled and not self._matured:
+                self._done_callbacks.append(fn)
+                return
 
-  def add_done_callback(self, fn):
-    with self._condition:
-      if not self._cancelled and not self._matured:
-        self._done_callbacks.append(fn)
-        return
+        fn(self)
 
-    fn(self)
+    def start(self):
+        with self._condition:
+            self._channel.subscribe(self._update, try_to_connect=True)
 
-  def start(self):
-    with self._condition:
-      self._channel.subscribe(self._update, try_to_connect=True)
-
-  def __del__(self):
-    with self._condition:
-      if not self._cancelled and not self._matured:
-        self._channel.unsubscribe(self._update)
+    def __del__(self):
+        with self._condition:
+            if not self._cancelled and not self._matured:
+                self._channel.unsubscribe(self._update)
 
 
 def channel_ready_future(channel):
-  ready_future = _ChannelReadyFuture(channel)
-  ready_future.start()
-  return ready_future
+    ready_future = _ChannelReadyFuture(channel)
+    ready_future.start()
+    return ready_future
diff --git a/src/python/grpcio/grpc/beta/_client_adaptations.py b/src/python/grpcio/grpc/beta/_client_adaptations.py
index e4ee44d..e5b28e9 100644
--- a/src/python/grpcio/grpc/beta/_client_adaptations.py
+++ b/src/python/grpcio/grpc/beta/_client_adaptations.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Translates gRPC's client-side API into gRPC's client-side Beta API."""
 
 import grpc
@@ -38,531 +37,654 @@
 from grpc.framework.interfaces.face import face
 
 _STATUS_CODE_TO_ABORTION_KIND_AND_ABORTION_ERROR_CLASS = {
-    grpc.StatusCode.CANCELLED: (
-        face.Abortion.Kind.CANCELLED, face.CancellationError),
-    grpc.StatusCode.UNKNOWN: (
-        face.Abortion.Kind.REMOTE_FAILURE, face.RemoteError),
-    grpc.StatusCode.DEADLINE_EXCEEDED: (
-        face.Abortion.Kind.EXPIRED, face.ExpirationError),
-    grpc.StatusCode.UNIMPLEMENTED: (
-        face.Abortion.Kind.LOCAL_FAILURE, face.LocalError),
+    grpc.StatusCode.CANCELLED: (face.Abortion.Kind.CANCELLED,
+                                face.CancellationError),
+    grpc.StatusCode.UNKNOWN: (face.Abortion.Kind.REMOTE_FAILURE,
+                              face.RemoteError),
+    grpc.StatusCode.DEADLINE_EXCEEDED: (face.Abortion.Kind.EXPIRED,
+                                        face.ExpirationError),
+    grpc.StatusCode.UNIMPLEMENTED: (face.Abortion.Kind.LOCAL_FAILURE,
+                                    face.LocalError),
 }
 
 
 def _effective_metadata(metadata, metadata_transformer):
-  non_none_metadata = () if metadata is None else metadata
-  if metadata_transformer is None:
-    return non_none_metadata
-  else:
-    return metadata_transformer(non_none_metadata)
+    non_none_metadata = () if metadata is None else metadata
+    if metadata_transformer is None:
+        return non_none_metadata
+    else:
+        return metadata_transformer(non_none_metadata)
 
 
 def _credentials(grpc_call_options):
-  return None if grpc_call_options is None else grpc_call_options.credentials
+    return None if grpc_call_options is None else grpc_call_options.credentials
 
 
 def _abortion(rpc_error_call):
-  code = rpc_error_call.code()
-  pair = _STATUS_CODE_TO_ABORTION_KIND_AND_ABORTION_ERROR_CLASS.get(code)
-  error_kind = face.Abortion.Kind.LOCAL_FAILURE if pair is None else pair[0]
-  return face.Abortion(
-      error_kind, rpc_error_call.initial_metadata(),
-      rpc_error_call.trailing_metadata(), code, rpc_error_call.details())
+    code = rpc_error_call.code()
+    pair = _STATUS_CODE_TO_ABORTION_KIND_AND_ABORTION_ERROR_CLASS.get(code)
+    error_kind = face.Abortion.Kind.LOCAL_FAILURE if pair is None else pair[0]
+    return face.Abortion(error_kind,
+                         rpc_error_call.initial_metadata(),
+                         rpc_error_call.trailing_metadata(), code,
+                         rpc_error_call.details())
 
 
 def _abortion_error(rpc_error_call):
-  code = rpc_error_call.code()
-  pair = _STATUS_CODE_TO_ABORTION_KIND_AND_ABORTION_ERROR_CLASS.get(code)
-  exception_class = face.AbortionError if pair is None else pair[1]
-  return exception_class(
-      rpc_error_call.initial_metadata(), rpc_error_call.trailing_metadata(),
-      code, rpc_error_call.details())
+    code = rpc_error_call.code()
+    pair = _STATUS_CODE_TO_ABORTION_KIND_AND_ABORTION_ERROR_CLASS.get(code)
+    exception_class = face.AbortionError if pair is None else pair[1]
+    return exception_class(rpc_error_call.initial_metadata(),
+                           rpc_error_call.trailing_metadata(), code,
+                           rpc_error_call.details())
 
 
 class _InvocationProtocolContext(interfaces.GRPCInvocationContext):
 
-  def disable_next_request_compression(self):
-    pass  # TODO(https://github.com/grpc/grpc/issues/4078): design, implement.
+    def disable_next_request_compression(self):
+        pass  # TODO(https://github.com/grpc/grpc/issues/4078): design, implement.
 
 
 class _Rendezvous(future.Future, face.Call):
 
-  def __init__(self, response_future, response_iterator, call):
-    self._future = response_future
-    self._iterator = response_iterator
-    self._call = call
+    def __init__(self, response_future, response_iterator, call):
+        self._future = response_future
+        self._iterator = response_iterator
+        self._call = call
 
-  def cancel(self):
-    return self._call.cancel()
+    def cancel(self):
+        return self._call.cancel()
 
-  def cancelled(self):
-    return self._future.cancelled()
+    def cancelled(self):
+        return self._future.cancelled()
 
-  def running(self):
-    return self._future.running()
+    def running(self):
+        return self._future.running()
 
-  def done(self):
-    return self._future.done()
+    def done(self):
+        return self._future.done()
 
-  def result(self, timeout=None):
+    def result(self, timeout=None):
+        try:
+            return self._future.result(timeout=timeout)
+        except grpc.RpcError as rpc_error_call:
+            raise _abortion_error(rpc_error_call)
+        except grpc.FutureTimeoutError:
+            raise future.TimeoutError()
+        except grpc.FutureCancelledError:
+            raise future.CancelledError()
+
+    def exception(self, timeout=None):
+        try:
+            rpc_error_call = self._future.exception(timeout=timeout)
+            if rpc_error_call is None:
+                return None
+            else:
+                return _abortion_error(rpc_error_call)
+        except grpc.FutureTimeoutError:
+            raise future.TimeoutError()
+        except grpc.FutureCancelledError:
+            raise future.CancelledError()
+
+    def traceback(self, timeout=None):
+        try:
+            return self._future.traceback(timeout=timeout)
+        except grpc.FutureTimeoutError:
+            raise future.TimeoutError()
+        except grpc.FutureCancelledError:
+            raise future.CancelledError()
+
+    def add_done_callback(self, fn):
+        self._future.add_done_callback(lambda ignored_callback: fn(self))
+
+    def __iter__(self):
+        return self
+
+    def _next(self):
+        try:
+            return next(self._iterator)
+        except grpc.RpcError as rpc_error_call:
+            raise _abortion_error(rpc_error_call)
+
+    def __next__(self):
+        return self._next()
+
+    def next(self):
+        return self._next()
+
+    def is_active(self):
+        return self._call.is_active()
+
+    def time_remaining(self):
+        return self._call.time_remaining()
+
+    def add_abortion_callback(self, abortion_callback):
+
+        def done_callback():
+            if self.code() is not grpc.StatusCode.OK:
+                abortion_callback(_abortion(self._call))
+
+        registered = self._call.add_callback(done_callback)
+        return None if registered else done_callback()
+
+    def protocol_context(self):
+        return _InvocationProtocolContext()
+
+    def initial_metadata(self):
+        return self._call.initial_metadata()
+
+    def terminal_metadata(self):
+        return self._call.terminal_metadata()
+
+    def code(self):
+        return self._call.code()
+
+    def details(self):
+        return self._call.details()
+
+
+def _blocking_unary_unary(channel, group, method, timeout, with_call,
+                          protocol_options, metadata, metadata_transformer,
+                          request, request_serializer, response_deserializer):
     try:
-      return self._future.result(timeout=timeout)
+        multi_callable = channel.unary_unary(
+            _common.fully_qualified_method(group, method),
+            request_serializer=request_serializer,
+            response_deserializer=response_deserializer)
+        effective_metadata = _effective_metadata(metadata, metadata_transformer)
+        if with_call:
+            response, call = multi_callable.with_call(
+                request,
+                timeout=timeout,
+                metadata=effective_metadata,
+                credentials=_credentials(protocol_options))
+            return response, _Rendezvous(None, None, call)
+        else:
+            return multi_callable(
+                request,
+                timeout=timeout,
+                metadata=effective_metadata,
+                credentials=_credentials(protocol_options))
     except grpc.RpcError as rpc_error_call:
-      raise _abortion_error(rpc_error_call)
-    except grpc.FutureTimeoutError:
-      raise future.TimeoutError()
-    except grpc.FutureCancelledError:
-      raise future.CancelledError()
-
-  def exception(self, timeout=None):
-    try:
-      rpc_error_call = self._future.exception(timeout=timeout)
-      if rpc_error_call is None:
-        return None
-      else:
-        return _abortion_error(rpc_error_call)
-    except grpc.FutureTimeoutError:
-      raise future.TimeoutError()
-    except grpc.FutureCancelledError:
-      raise future.CancelledError()
-
-  def traceback(self, timeout=None):
-    try:
-      return self._future.traceback(timeout=timeout)
-    except grpc.FutureTimeoutError:
-      raise future.TimeoutError()
-    except grpc.FutureCancelledError:
-      raise future.CancelledError()
-
-  def add_done_callback(self, fn):
-    self._future.add_done_callback(lambda ignored_callback: fn(self))
-
-  def __iter__(self):
-    return self
-
-  def _next(self):
-    try:
-      return next(self._iterator)
-    except grpc.RpcError as rpc_error_call:
-      raise _abortion_error(rpc_error_call)
-
-  def __next__(self):
-    return self._next()
-
-  def next(self):
-    return self._next()
-
-  def is_active(self):
-    return self._call.is_active()
-
-  def time_remaining(self):
-    return self._call.time_remaining()
-
-  def add_abortion_callback(self, abortion_callback):
-    def done_callback():
-      if self.code() is not grpc.StatusCode.OK:
-        abortion_callback(_abortion(self._call))
-    registered = self._call.add_callback(done_callback)
-    return None if registered else done_callback()
-
-  def protocol_context(self):
-    return _InvocationProtocolContext()
-
-  def initial_metadata(self):
-    return self._call.initial_metadata()
-
-  def terminal_metadata(self):
-    return self._call.terminal_metadata()
-
-  def code(self):
-    return self._call.code()
-
-  def details(self):
-    return self._call.details()
+        raise _abortion_error(rpc_error_call)
 
 
-def _blocking_unary_unary(
-    channel, group, method, timeout, with_call, protocol_options, metadata,
-    metadata_transformer, request, request_serializer, response_deserializer):
-  try:
+def _future_unary_unary(channel, group, method, timeout, protocol_options,
+                        metadata, metadata_transformer, request,
+                        request_serializer, response_deserializer):
     multi_callable = channel.unary_unary(
         _common.fully_qualified_method(group, method),
         request_serializer=request_serializer,
         response_deserializer=response_deserializer)
     effective_metadata = _effective_metadata(metadata, metadata_transformer)
-    if with_call:
-      response, call = multi_callable.with_call(
-          request, timeout=timeout, metadata=effective_metadata,
-          credentials=_credentials(protocol_options))
-      return response, _Rendezvous(None, None, call)
-    else:
-      return multi_callable(
-          request, timeout=timeout, metadata=effective_metadata,
-          credentials=_credentials(protocol_options))
-  except grpc.RpcError as rpc_error_call:
-    raise _abortion_error(rpc_error_call)
+    response_future = multi_callable.future(
+        request,
+        timeout=timeout,
+        metadata=effective_metadata,
+        credentials=_credentials(protocol_options))
+    return _Rendezvous(response_future, None, response_future)
 
 
-def _future_unary_unary(
-    channel, group, method, timeout, protocol_options, metadata,
-    metadata_transformer, request, request_serializer, response_deserializer):
-  multi_callable = channel.unary_unary(
-      _common.fully_qualified_method(group, method),
-      request_serializer=request_serializer,
-      response_deserializer=response_deserializer)
-  effective_metadata = _effective_metadata(metadata, metadata_transformer)
-  response_future = multi_callable.future(
-      request, timeout=timeout, metadata=effective_metadata,
-      credentials=_credentials(protocol_options))
-  return _Rendezvous(response_future, None, response_future)
+def _unary_stream(channel, group, method, timeout, protocol_options, metadata,
+                  metadata_transformer, request, request_serializer,
+                  response_deserializer):
+    multi_callable = channel.unary_stream(
+        _common.fully_qualified_method(group, method),
+        request_serializer=request_serializer,
+        response_deserializer=response_deserializer)
+    effective_metadata = _effective_metadata(metadata, metadata_transformer)
+    response_iterator = multi_callable(
+        request,
+        timeout=timeout,
+        metadata=effective_metadata,
+        credentials=_credentials(protocol_options))
+    return _Rendezvous(None, response_iterator, response_iterator)
 
 
-def _unary_stream(
-    channel, group, method, timeout, protocol_options, metadata,
-    metadata_transformer, request, request_serializer, response_deserializer):
-  multi_callable = channel.unary_stream(
-      _common.fully_qualified_method(group, method),
-      request_serializer=request_serializer,
-      response_deserializer=response_deserializer)
-  effective_metadata = _effective_metadata(metadata, metadata_transformer)
-  response_iterator = multi_callable(
-      request, timeout=timeout, metadata=effective_metadata,
-      credentials=_credentials(protocol_options))
-  return _Rendezvous(None, response_iterator, response_iterator)
+def _blocking_stream_unary(channel, group, method, timeout, with_call,
+                           protocol_options, metadata, metadata_transformer,
+                           request_iterator, request_serializer,
+                           response_deserializer):
+    try:
+        multi_callable = channel.stream_unary(
+            _common.fully_qualified_method(group, method),
+            request_serializer=request_serializer,
+            response_deserializer=response_deserializer)
+        effective_metadata = _effective_metadata(metadata, metadata_transformer)
+        if with_call:
+            response, call = multi_callable.with_call(
+                request_iterator,
+                timeout=timeout,
+                metadata=effective_metadata,
+                credentials=_credentials(protocol_options))
+            return response, _Rendezvous(None, None, call)
+        else:
+            return multi_callable(
+                request_iterator,
+                timeout=timeout,
+                metadata=effective_metadata,
+                credentials=_credentials(protocol_options))
+    except grpc.RpcError as rpc_error_call:
+        raise _abortion_error(rpc_error_call)
 
 
-def _blocking_stream_unary(
-    channel, group, method, timeout, with_call, protocol_options, metadata,
-    metadata_transformer, request_iterator, request_serializer,
-    response_deserializer):
-  try:
+def _future_stream_unary(channel, group, method, timeout, protocol_options,
+                         metadata, metadata_transformer, request_iterator,
+                         request_serializer, response_deserializer):
     multi_callable = channel.stream_unary(
         _common.fully_qualified_method(group, method),
         request_serializer=request_serializer,
         response_deserializer=response_deserializer)
     effective_metadata = _effective_metadata(metadata, metadata_transformer)
-    if with_call:
-      response, call = multi_callable.with_call(
-          request_iterator, timeout=timeout, metadata=effective_metadata,
-          credentials=_credentials(protocol_options))
-      return response, _Rendezvous(None, None, call)
-    else:
-      return multi_callable(
-          request_iterator, timeout=timeout, metadata=effective_metadata,
-          credentials=_credentials(protocol_options))
-  except grpc.RpcError as rpc_error_call:
-    raise _abortion_error(rpc_error_call)
+    response_future = multi_callable.future(
+        request_iterator,
+        timeout=timeout,
+        metadata=effective_metadata,
+        credentials=_credentials(protocol_options))
+    return _Rendezvous(response_future, None, response_future)
 
 
-def _future_stream_unary(
-    channel, group, method, timeout, protocol_options, metadata,
-    metadata_transformer, request_iterator, request_serializer,
-    response_deserializer):
-  multi_callable = channel.stream_unary(
-      _common.fully_qualified_method(group, method),
-      request_serializer=request_serializer,
-      response_deserializer=response_deserializer)
-  effective_metadata = _effective_metadata(metadata, metadata_transformer)
-  response_future = multi_callable.future(
-      request_iterator, timeout=timeout, metadata=effective_metadata,
-      credentials=_credentials(protocol_options))
-  return _Rendezvous(response_future, None, response_future)
-
-
-def _stream_stream(
-    channel, group, method, timeout, protocol_options, metadata,
-    metadata_transformer, request_iterator, request_serializer,
-    response_deserializer):
-  multi_callable = channel.stream_stream(
-      _common.fully_qualified_method(group, method),
-      request_serializer=request_serializer,
-      response_deserializer=response_deserializer)
-  effective_metadata = _effective_metadata(metadata, metadata_transformer)
-  response_iterator = multi_callable(
-      request_iterator, timeout=timeout, metadata=effective_metadata,
-      credentials=_credentials(protocol_options))
-  return _Rendezvous(None, response_iterator, response_iterator)
+def _stream_stream(channel, group, method, timeout, protocol_options, metadata,
+                   metadata_transformer, request_iterator, request_serializer,
+                   response_deserializer):
+    multi_callable = channel.stream_stream(
+        _common.fully_qualified_method(group, method),
+        request_serializer=request_serializer,
+        response_deserializer=response_deserializer)
+    effective_metadata = _effective_metadata(metadata, metadata_transformer)
+    response_iterator = multi_callable(
+        request_iterator,
+        timeout=timeout,
+        metadata=effective_metadata,
+        credentials=_credentials(protocol_options))
+    return _Rendezvous(None, response_iterator, response_iterator)
 
 
 class _UnaryUnaryMultiCallable(face.UnaryUnaryMultiCallable):
 
-  def __init__(
-      self, channel, group, method, metadata_transformer, request_serializer,
-      response_deserializer):
-    self._channel = channel
-    self._group = group
-    self._method = method
-    self._metadata_transformer = metadata_transformer
-    self._request_serializer = request_serializer
-    self._response_deserializer = response_deserializer
+    def __init__(self, channel, group, method, metadata_transformer,
+                 request_serializer, response_deserializer):
+        self._channel = channel
+        self._group = group
+        self._method = method
+        self._metadata_transformer = metadata_transformer
+        self._request_serializer = request_serializer
+        self._response_deserializer = response_deserializer
 
-  def __call__(
-      self, request, timeout, metadata=None, with_call=False,
-      protocol_options=None):
-    return _blocking_unary_unary(
-        self._channel, self._group, self._method, timeout, with_call,
-        protocol_options, metadata, self._metadata_transformer, request,
-        self._request_serializer, self._response_deserializer)
+    def __call__(self,
+                 request,
+                 timeout,
+                 metadata=None,
+                 with_call=False,
+                 protocol_options=None):
+        return _blocking_unary_unary(
+            self._channel, self._group, self._method, timeout, with_call,
+            protocol_options, metadata, self._metadata_transformer, request,
+            self._request_serializer, self._response_deserializer)
 
-  def future(self, request, timeout, metadata=None, protocol_options=None):
-    return _future_unary_unary(
-        self._channel, self._group, self._method, timeout, protocol_options,
-        metadata, self._metadata_transformer, request, self._request_serializer,
-        self._response_deserializer)
+    def future(self, request, timeout, metadata=None, protocol_options=None):
+        return _future_unary_unary(
+            self._channel, self._group, self._method, timeout, protocol_options,
+            metadata, self._metadata_transformer, request,
+            self._request_serializer, self._response_deserializer)
 
-  def event(
-      self, request, receiver, abortion_callback, timeout,
-      metadata=None, protocol_options=None):
-    raise NotImplementedError()
+    def event(self,
+              request,
+              receiver,
+              abortion_callback,
+              timeout,
+              metadata=None,
+              protocol_options=None):
+        raise NotImplementedError()
 
 
 class _UnaryStreamMultiCallable(face.UnaryStreamMultiCallable):
 
-  def __init__(
-      self, channel, group, method, metadata_transformer, request_serializer,
-      response_deserializer):
-    self._channel = channel
-    self._group = group
-    self._method = method
-    self._metadata_transformer = metadata_transformer
-    self._request_serializer = request_serializer
-    self._response_deserializer = response_deserializer
+    def __init__(self, channel, group, method, metadata_transformer,
+                 request_serializer, response_deserializer):
+        self._channel = channel
+        self._group = group
+        self._method = method
+        self._metadata_transformer = metadata_transformer
+        self._request_serializer = request_serializer
+        self._response_deserializer = response_deserializer
 
-  def __call__(self, request, timeout, metadata=None, protocol_options=None):
-    return _unary_stream(
-        self._channel, self._group, self._method, timeout, protocol_options,
-        metadata, self._metadata_transformer, request, self._request_serializer,
-        self._response_deserializer)
+    def __call__(self, request, timeout, metadata=None, protocol_options=None):
+        return _unary_stream(
+            self._channel, self._group, self._method, timeout, protocol_options,
+            metadata, self._metadata_transformer, request,
+            self._request_serializer, self._response_deserializer)
 
-  def event(
-      self, request, receiver, abortion_callback, timeout,
-      metadata=None, protocol_options=None):
-    raise NotImplementedError()
+    def event(self,
+              request,
+              receiver,
+              abortion_callback,
+              timeout,
+              metadata=None,
+              protocol_options=None):
+        raise NotImplementedError()
 
 
 class _StreamUnaryMultiCallable(face.StreamUnaryMultiCallable):
 
-  def __init__(
-      self, channel, group, method, metadata_transformer, request_serializer,
-      response_deserializer):
-    self._channel = channel
-    self._group = group
-    self._method = method
-    self._metadata_transformer = metadata_transformer
-    self._request_serializer = request_serializer
-    self._response_deserializer = response_deserializer
+    def __init__(self, channel, group, method, metadata_transformer,
+                 request_serializer, response_deserializer):
+        self._channel = channel
+        self._group = group
+        self._method = method
+        self._metadata_transformer = metadata_transformer
+        self._request_serializer = request_serializer
+        self._response_deserializer = response_deserializer
 
-  def __call__(
-      self, request_iterator, timeout, metadata=None, with_call=False,
-      protocol_options=None):
-    return _blocking_stream_unary(
-        self._channel, self._group, self._method, timeout, with_call,
-        protocol_options, metadata, self._metadata_transformer,
-        request_iterator, self._request_serializer, self._response_deserializer)
+    def __call__(self,
+                 request_iterator,
+                 timeout,
+                 metadata=None,
+                 with_call=False,
+                 protocol_options=None):
+        return _blocking_stream_unary(
+            self._channel, self._group, self._method, timeout, with_call,
+            protocol_options, metadata, self._metadata_transformer,
+            request_iterator, self._request_serializer,
+            self._response_deserializer)
 
-  def future(
-      self, request_iterator, timeout, metadata=None, protocol_options=None):
-    return _future_stream_unary(
-        self._channel, self._group, self._method, timeout, protocol_options,
-        metadata, self._metadata_transformer, request_iterator,
-        self._request_serializer, self._response_deserializer)
+    def future(self,
+               request_iterator,
+               timeout,
+               metadata=None,
+               protocol_options=None):
+        return _future_stream_unary(
+            self._channel, self._group, self._method, timeout, protocol_options,
+            metadata, self._metadata_transformer, request_iterator,
+            self._request_serializer, self._response_deserializer)
 
-  def event(
-      self, receiver, abortion_callback, timeout, metadata=None,
-      protocol_options=None):
-    raise NotImplementedError()
+    def event(self,
+              receiver,
+              abortion_callback,
+              timeout,
+              metadata=None,
+              protocol_options=None):
+        raise NotImplementedError()
 
 
 class _StreamStreamMultiCallable(face.StreamStreamMultiCallable):
 
-  def __init__(
-      self, channel, group, method, metadata_transformer, request_serializer,
-      response_deserializer):
-    self._channel = channel
-    self._group = group
-    self._method = method
-    self._metadata_transformer = metadata_transformer
-    self._request_serializer = request_serializer
-    self._response_deserializer = response_deserializer
+    def __init__(self, channel, group, method, metadata_transformer,
+                 request_serializer, response_deserializer):
+        self._channel = channel
+        self._group = group
+        self._method = method
+        self._metadata_transformer = metadata_transformer
+        self._request_serializer = request_serializer
+        self._response_deserializer = response_deserializer
 
-  def __call__(
-      self, request_iterator, timeout, metadata=None, protocol_options=None):
-    return _stream_stream(
-        self._channel, self._group, self._method, timeout, protocol_options,
-        metadata, self._metadata_transformer, request_iterator,
-        self._request_serializer, self._response_deserializer)
+    def __call__(self,
+                 request_iterator,
+                 timeout,
+                 metadata=None,
+                 protocol_options=None):
+        return _stream_stream(
+            self._channel, self._group, self._method, timeout, protocol_options,
+            metadata, self._metadata_transformer, request_iterator,
+            self._request_serializer, self._response_deserializer)
 
-  def event(
-      self, receiver, abortion_callback, timeout, metadata=None,
-      protocol_options=None):
-    raise NotImplementedError()
+    def event(self,
+              receiver,
+              abortion_callback,
+              timeout,
+              metadata=None,
+              protocol_options=None):
+        raise NotImplementedError()
 
 
 class _GenericStub(face.GenericStub):
 
-  def __init__(
-      self, channel, metadata_transformer, request_serializers,
-      response_deserializers):
-    self._channel = channel
-    self._metadata_transformer = metadata_transformer
-    self._request_serializers = request_serializers or {}
-    self._response_deserializers = response_deserializers or {}
+    def __init__(self, channel, metadata_transformer, request_serializers,
+                 response_deserializers):
+        self._channel = channel
+        self._metadata_transformer = metadata_transformer
+        self._request_serializers = request_serializers or {}
+        self._response_deserializers = response_deserializers or {}
 
-  def blocking_unary_unary(
-      self, group, method, request, timeout, metadata=None,
-      with_call=None, protocol_options=None):
-    request_serializer = self._request_serializers.get((group, method,))
-    response_deserializer = self._response_deserializers.get((group, method,))
-    return _blocking_unary_unary(
-        self._channel, group, method, timeout, with_call, protocol_options,
-        metadata, self._metadata_transformer, request, request_serializer,
-        response_deserializer)
+    def blocking_unary_unary(self,
+                             group,
+                             method,
+                             request,
+                             timeout,
+                             metadata=None,
+                             with_call=None,
+                             protocol_options=None):
+        request_serializer = self._request_serializers.get((
+            group,
+            method,))
+        response_deserializer = self._response_deserializers.get((
+            group,
+            method,))
+        return _blocking_unary_unary(self._channel, group, method, timeout,
+                                     with_call, protocol_options, metadata,
+                                     self._metadata_transformer, request,
+                                     request_serializer, response_deserializer)
 
-  def future_unary_unary(
-      self, group, method, request, timeout, metadata=None,
-      protocol_options=None):
-    request_serializer = self._request_serializers.get((group, method,))
-    response_deserializer = self._response_deserializers.get((group, method,))
-    return _future_unary_unary(
-        self._channel, group, method, timeout, protocol_options, metadata,
-        self._metadata_transformer, request, request_serializer,
-        response_deserializer)
+    def future_unary_unary(self,
+                           group,
+                           method,
+                           request,
+                           timeout,
+                           metadata=None,
+                           protocol_options=None):
+        request_serializer = self._request_serializers.get((
+            group,
+            method,))
+        response_deserializer = self._response_deserializers.get((
+            group,
+            method,))
+        return _future_unary_unary(self._channel, group, method, timeout,
+                                   protocol_options, metadata,
+                                   self._metadata_transformer, request,
+                                   request_serializer, response_deserializer)
 
-  def inline_unary_stream(
-      self, group, method, request, timeout, metadata=None,
-      protocol_options=None):
-    request_serializer = self._request_serializers.get((group, method,))
-    response_deserializer = self._response_deserializers.get((group, method,))
-    return _unary_stream(
-        self._channel, group, method, timeout, protocol_options, metadata,
-        self._metadata_transformer, request, request_serializer,
-        response_deserializer)
+    def inline_unary_stream(self,
+                            group,
+                            method,
+                            request,
+                            timeout,
+                            metadata=None,
+                            protocol_options=None):
+        request_serializer = self._request_serializers.get((
+            group,
+            method,))
+        response_deserializer = self._response_deserializers.get((
+            group,
+            method,))
+        return _unary_stream(self._channel, group, method, timeout,
+                             protocol_options, metadata,
+                             self._metadata_transformer, request,
+                             request_serializer, response_deserializer)
 
-  def blocking_stream_unary(
-      self, group, method, request_iterator, timeout, metadata=None,
-      with_call=None, protocol_options=None):
-    request_serializer = self._request_serializers.get((group, method,))
-    response_deserializer = self._response_deserializers.get((group, method,))
-    return _blocking_stream_unary(
-        self._channel, group, method, timeout, with_call, protocol_options,
-        metadata, self._metadata_transformer, request_iterator,
-        request_serializer, response_deserializer)
+    def blocking_stream_unary(self,
+                              group,
+                              method,
+                              request_iterator,
+                              timeout,
+                              metadata=None,
+                              with_call=None,
+                              protocol_options=None):
+        request_serializer = self._request_serializers.get((
+            group,
+            method,))
+        response_deserializer = self._response_deserializers.get((
+            group,
+            method,))
+        return _blocking_stream_unary(
+            self._channel, group, method, timeout, with_call, protocol_options,
+            metadata, self._metadata_transformer, request_iterator,
+            request_serializer, response_deserializer)
 
-  def future_stream_unary(
-      self, group, method, request_iterator, timeout, metadata=None,
-      protocol_options=None):
-    request_serializer = self._request_serializers.get((group, method,))
-    response_deserializer = self._response_deserializers.get((group, method,))
-    return _future_stream_unary(
-        self._channel, group, method, timeout, protocol_options, metadata,
-        self._metadata_transformer, request_iterator, request_serializer,
-        response_deserializer)
+    def future_stream_unary(self,
+                            group,
+                            method,
+                            request_iterator,
+                            timeout,
+                            metadata=None,
+                            protocol_options=None):
+        request_serializer = self._request_serializers.get((
+            group,
+            method,))
+        response_deserializer = self._response_deserializers.get((
+            group,
+            method,))
+        return _future_stream_unary(
+            self._channel, group, method, timeout, protocol_options, metadata,
+            self._metadata_transformer, request_iterator, request_serializer,
+            response_deserializer)
 
-  def inline_stream_stream(
-      self, group, method, request_iterator, timeout, metadata=None,
-      protocol_options=None):
-    request_serializer = self._request_serializers.get((group, method,))
-    response_deserializer = self._response_deserializers.get((group, method,))
-    return _stream_stream(
-        self._channel, group, method, timeout, protocol_options, metadata,
-        self._metadata_transformer, request_iterator, request_serializer,
-        response_deserializer)
+    def inline_stream_stream(self,
+                             group,
+                             method,
+                             request_iterator,
+                             timeout,
+                             metadata=None,
+                             protocol_options=None):
+        request_serializer = self._request_serializers.get((
+            group,
+            method,))
+        response_deserializer = self._response_deserializers.get((
+            group,
+            method,))
+        return _stream_stream(self._channel, group, method, timeout,
+                              protocol_options, metadata,
+                              self._metadata_transformer, request_iterator,
+                              request_serializer, response_deserializer)
 
-  def event_unary_unary(
-      self, group, method, request, receiver, abortion_callback, timeout,
-      metadata=None, protocol_options=None):
-    raise NotImplementedError()
+    def event_unary_unary(self,
+                          group,
+                          method,
+                          request,
+                          receiver,
+                          abortion_callback,
+                          timeout,
+                          metadata=None,
+                          protocol_options=None):
+        raise NotImplementedError()
 
-  def event_unary_stream(
-      self, group, method, request, receiver, abortion_callback, timeout,
-      metadata=None, protocol_options=None):
-    raise NotImplementedError()
+    def event_unary_stream(self,
+                           group,
+                           method,
+                           request,
+                           receiver,
+                           abortion_callback,
+                           timeout,
+                           metadata=None,
+                           protocol_options=None):
+        raise NotImplementedError()
 
-  def event_stream_unary(
-      self, group, method, receiver, abortion_callback, timeout,
-      metadata=None, protocol_options=None):
-    raise NotImplementedError()
+    def event_stream_unary(self,
+                           group,
+                           method,
+                           receiver,
+                           abortion_callback,
+                           timeout,
+                           metadata=None,
+                           protocol_options=None):
+        raise NotImplementedError()
 
-  def event_stream_stream(
-      self, group, method, receiver, abortion_callback, timeout,
-      metadata=None, protocol_options=None):
-    raise NotImplementedError()
+    def event_stream_stream(self,
+                            group,
+                            method,
+                            receiver,
+                            abortion_callback,
+                            timeout,
+                            metadata=None,
+                            protocol_options=None):
+        raise NotImplementedError()
 
-  def unary_unary(self, group, method):
-    request_serializer = self._request_serializers.get((group, method,))
-    response_deserializer = self._response_deserializers.get((group, method,))
-    return _UnaryUnaryMultiCallable(
-        self._channel, group, method, self._metadata_transformer,
-        request_serializer, response_deserializer)
+    def unary_unary(self, group, method):
+        request_serializer = self._request_serializers.get((
+            group,
+            method,))
+        response_deserializer = self._response_deserializers.get((
+            group,
+            method,))
+        return _UnaryUnaryMultiCallable(
+            self._channel, group, method, self._metadata_transformer,
+            request_serializer, response_deserializer)
 
-  def unary_stream(self, group, method):
-    request_serializer = self._request_serializers.get((group, method,))
-    response_deserializer = self._response_deserializers.get((group, method,))
-    return _UnaryStreamMultiCallable(
-        self._channel, group, method, self._metadata_transformer,
-        request_serializer, response_deserializer)
+    def unary_stream(self, group, method):
+        request_serializer = self._request_serializers.get((
+            group,
+            method,))
+        response_deserializer = self._response_deserializers.get((
+            group,
+            method,))
+        return _UnaryStreamMultiCallable(
+            self._channel, group, method, self._metadata_transformer,
+            request_serializer, response_deserializer)
 
-  def stream_unary(self, group, method):
-    request_serializer = self._request_serializers.get((group, method,))
-    response_deserializer = self._response_deserializers.get((group, method,))
-    return _StreamUnaryMultiCallable(
-        self._channel, group, method, self._metadata_transformer,
-        request_serializer, response_deserializer)
+    def stream_unary(self, group, method):
+        request_serializer = self._request_serializers.get((
+            group,
+            method,))
+        response_deserializer = self._response_deserializers.get((
+            group,
+            method,))
+        return _StreamUnaryMultiCallable(
+            self._channel, group, method, self._metadata_transformer,
+            request_serializer, response_deserializer)
 
-  def stream_stream(self, group, method):
-    request_serializer = self._request_serializers.get((group, method,))
-    response_deserializer = self._response_deserializers.get((group, method,))
-    return _StreamStreamMultiCallable(
-        self._channel, group, method, self._metadata_transformer,
-        request_serializer, response_deserializer)
+    def stream_stream(self, group, method):
+        request_serializer = self._request_serializers.get((
+            group,
+            method,))
+        response_deserializer = self._response_deserializers.get((
+            group,
+            method,))
+        return _StreamStreamMultiCallable(
+            self._channel, group, method, self._metadata_transformer,
+            request_serializer, response_deserializer)
 
-  def __enter__(self):
-    return self
+    def __enter__(self):
+        return self
 
-  def __exit__(self, exc_type, exc_val, exc_tb):
-    return False
+    def __exit__(self, exc_type, exc_val, exc_tb):
+        return False
 
 
 class _DynamicStub(face.DynamicStub):
 
-  def __init__(self, generic_stub, group, cardinalities):
-    self._generic_stub = generic_stub
-    self._group = group
-    self._cardinalities = cardinalities
+    def __init__(self, generic_stub, group, cardinalities):
+        self._generic_stub = generic_stub
+        self._group = group
+        self._cardinalities = cardinalities
 
-  def __getattr__(self, attr):
-    method_cardinality = self._cardinalities.get(attr)
-    if method_cardinality is cardinality.Cardinality.UNARY_UNARY:
-      return self._generic_stub.unary_unary(self._group, attr)
-    elif method_cardinality is cardinality.Cardinality.UNARY_STREAM:
-      return self._generic_stub.unary_stream(self._group, attr)
-    elif method_cardinality is cardinality.Cardinality.STREAM_UNARY:
-      return self._generic_stub.stream_unary(self._group, attr)
-    elif method_cardinality is cardinality.Cardinality.STREAM_STREAM:
-      return self._generic_stub.stream_stream(self._group, attr)
-    else:
-      raise AttributeError('_DynamicStub object has no attribute "%s"!' % attr)
+    def __getattr__(self, attr):
+        method_cardinality = self._cardinalities.get(attr)
+        if method_cardinality is cardinality.Cardinality.UNARY_UNARY:
+            return self._generic_stub.unary_unary(self._group, attr)
+        elif method_cardinality is cardinality.Cardinality.UNARY_STREAM:
+            return self._generic_stub.unary_stream(self._group, attr)
+        elif method_cardinality is cardinality.Cardinality.STREAM_UNARY:
+            return self._generic_stub.stream_unary(self._group, attr)
+        elif method_cardinality is cardinality.Cardinality.STREAM_STREAM:
+            return self._generic_stub.stream_stream(self._group, attr)
+        else:
+            raise AttributeError('_DynamicStub object has no attribute "%s"!' %
+                                 attr)
 
-  def __enter__(self):
-    return self
+    def __enter__(self):
+        return self
 
-  def __exit__(self, exc_type, exc_val, exc_tb):
-    return False
+    def __exit__(self, exc_type, exc_val, exc_tb):
+        return False
 
 
-def generic_stub(
-    channel, host, metadata_transformer, request_serializers,
-    response_deserializers):
-  return _GenericStub(
-      channel, metadata_transformer, request_serializers,
-      response_deserializers)
+def generic_stub(channel, host, metadata_transformer, request_serializers,
+                 response_deserializers):
+    return _GenericStub(channel, metadata_transformer, request_serializers,
+                        response_deserializers)
 
 
-def dynamic_stub(
-    channel, service, cardinalities, host, metadata_transformer,
-    request_serializers, response_deserializers):
-  return _DynamicStub(
-      _GenericStub(
-          channel, metadata_transformer, request_serializers,
-          response_deserializers),
-      service, cardinalities)
+def dynamic_stub(channel, service, cardinalities, host, metadata_transformer,
+                 request_serializers, response_deserializers):
+    return _DynamicStub(
+        _GenericStub(channel, metadata_transformer, request_serializers,
+                     response_deserializers), service, cardinalities)
diff --git a/src/python/grpcio/grpc/beta/_connectivity_channel.py b/src/python/grpcio/grpc/beta/_connectivity_channel.py
index 61674a7..39020d2 100644
--- a/src/python/grpcio/grpc/beta/_connectivity_channel.py
+++ b/src/python/grpcio/grpc/beta/_connectivity_channel.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Affords a connectivity-state-listenable channel."""
 
 import threading
@@ -41,116 +40,122 @@
     'Exception calling channel subscription callback!')
 
 _LOW_CONNECTIVITY_STATE_TO_CHANNEL_CONNECTIVITY = {
-    state: connectivity for state, connectivity in zip(
-        _types.ConnectivityState, interfaces.ChannelConnectivity)
+    state: connectivity
+    for state, connectivity in zip(_types.ConnectivityState,
+                                   interfaces.ChannelConnectivity)
 }
 
 
 class ConnectivityChannel(object):
 
-  def __init__(self, low_channel):
-    self._lock = threading.Lock()
-    self._low_channel = low_channel
+    def __init__(self, low_channel):
+        self._lock = threading.Lock()
+        self._low_channel = low_channel
 
-    self._polling = False
-    self._connectivity = None
-    self._try_to_connect = False
-    self._callbacks_and_connectivities = []
-    self._delivering = False
-
-  def _deliveries(self, connectivity):
-    callbacks_needing_update = []
-    for callback_and_connectivity in self._callbacks_and_connectivities:
-      callback, callback_connectivity = callback_and_connectivity
-      if callback_connectivity is not connectivity:
-        callbacks_needing_update.append(callback)
-        callback_and_connectivity[1] = connectivity
-    return callbacks_needing_update
-
-  def _deliver(self, initial_connectivity, initial_callbacks):
-    connectivity = initial_connectivity
-    callbacks = initial_callbacks
-    while True:
-      for callback in callbacks:
-        callable_util.call_logging_exceptions(
-            callback, _CHANNEL_SUBSCRIPTION_CALLBACK_ERROR_LOG_MESSAGE,
-            connectivity)
-      with self._lock:
-        callbacks = self._deliveries(self._connectivity)
-        if callbacks:
-          connectivity = self._connectivity
-        else:
-          self._delivering = False
-          return
-
-  def _spawn_delivery(self, connectivity, callbacks):
-    delivering_thread = threading.Thread(
-        target=self._deliver, args=(connectivity, callbacks,))
-    delivering_thread.start()
-    self._delivering = True
-
-  # TODO(issue 3064): Don't poll.
-  def _poll_connectivity(self, low_channel, initial_try_to_connect):
-    try_to_connect = initial_try_to_connect
-    low_connectivity = low_channel.check_connectivity_state(try_to_connect)
-    with self._lock:
-      self._connectivity = _LOW_CONNECTIVITY_STATE_TO_CHANNEL_CONNECTIVITY[
-          low_connectivity]
-      callbacks = tuple(
-          callback for callback, unused_but_known_to_be_none_connectivity
-          in self._callbacks_and_connectivities)
-      for callback_and_connectivity in self._callbacks_and_connectivities:
-        callback_and_connectivity[1] = self._connectivity
-      if callbacks:
-        self._spawn_delivery(self._connectivity, callbacks)
-    completion_queue = _low.CompletionQueue()
-    while True:
-      low_channel.watch_connectivity_state(
-          low_connectivity, time.time() + 0.2, completion_queue, None)
-      event = completion_queue.next()
-      with self._lock:
-        if not self._callbacks_and_connectivities and not self._try_to_connect:
-          self._polling = False
-          self._connectivity = None
-          completion_queue.shutdown()
-          break
-        try_to_connect = self._try_to_connect
+        self._polling = False
+        self._connectivity = None
         self._try_to_connect = False
-      if event.success or try_to_connect:
+        self._callbacks_and_connectivities = []
+        self._delivering = False
+
+    def _deliveries(self, connectivity):
+        callbacks_needing_update = []
+        for callback_and_connectivity in self._callbacks_and_connectivities:
+            callback, callback_connectivity = callback_and_connectivity
+            if callback_connectivity is not connectivity:
+                callbacks_needing_update.append(callback)
+                callback_and_connectivity[1] = connectivity
+        return callbacks_needing_update
+
+    def _deliver(self, initial_connectivity, initial_callbacks):
+        connectivity = initial_connectivity
+        callbacks = initial_callbacks
+        while True:
+            for callback in callbacks:
+                callable_util.call_logging_exceptions(
+                    callback, _CHANNEL_SUBSCRIPTION_CALLBACK_ERROR_LOG_MESSAGE,
+                    connectivity)
+            with self._lock:
+                callbacks = self._deliveries(self._connectivity)
+                if callbacks:
+                    connectivity = self._connectivity
+                else:
+                    self._delivering = False
+                    return
+
+    def _spawn_delivery(self, connectivity, callbacks):
+        delivering_thread = threading.Thread(
+            target=self._deliver, args=(
+                connectivity,
+                callbacks,))
+        delivering_thread.start()
+        self._delivering = True
+
+    # TODO(issue 3064): Don't poll.
+    def _poll_connectivity(self, low_channel, initial_try_to_connect):
+        try_to_connect = initial_try_to_connect
         low_connectivity = low_channel.check_connectivity_state(try_to_connect)
         with self._lock:
-          self._connectivity = _LOW_CONNECTIVITY_STATE_TO_CHANNEL_CONNECTIVITY[
-              low_connectivity]
-          if not self._delivering:
-            callbacks = self._deliveries(self._connectivity)
+            self._connectivity = _LOW_CONNECTIVITY_STATE_TO_CHANNEL_CONNECTIVITY[
+                low_connectivity]
+            callbacks = tuple(
+                callback
+                for callback, unused_but_known_to_be_none_connectivity in
+                self._callbacks_and_connectivities)
+            for callback_and_connectivity in self._callbacks_and_connectivities:
+                callback_and_connectivity[1] = self._connectivity
             if callbacks:
-              self._spawn_delivery(self._connectivity, callbacks)
+                self._spawn_delivery(self._connectivity, callbacks)
+        completion_queue = _low.CompletionQueue()
+        while True:
+            low_channel.watch_connectivity_state(low_connectivity,
+                                                 time.time() + 0.2,
+                                                 completion_queue, None)
+            event = completion_queue.next()
+            with self._lock:
+                if not self._callbacks_and_connectivities and not self._try_to_connect:
+                    self._polling = False
+                    self._connectivity = None
+                    completion_queue.shutdown()
+                    break
+                try_to_connect = self._try_to_connect
+                self._try_to_connect = False
+            if event.success or try_to_connect:
+                low_connectivity = low_channel.check_connectivity_state(
+                    try_to_connect)
+                with self._lock:
+                    self._connectivity = _LOW_CONNECTIVITY_STATE_TO_CHANNEL_CONNECTIVITY[
+                        low_connectivity]
+                    if not self._delivering:
+                        callbacks = self._deliveries(self._connectivity)
+                        if callbacks:
+                            self._spawn_delivery(self._connectivity, callbacks)
 
-  def subscribe(self, callback, try_to_connect):
-    with self._lock:
-      if not self._callbacks_and_connectivities and not self._polling:
-        polling_thread = threading.Thread(
-            target=self._poll_connectivity,
-            args=(self._low_channel, bool(try_to_connect)))
-        polling_thread.start()
-        self._polling = True
-        self._callbacks_and_connectivities.append([callback, None])
-      elif not self._delivering and self._connectivity is not None:
-        self._spawn_delivery(self._connectivity, (callback,))
-        self._try_to_connect |= bool(try_to_connect)
-        self._callbacks_and_connectivities.append(
-            [callback, self._connectivity])
-      else:
-        self._try_to_connect |= bool(try_to_connect)
-        self._callbacks_and_connectivities.append([callback, None])
+    def subscribe(self, callback, try_to_connect):
+        with self._lock:
+            if not self._callbacks_and_connectivities and not self._polling:
+                polling_thread = threading.Thread(
+                    target=self._poll_connectivity,
+                    args=(self._low_channel, bool(try_to_connect)))
+                polling_thread.start()
+                self._polling = True
+                self._callbacks_and_connectivities.append([callback, None])
+            elif not self._delivering and self._connectivity is not None:
+                self._spawn_delivery(self._connectivity, (callback,))
+                self._try_to_connect |= bool(try_to_connect)
+                self._callbacks_and_connectivities.append(
+                    [callback, self._connectivity])
+            else:
+                self._try_to_connect |= bool(try_to_connect)
+                self._callbacks_and_connectivities.append([callback, None])
 
-  def unsubscribe(self, callback):
-    with self._lock:
-      for index, (subscribed_callback, unused_connectivity) in enumerate(
-          self._callbacks_and_connectivities):
-        if callback == subscribed_callback:
-          self._callbacks_and_connectivities.pop(index)
-          break
+    def unsubscribe(self, callback):
+        with self._lock:
+            for index, (subscribed_callback, unused_connectivity
+                       ) in enumerate(self._callbacks_and_connectivities):
+                if callback == subscribed_callback:
+                    self._callbacks_and_connectivities.pop(index)
+                    break
 
-  def low_channel(self):
-    return self._low_channel
+    def low_channel(self):
+        return self._low_channel
diff --git a/src/python/grpcio/grpc/beta/_server_adaptations.py b/src/python/grpcio/grpc/beta/_server_adaptations.py
index cca4a17..bb7c096 100644
--- a/src/python/grpcio/grpc/beta/_server_adaptations.py
+++ b/src/python/grpcio/grpc/beta/_server_adaptations.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Translates gRPC's server-side API into gRPC's server-side Beta API."""
 
 import collections
@@ -47,329 +46,352 @@
 
 class _ServerProtocolContext(interfaces.GRPCServicerContext):
 
-  def __init__(self, servicer_context):
-    self._servicer_context = servicer_context
+    def __init__(self, servicer_context):
+        self._servicer_context = servicer_context
 
-  def peer(self):
-    return self._servicer_context.peer()
+    def peer(self):
+        return self._servicer_context.peer()
 
-  def disable_next_response_compression(self):
-    pass  # TODO(https://github.com/grpc/grpc/issues/4078): design, implement.
+    def disable_next_response_compression(self):
+        pass  # TODO(https://github.com/grpc/grpc/issues/4078): design, implement.
 
 
 class _FaceServicerContext(face.ServicerContext):
 
-  def __init__(self, servicer_context):
-    self._servicer_context = servicer_context
+    def __init__(self, servicer_context):
+        self._servicer_context = servicer_context
 
-  def is_active(self):
-    return self._servicer_context.is_active()
+    def is_active(self):
+        return self._servicer_context.is_active()
 
-  def time_remaining(self):
-    return self._servicer_context.time_remaining()
+    def time_remaining(self):
+        return self._servicer_context.time_remaining()
 
-  def add_abortion_callback(self, abortion_callback):
-    raise NotImplementedError(
-        'add_abortion_callback no longer supported server-side!')
+    def add_abortion_callback(self, abortion_callback):
+        raise NotImplementedError(
+            'add_abortion_callback no longer supported server-side!')
 
-  def cancel(self):
-    self._servicer_context.cancel()
+    def cancel(self):
+        self._servicer_context.cancel()
 
-  def protocol_context(self):
-    return _ServerProtocolContext(self._servicer_context)
+    def protocol_context(self):
+        return _ServerProtocolContext(self._servicer_context)
 
-  def invocation_metadata(self):
-    return _common.cygrpc_metadata(
-        self._servicer_context.invocation_metadata())
+    def invocation_metadata(self):
+        return _common.cygrpc_metadata(
+            self._servicer_context.invocation_metadata())
 
-  def initial_metadata(self, initial_metadata):
-    self._servicer_context.send_initial_metadata(initial_metadata)
+    def initial_metadata(self, initial_metadata):
+        self._servicer_context.send_initial_metadata(initial_metadata)
 
-  def terminal_metadata(self, terminal_metadata):
-    self._servicer_context.set_terminal_metadata(terminal_metadata)
+    def terminal_metadata(self, terminal_metadata):
+        self._servicer_context.set_terminal_metadata(terminal_metadata)
 
-  def code(self, code):
-    self._servicer_context.set_code(code)
+    def code(self, code):
+        self._servicer_context.set_code(code)
 
-  def details(self, details):
-    self._servicer_context.set_details(details)
+    def details(self, details):
+        self._servicer_context.set_details(details)
 
 
 def _adapt_unary_request_inline(unary_request_inline):
-  def adaptation(request, servicer_context):
-    return unary_request_inline(request, _FaceServicerContext(servicer_context))
-  return adaptation
+
+    def adaptation(request, servicer_context):
+        return unary_request_inline(request,
+                                    _FaceServicerContext(servicer_context))
+
+    return adaptation
 
 
 def _adapt_stream_request_inline(stream_request_inline):
-  def adaptation(request_iterator, servicer_context):
-    return stream_request_inline(
-        request_iterator, _FaceServicerContext(servicer_context))
-  return adaptation
+
+    def adaptation(request_iterator, servicer_context):
+        return stream_request_inline(request_iterator,
+                                     _FaceServicerContext(servicer_context))
+
+    return adaptation
 
 
 class _Callback(stream.Consumer):
 
-  def __init__(self):
-    self._condition = threading.Condition()
-    self._values = []
-    self._terminated = False
-    self._cancelled = False
+    def __init__(self):
+        self._condition = threading.Condition()
+        self._values = []
+        self._terminated = False
+        self._cancelled = False
 
-  def consume(self, value):
-    with self._condition:
-      self._values.append(value)
-      self._condition.notify_all()
+    def consume(self, value):
+        with self._condition:
+            self._values.append(value)
+            self._condition.notify_all()
 
-  def terminate(self):
-    with self._condition:
-      self._terminated = True
-      self._condition.notify_all()
+    def terminate(self):
+        with self._condition:
+            self._terminated = True
+            self._condition.notify_all()
 
-  def consume_and_terminate(self, value):
-    with self._condition:
-      self._values.append(value)
-      self._terminated = True
-      self._condition.notify_all()
+    def consume_and_terminate(self, value):
+        with self._condition:
+            self._values.append(value)
+            self._terminated = True
+            self._condition.notify_all()
 
-  def cancel(self):
-    with self._condition:
-      self._cancelled = True
-      self._condition.notify_all()
+    def cancel(self):
+        with self._condition:
+            self._cancelled = True
+            self._condition.notify_all()
 
-  def draw_one_value(self):
-    with self._condition:
-      while True:
-        if self._cancelled:
-          raise abandonment.Abandoned()
-        elif self._values:
-          return self._values.pop(0)
-        elif self._terminated:
-          return None
-        else:
-          self._condition.wait()
+    def draw_one_value(self):
+        with self._condition:
+            while True:
+                if self._cancelled:
+                    raise abandonment.Abandoned()
+                elif self._values:
+                    return self._values.pop(0)
+                elif self._terminated:
+                    return None
+                else:
+                    self._condition.wait()
 
-  def draw_all_values(self):
-    with self._condition:
-      while True:
-        if self._cancelled:
-          raise abandonment.Abandoned()
-        elif self._terminated:
-          all_values = tuple(self._values)
-          self._values = None
-          return all_values
-        else:
-          self._condition.wait()
+    def draw_all_values(self):
+        with self._condition:
+            while True:
+                if self._cancelled:
+                    raise abandonment.Abandoned()
+                elif self._terminated:
+                    all_values = tuple(self._values)
+                    self._values = None
+                    return all_values
+                else:
+                    self._condition.wait()
 
 
 def _run_request_pipe_thread(request_iterator, request_consumer,
                              servicer_context):
-  thread_joined = threading.Event()
-  def pipe_requests():
-    for request in request_iterator:
-      if not servicer_context.is_active() or thread_joined.is_set():
-        return
-      request_consumer.consume(request)
-      if not servicer_context.is_active() or thread_joined.is_set():
-        return
-    request_consumer.terminate()
+    thread_joined = threading.Event()
 
-  def stop_request_pipe(timeout):
-    thread_joined.set()
+    def pipe_requests():
+        for request in request_iterator:
+            if not servicer_context.is_active() or thread_joined.is_set():
+                return
+            request_consumer.consume(request)
+            if not servicer_context.is_active() or thread_joined.is_set():
+                return
+        request_consumer.terminate()
 
-  request_pipe_thread = _common.CleanupThread(
-      stop_request_pipe, target=pipe_requests)
-  request_pipe_thread.start()
+    def stop_request_pipe(timeout):
+        thread_joined.set()
+
+    request_pipe_thread = _common.CleanupThread(
+        stop_request_pipe, target=pipe_requests)
+    request_pipe_thread.start()
 
 
 def _adapt_unary_unary_event(unary_unary_event):
-  def adaptation(request, servicer_context):
-    callback = _Callback()
-    if not servicer_context.add_callback(callback.cancel):
-      raise abandonment.Abandoned()
-    unary_unary_event(
-        request, callback.consume_and_terminate,
-        _FaceServicerContext(servicer_context))
-    return callback.draw_all_values()[0]
-  return adaptation
+
+    def adaptation(request, servicer_context):
+        callback = _Callback()
+        if not servicer_context.add_callback(callback.cancel):
+            raise abandonment.Abandoned()
+        unary_unary_event(request, callback.consume_and_terminate,
+                          _FaceServicerContext(servicer_context))
+        return callback.draw_all_values()[0]
+
+    return adaptation
 
 
 def _adapt_unary_stream_event(unary_stream_event):
-  def adaptation(request, servicer_context):
-    callback = _Callback()
-    if not servicer_context.add_callback(callback.cancel):
-      raise abandonment.Abandoned()
-    unary_stream_event(
-        request, callback, _FaceServicerContext(servicer_context))
-    while True:
-      response = callback.draw_one_value()
-      if response is None:
-        return
-      else:
-        yield response
-  return adaptation
+
+    def adaptation(request, servicer_context):
+        callback = _Callback()
+        if not servicer_context.add_callback(callback.cancel):
+            raise abandonment.Abandoned()
+        unary_stream_event(request, callback,
+                           _FaceServicerContext(servicer_context))
+        while True:
+            response = callback.draw_one_value()
+            if response is None:
+                return
+            else:
+                yield response
+
+    return adaptation
 
 
 def _adapt_stream_unary_event(stream_unary_event):
-  def adaptation(request_iterator, servicer_context):
-    callback = _Callback()
-    if not servicer_context.add_callback(callback.cancel):
-      raise abandonment.Abandoned()
-    request_consumer = stream_unary_event(
-        callback.consume_and_terminate, _FaceServicerContext(servicer_context))
-    _run_request_pipe_thread(
-        request_iterator, request_consumer, servicer_context)
-    return callback.draw_all_values()[0]
-  return adaptation
+
+    def adaptation(request_iterator, servicer_context):
+        callback = _Callback()
+        if not servicer_context.add_callback(callback.cancel):
+            raise abandonment.Abandoned()
+        request_consumer = stream_unary_event(
+            callback.consume_and_terminate,
+            _FaceServicerContext(servicer_context))
+        _run_request_pipe_thread(request_iterator, request_consumer,
+                                 servicer_context)
+        return callback.draw_all_values()[0]
+
+    return adaptation
 
 
 def _adapt_stream_stream_event(stream_stream_event):
-  def adaptation(request_iterator, servicer_context):
-    callback = _Callback()
-    if not servicer_context.add_callback(callback.cancel):
-      raise abandonment.Abandoned()
-    request_consumer = stream_stream_event(
-        callback, _FaceServicerContext(servicer_context))
-    _run_request_pipe_thread(
-        request_iterator, request_consumer, servicer_context)
-    while True:
-      response = callback.draw_one_value()
-      if response is None:
-        return
-      else:
-        yield response
-  return adaptation
+
+    def adaptation(request_iterator, servicer_context):
+        callback = _Callback()
+        if not servicer_context.add_callback(callback.cancel):
+            raise abandonment.Abandoned()
+        request_consumer = stream_stream_event(
+            callback, _FaceServicerContext(servicer_context))
+        _run_request_pipe_thread(request_iterator, request_consumer,
+                                 servicer_context)
+        while True:
+            response = callback.draw_one_value()
+            if response is None:
+                return
+            else:
+                yield response
+
+    return adaptation
 
 
 class _SimpleMethodHandler(
-    collections.namedtuple(
-        '_MethodHandler',
-        ('request_streaming', 'response_streaming', 'request_deserializer',
-         'response_serializer', 'unary_unary', 'unary_stream', 'stream_unary',
-         'stream_stream',)),
-    grpc.RpcMethodHandler):
-  pass
+        collections.namedtuple('_MethodHandler', (
+            'request_streaming',
+            'response_streaming',
+            'request_deserializer',
+            'response_serializer',
+            'unary_unary',
+            'unary_stream',
+            'stream_unary',
+            'stream_stream',)), grpc.RpcMethodHandler):
+    pass
 
 
-def _simple_method_handler(
-    implementation, request_deserializer, response_serializer):
-  if implementation.style is style.Service.INLINE:
-    if implementation.cardinality is cardinality.Cardinality.UNARY_UNARY:
-      return _SimpleMethodHandler(
-          False, False, request_deserializer, response_serializer,
-          _adapt_unary_request_inline(implementation.unary_unary_inline), None,
-          None, None)
-    elif implementation.cardinality is cardinality.Cardinality.UNARY_STREAM:
-      return _SimpleMethodHandler(
-          False, True, request_deserializer, response_serializer, None,
-          _adapt_unary_request_inline(implementation.unary_stream_inline), None,
-          None)
-    elif implementation.cardinality is cardinality.Cardinality.STREAM_UNARY:
-      return _SimpleMethodHandler(
-          True, False, request_deserializer, response_serializer, None, None,
-          _adapt_stream_request_inline(implementation.stream_unary_inline),
-          None)
-    elif implementation.cardinality is cardinality.Cardinality.STREAM_STREAM:
-      return _SimpleMethodHandler(
-          True, True, request_deserializer, response_serializer, None, None,
-          None,
-          _adapt_stream_request_inline(implementation.stream_stream_inline))
-  elif implementation.style is style.Service.EVENT:
-    if implementation.cardinality is cardinality.Cardinality.UNARY_UNARY:
-      return _SimpleMethodHandler(
-          False, False, request_deserializer, response_serializer,
-          _adapt_unary_unary_event(implementation.unary_unary_event), None,
-          None, None)
-    elif implementation.cardinality is cardinality.Cardinality.UNARY_STREAM:
-      return _SimpleMethodHandler(
-          False, True, request_deserializer, response_serializer, None,
-          _adapt_unary_stream_event(implementation.unary_stream_event), None,
-          None)
-    elif implementation.cardinality is cardinality.Cardinality.STREAM_UNARY:
-      return _SimpleMethodHandler(
-          True, False, request_deserializer, response_serializer, None, None,
-          _adapt_stream_unary_event(implementation.stream_unary_event), None)
-    elif implementation.cardinality is cardinality.Cardinality.STREAM_STREAM:
-      return _SimpleMethodHandler(
-          True, True, request_deserializer, response_serializer, None, None,
-          None, _adapt_stream_stream_event(implementation.stream_stream_event))
+def _simple_method_handler(implementation, request_deserializer,
+                           response_serializer):
+    if implementation.style is style.Service.INLINE:
+        if implementation.cardinality is cardinality.Cardinality.UNARY_UNARY:
+            return _SimpleMethodHandler(
+                False, False, request_deserializer, response_serializer,
+                _adapt_unary_request_inline(implementation.unary_unary_inline),
+                None, None, None)
+        elif implementation.cardinality is cardinality.Cardinality.UNARY_STREAM:
+            return _SimpleMethodHandler(
+                False, True, request_deserializer, response_serializer, None,
+                _adapt_unary_request_inline(implementation.unary_stream_inline),
+                None, None)
+        elif implementation.cardinality is cardinality.Cardinality.STREAM_UNARY:
+            return _SimpleMethodHandler(True, False, request_deserializer,
+                                        response_serializer, None, None,
+                                        _adapt_stream_request_inline(
+                                            implementation.stream_unary_inline),
+                                        None)
+        elif implementation.cardinality is cardinality.Cardinality.STREAM_STREAM:
+            return _SimpleMethodHandler(
+                True, True, request_deserializer, response_serializer, None,
+                None, None,
+                _adapt_stream_request_inline(
+                    implementation.stream_stream_inline))
+    elif implementation.style is style.Service.EVENT:
+        if implementation.cardinality is cardinality.Cardinality.UNARY_UNARY:
+            return _SimpleMethodHandler(
+                False, False, request_deserializer, response_serializer,
+                _adapt_unary_unary_event(implementation.unary_unary_event),
+                None, None, None)
+        elif implementation.cardinality is cardinality.Cardinality.UNARY_STREAM:
+            return _SimpleMethodHandler(
+                False, True, request_deserializer, response_serializer, None,
+                _adapt_unary_stream_event(implementation.unary_stream_event),
+                None, None)
+        elif implementation.cardinality is cardinality.Cardinality.STREAM_UNARY:
+            return _SimpleMethodHandler(
+                True, False, request_deserializer, response_serializer, None,
+                None,
+                _adapt_stream_unary_event(implementation.stream_unary_event),
+                None)
+        elif implementation.cardinality is cardinality.Cardinality.STREAM_STREAM:
+            return _SimpleMethodHandler(
+                True, True, request_deserializer, response_serializer, None,
+                None, None,
+                _adapt_stream_stream_event(implementation.stream_stream_event))
 
 
 def _flatten_method_pair_map(method_pair_map):
-  method_pair_map = method_pair_map or {}
-  flat_map = {}
-  for method_pair in method_pair_map:
-    method = _common.fully_qualified_method(method_pair[0], method_pair[1])
-    flat_map[method] = method_pair_map[method_pair]
-  return flat_map
+    method_pair_map = method_pair_map or {}
+    flat_map = {}
+    for method_pair in method_pair_map:
+        method = _common.fully_qualified_method(method_pair[0], method_pair[1])
+        flat_map[method] = method_pair_map[method_pair]
+    return flat_map
 
 
 class _GenericRpcHandler(grpc.GenericRpcHandler):
 
-  def __init__(
-      self, method_implementations, multi_method_implementation,
-      request_deserializers, response_serializers):
-    self._method_implementations = _flatten_method_pair_map(
-        method_implementations)
-    self._request_deserializers = _flatten_method_pair_map(
-        request_deserializers)
-    self._response_serializers = _flatten_method_pair_map(
-        response_serializers)
-    self._multi_method_implementation = multi_method_implementation
+    def __init__(self, method_implementations, multi_method_implementation,
+                 request_deserializers, response_serializers):
+        self._method_implementations = _flatten_method_pair_map(
+            method_implementations)
+        self._request_deserializers = _flatten_method_pair_map(
+            request_deserializers)
+        self._response_serializers = _flatten_method_pair_map(
+            response_serializers)
+        self._multi_method_implementation = multi_method_implementation
 
-  def service(self, handler_call_details):
-    method_implementation = self._method_implementations.get(
-        handler_call_details.method)
-    if method_implementation is not None:
-      return _simple_method_handler(
-          method_implementation,
-          self._request_deserializers.get(handler_call_details.method),
-          self._response_serializers.get(handler_call_details.method))
-    elif self._multi_method_implementation is None:
-      return None
-    else:
-      try:
-        return None  #TODO(nathaniel): call the multimethod.
-      except face.NoSuchMethodError:
-        return None
+    def service(self, handler_call_details):
+        method_implementation = self._method_implementations.get(
+            handler_call_details.method)
+        if method_implementation is not None:
+            return _simple_method_handler(
+                method_implementation,
+                self._request_deserializers.get(handler_call_details.method),
+                self._response_serializers.get(handler_call_details.method))
+        elif self._multi_method_implementation is None:
+            return None
+        else:
+            try:
+                return None  #TODO(nathaniel): call the multimethod.
+            except face.NoSuchMethodError:
+                return None
 
 
 class _Server(interfaces.Server):
 
-  def __init__(self, server):
-    self._server = server
+    def __init__(self, server):
+        self._server = server
 
-  def add_insecure_port(self, address):
-    return self._server.add_insecure_port(address)
+    def add_insecure_port(self, address):
+        return self._server.add_insecure_port(address)
 
-  def add_secure_port(self, address, server_credentials):
-    return self._server.add_secure_port(address, server_credentials)
+    def add_secure_port(self, address, server_credentials):
+        return self._server.add_secure_port(address, server_credentials)
 
-  def start(self):
-    self._server.start()
+    def start(self):
+        self._server.start()
 
-  def stop(self, grace):
-    return self._server.stop(grace)
+    def stop(self, grace):
+        return self._server.stop(grace)
 
-  def __enter__(self):
-    self._server.start()
-    return self
+    def __enter__(self):
+        self._server.start()
+        return self
 
-  def __exit__(self, exc_type, exc_val, exc_tb):
-    self._server.stop(None)
-    return False
+    def __exit__(self, exc_type, exc_val, exc_tb):
+        self._server.stop(None)
+        return False
 
 
-def server(
-    service_implementations, multi_method_implementation, request_deserializers,
-    response_serializers, thread_pool, thread_pool_size):
-  generic_rpc_handler = _GenericRpcHandler(
-      service_implementations, multi_method_implementation,
-      request_deserializers, response_serializers)
-  if thread_pool is None:
-    effective_thread_pool = logging_pool.pool(
-        _DEFAULT_POOL_SIZE if thread_pool_size is None else thread_pool_size)
-  else:
-    effective_thread_pool = thread_pool
-  return _Server(
-      grpc.server(effective_thread_pool, handlers=(generic_rpc_handler,)))
+def server(service_implementations, multi_method_implementation,
+           request_deserializers, response_serializers, thread_pool,
+           thread_pool_size):
+    generic_rpc_handler = _GenericRpcHandler(
+        service_implementations, multi_method_implementation,
+        request_deserializers, response_serializers)
+    if thread_pool is None:
+        effective_thread_pool = logging_pool.pool(_DEFAULT_POOL_SIZE
+                                                  if thread_pool_size is None
+                                                  else thread_pool_size)
+    else:
+        effective_thread_pool = thread_pool
+    return _Server(
+        grpc.server(
+            effective_thread_pool, handlers=(generic_rpc_handler,)))
diff --git a/src/python/grpcio/grpc/beta/implementations.py b/src/python/grpcio/grpc/beta/implementations.py
index ab25fd5..7093852 100644
--- a/src/python/grpcio/grpc/beta/implementations.py
+++ b/src/python/grpcio/grpc/beta/implementations.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Entry points into the Beta API of gRPC Python."""
 
 # threading is referenced from specification in this module.
@@ -43,7 +42,6 @@
 from grpc.framework.common import cardinality  # pylint: disable=unused-import
 from grpc.framework.interfaces.face import face  # pylint: disable=unused-import
 
-
 ChannelCredentials = grpc.ChannelCredentials
 ssl_channel_credentials = grpc.ssl_channel_credentials
 CallCredentials = grpc.CallCredentials
@@ -51,7 +49,7 @@
 
 
 def google_call_credentials(credentials):
-  """Construct CallCredentials from GoogleCredentials.
+    """Construct CallCredentials from GoogleCredentials.
 
   Args:
     credentials: A GoogleCredentials object from the oauth2client library.
@@ -59,7 +57,8 @@
   Returns:
     A CallCredentials object for use in a GRPCCallOptions object.
   """
-  return metadata_call_credentials(_auth.GoogleCallCredentials(credentials))
+    return metadata_call_credentials(_auth.GoogleCallCredentials(credentials))
+
 
 access_token_call_credentials = grpc.access_token_call_credentials
 composite_call_credentials = grpc.composite_call_credentials
@@ -67,18 +66,18 @@
 
 
 class Channel(object):
-  """A channel to a remote host through which RPCs may be conducted.
+    """A channel to a remote host through which RPCs may be conducted.
 
   Only the "subscribe" and "unsubscribe" methods are supported for application
   use. This class' instance constructor and all other attributes are
   unsupported.
   """
 
-  def __init__(self, channel):
-    self._channel = channel
+    def __init__(self, channel):
+        self._channel = channel
 
-  def subscribe(self, callback, try_to_connect=None):
-    """Subscribes to this Channel's connectivity.
+    def subscribe(self, callback, try_to_connect=None):
+        """Subscribes to this Channel's connectivity.
 
     Args:
       callback: A callable to be invoked and passed an
@@ -90,20 +89,20 @@
         attempt to connect if it is not already connected and ready to conduct
         RPCs.
     """
-    self._channel.subscribe(callback, try_to_connect=try_to_connect)
+        self._channel.subscribe(callback, try_to_connect=try_to_connect)
 
-  def unsubscribe(self, callback):
-    """Unsubscribes a callback from this Channel's connectivity.
+    def unsubscribe(self, callback):
+        """Unsubscribes a callback from this Channel's connectivity.
 
     Args:
       callback: A callable previously registered with this Channel from having
         been passed to its "subscribe" method.
     """
-    self._channel.unsubscribe(callback)
+        self._channel.unsubscribe(callback)
 
 
 def insecure_channel(host, port):
-  """Creates an insecure Channel to a remote host.
+    """Creates an insecure Channel to a remote host.
 
   Args:
     host: The name of the remote host to which to connect.
@@ -113,13 +112,13 @@
   Returns:
     A Channel to the remote host through which RPCs may be conducted.
   """
-  channel = grpc.insecure_channel(
-      host if port is None else '%s:%d' % (host, port))
-  return Channel(channel)
+    channel = grpc.insecure_channel(host
+                                    if port is None else '%s:%d' % (host, port))
+    return Channel(channel)
 
 
 def secure_channel(host, port, channel_credentials):
-  """Creates a secure Channel to a remote host.
+    """Creates a secure Channel to a remote host.
 
   Args:
     host: The name of the remote host to which to connect.
@@ -130,37 +129,39 @@
   Returns:
     A secure Channel to the remote host through which RPCs may be conducted.
   """
-  channel = grpc.secure_channel(
-      host if port is None else '%s:%d' % (host, port), channel_credentials)
-  return Channel(channel)
+    channel = grpc.secure_channel(host if port is None else
+                                  '%s:%d' % (host, port), channel_credentials)
+    return Channel(channel)
 
 
 class StubOptions(object):
-  """A value encapsulating the various options for creation of a Stub.
+    """A value encapsulating the various options for creation of a Stub.
 
   This class and its instances have no supported interface - it exists to define
   the type of its instances and its instances exist to be passed to other
   functions.
   """
 
-  def __init__(
-      self, host, request_serializers, response_deserializers,
-      metadata_transformer, thread_pool, thread_pool_size):
-    self.host = host
-    self.request_serializers = request_serializers
-    self.response_deserializers = response_deserializers
-    self.metadata_transformer = metadata_transformer
-    self.thread_pool = thread_pool
-    self.thread_pool_size = thread_pool_size
-
-_EMPTY_STUB_OPTIONS = StubOptions(
-    None, None, None, None, None, None)
+    def __init__(self, host, request_serializers, response_deserializers,
+                 metadata_transformer, thread_pool, thread_pool_size):
+        self.host = host
+        self.request_serializers = request_serializers
+        self.response_deserializers = response_deserializers
+        self.metadata_transformer = metadata_transformer
+        self.thread_pool = thread_pool
+        self.thread_pool_size = thread_pool_size
 
 
-def stub_options(
-    host=None, request_serializers=None, response_deserializers=None,
-    metadata_transformer=None, thread_pool=None, thread_pool_size=None):
-  """Creates a StubOptions value to be passed at stub creation.
+_EMPTY_STUB_OPTIONS = StubOptions(None, None, None, None, None, None)
+
+
+def stub_options(host=None,
+                 request_serializers=None,
+                 response_deserializers=None,
+                 metadata_transformer=None,
+                 thread_pool=None,
+                 thread_pool_size=None):
+    """Creates a StubOptions value to be passed at stub creation.
 
   All parameters are optional and should always be passed by keyword.
 
@@ -180,13 +181,12 @@
   Returns:
     A StubOptions value created from the passed parameters.
   """
-  return StubOptions(
-      host, request_serializers, response_deserializers,
-      metadata_transformer, thread_pool, thread_pool_size)
+    return StubOptions(host, request_serializers, response_deserializers,
+                       metadata_transformer, thread_pool, thread_pool_size)
 
 
 def generic_stub(channel, options=None):
-  """Creates a face.GenericStub on which RPCs can be made.
+    """Creates a face.GenericStub on which RPCs can be made.
 
   Args:
     channel: A Channel for use by the created stub.
@@ -195,16 +195,17 @@
   Returns:
     A face.GenericStub on which RPCs can be made.
   """
-  effective_options = _EMPTY_STUB_OPTIONS if options is None else options
-  return _client_adaptations.generic_stub(
-      channel._channel,  # pylint: disable=protected-access
-      effective_options.host, effective_options.metadata_transformer,
-      effective_options.request_serializers,
-      effective_options.response_deserializers)
+    effective_options = _EMPTY_STUB_OPTIONS if options is None else options
+    return _client_adaptations.generic_stub(
+        channel._channel,  # pylint: disable=protected-access
+        effective_options.host,
+        effective_options.metadata_transformer,
+        effective_options.request_serializers,
+        effective_options.response_deserializers)
 
 
 def dynamic_stub(channel, service, cardinalities, options=None):
-  """Creates a face.DynamicStub with which RPCs can be invoked.
+    """Creates a face.DynamicStub with which RPCs can be invoked.
 
   Args:
     channel: A Channel for the returned face.DynamicStub to use.
@@ -217,13 +218,15 @@
   Returns:
     A face.DynamicStub with which RPCs can be invoked.
   """
-  effective_options = StubOptions() if options is None else options
-  return _client_adaptations.dynamic_stub(
-      channel._channel,  # pylint: disable=protected-access
-      service, cardinalities, effective_options.host,
-      effective_options.metadata_transformer,
-      effective_options.request_serializers,
-      effective_options.response_deserializers)
+    effective_options = StubOptions() if options is None else options
+    return _client_adaptations.dynamic_stub(
+        channel._channel,  # pylint: disable=protected-access
+        service,
+        cardinalities,
+        effective_options.host,
+        effective_options.metadata_transformer,
+        effective_options.request_serializers,
+        effective_options.response_deserializers)
 
 
 ServerCredentials = grpc.ServerCredentials
@@ -231,34 +234,36 @@
 
 
 class ServerOptions(object):
-  """A value encapsulating the various options for creation of a Server.
+    """A value encapsulating the various options for creation of a Server.
 
   This class and its instances have no supported interface - it exists to define
   the type of its instances and its instances exist to be passed to other
   functions.
   """
 
-  def __init__(
-      self, multi_method_implementation, request_deserializers,
-      response_serializers, thread_pool, thread_pool_size, default_timeout,
-      maximum_timeout):
-    self.multi_method_implementation = multi_method_implementation
-    self.request_deserializers = request_deserializers
-    self.response_serializers = response_serializers
-    self.thread_pool = thread_pool
-    self.thread_pool_size = thread_pool_size
-    self.default_timeout = default_timeout
-    self.maximum_timeout = maximum_timeout
-
-_EMPTY_SERVER_OPTIONS = ServerOptions(
-    None, None, None, None, None, None, None)
+    def __init__(self, multi_method_implementation, request_deserializers,
+                 response_serializers, thread_pool, thread_pool_size,
+                 default_timeout, maximum_timeout):
+        self.multi_method_implementation = multi_method_implementation
+        self.request_deserializers = request_deserializers
+        self.response_serializers = response_serializers
+        self.thread_pool = thread_pool
+        self.thread_pool_size = thread_pool_size
+        self.default_timeout = default_timeout
+        self.maximum_timeout = maximum_timeout
 
 
-def server_options(
-    multi_method_implementation=None, request_deserializers=None,
-    response_serializers=None, thread_pool=None, thread_pool_size=None,
-    default_timeout=None, maximum_timeout=None):
-  """Creates a ServerOptions value to be passed at server creation.
+_EMPTY_SERVER_OPTIONS = ServerOptions(None, None, None, None, None, None, None)
+
+
+def server_options(multi_method_implementation=None,
+                   request_deserializers=None,
+                   response_serializers=None,
+                   thread_pool=None,
+                   thread_pool_size=None,
+                   default_timeout=None,
+                   maximum_timeout=None):
+    """Creates a ServerOptions value to be passed at server creation.
 
   All parameters are optional and should always be passed by keyword.
 
@@ -282,13 +287,13 @@
   Returns:
     A StubOptions value created from the passed parameters.
   """
-  return ServerOptions(
-      multi_method_implementation, request_deserializers, response_serializers,
-      thread_pool, thread_pool_size, default_timeout, maximum_timeout)
+    return ServerOptions(multi_method_implementation, request_deserializers,
+                         response_serializers, thread_pool, thread_pool_size,
+                         default_timeout, maximum_timeout)
 
 
 def server(service_implementations, options=None):
-  """Creates an interfaces.Server with which RPCs can be serviced.
+    """Creates an interfaces.Server with which RPCs can be serviced.
 
   Args:
     service_implementations: A dictionary from service name-method name pair to
@@ -299,9 +304,9 @@
   Returns:
     An interfaces.Server with which RPCs can be serviced.
   """
-  effective_options = _EMPTY_SERVER_OPTIONS if options is None else options
-  return _server_adaptations.server(
-      service_implementations, effective_options.multi_method_implementation,
-      effective_options.request_deserializers,
-      effective_options.response_serializers, effective_options.thread_pool,
-      effective_options.thread_pool_size)
+    effective_options = _EMPTY_SERVER_OPTIONS if options is None else options
+    return _server_adaptations.server(
+        service_implementations, effective_options.multi_method_implementation,
+        effective_options.request_deserializers,
+        effective_options.response_serializers, effective_options.thread_pool,
+        effective_options.thread_pool_size)
diff --git a/src/python/grpcio/grpc/beta/interfaces.py b/src/python/grpcio/grpc/beta/interfaces.py
index 90f6bbb..361d1bc 100644
--- a/src/python/grpcio/grpc/beta/interfaces.py
+++ b/src/python/grpcio/grpc/beta/interfaces.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Constants and interfaces of the Beta API of gRPC Python."""
 
 import abc
@@ -43,21 +42,21 @@
 
 
 class GRPCCallOptions(object):
-  """A value encapsulating gRPC-specific options passed on RPC invocation.
+    """A value encapsulating gRPC-specific options passed on RPC invocation.
 
   This class and its instances have no supported interface - it exists to
   define the type of its instances and its instances exist to be passed to
   other functions.
   """
 
-  def __init__(self, disable_compression, subcall_of, credentials):
-    self.disable_compression = disable_compression
-    self.subcall_of = subcall_of
-    self.credentials = credentials
+    def __init__(self, disable_compression, subcall_of, credentials):
+        self.disable_compression = disable_compression
+        self.subcall_of = subcall_of
+        self.credentials = credentials
 
 
 def grpc_call_options(disable_compression=False, credentials=None):
-  """Creates a GRPCCallOptions value to be passed at RPC invocation.
+    """Creates a GRPCCallOptions value to be passed at RPC invocation.
 
   All parameters are optional and should always be passed by keyword.
 
@@ -67,7 +66,8 @@
       request-unary RPCs.
     credentials: A CallCredentials object to use for the invoked RPC.
   """
-  return GRPCCallOptions(disable_compression, None, credentials)
+    return GRPCCallOptions(disable_compression, None, credentials)
+
 
 GRPCAuthMetadataContext = grpc.AuthMetadataContext
 GRPCAuthMetadataPluginCallback = grpc.AuthMetadataPluginCallback
@@ -75,38 +75,38 @@
 
 
 class GRPCServicerContext(six.with_metaclass(abc.ABCMeta)):
-  """Exposes gRPC-specific options and behaviors to code servicing RPCs."""
+    """Exposes gRPC-specific options and behaviors to code servicing RPCs."""
 
-  @abc.abstractmethod
-  def peer(self):
-    """Identifies the peer that invoked the RPC being serviced.
+    @abc.abstractmethod
+    def peer(self):
+        """Identifies the peer that invoked the RPC being serviced.
 
     Returns:
       A string identifying the peer that invoked the RPC being serviced.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def disable_next_response_compression(self):
-    """Disables compression of the next response passed by the application."""
-    raise NotImplementedError()
+    @abc.abstractmethod
+    def disable_next_response_compression(self):
+        """Disables compression of the next response passed by the application."""
+        raise NotImplementedError()
 
 
 class GRPCInvocationContext(six.with_metaclass(abc.ABCMeta)):
-  """Exposes gRPC-specific options and behaviors to code invoking RPCs."""
+    """Exposes gRPC-specific options and behaviors to code invoking RPCs."""
 
-  @abc.abstractmethod
-  def disable_next_request_compression(self):
-    """Disables compression of the next request passed by the application."""
-    raise NotImplementedError()
+    @abc.abstractmethod
+    def disable_next_request_compression(self):
+        """Disables compression of the next request passed by the application."""
+        raise NotImplementedError()
 
 
 class Server(six.with_metaclass(abc.ABCMeta)):
-  """Services RPCs."""
+    """Services RPCs."""
 
-  @abc.abstractmethod
-  def add_insecure_port(self, address):
-    """Reserves a port for insecure RPC service once this Server becomes active.
+    @abc.abstractmethod
+    def add_insecure_port(self, address):
+        """Reserves a port for insecure RPC service once this Server becomes active.
 
     This method may only be called before calling this Server's start method is
     called.
@@ -120,11 +120,11 @@
         in the passed address, but will likely be different if the port number
         contained in the passed address was zero.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def add_secure_port(self, address, server_credentials):
-    """Reserves a port for secure RPC service after this Server becomes active.
+    @abc.abstractmethod
+    def add_secure_port(self, address, server_credentials):
+        """Reserves a port for secure RPC service after this Server becomes active.
 
     This method may only be called before calling this Server's start method is
     called.
@@ -139,20 +139,20 @@
         in the passed address, but will likely be different if the port number
         contained in the passed address was zero.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def start(self):
-    """Starts this Server's service of RPCs.
+    @abc.abstractmethod
+    def start(self):
+        """Starts this Server's service of RPCs.
 
     This method may only be called while the server is not serving RPCs (i.e. it
     is not idempotent).
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def stop(self, grace):
-    """Stops this Server's service of RPCs.
+    @abc.abstractmethod
+    def stop(self, grace):
+        """Stops this Server's service of RPCs.
 
     All calls to this method immediately stop service of new RPCs. When existing
     RPCs are aborted is controlled by the grace period parameter passed to this
@@ -177,4 +177,4 @@
       at the time it was stopped or if all RPCs that it had underway completed
       very early in the grace period).
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
diff --git a/src/python/grpcio/grpc/beta/utilities.py b/src/python/grpcio/grpc/beta/utilities.py
index fb07a76..6052535 100644
--- a/src/python/grpcio/grpc/beta/utilities.py
+++ b/src/python/grpcio/grpc/beta/utilities.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Utilities for the gRPC Python Beta API."""
 
 import threading
@@ -44,107 +43,107 @@
 
 class _ChannelReadyFuture(future.Future):
 
-  def __init__(self, channel):
-    self._condition = threading.Condition()
-    self._channel = channel
+    def __init__(self, channel):
+        self._condition = threading.Condition()
+        self._channel = channel
 
-    self._matured = False
-    self._cancelled = False
-    self._done_callbacks = []
+        self._matured = False
+        self._cancelled = False
+        self._done_callbacks = []
 
-  def _block(self, timeout):
-    until = None if timeout is None else time.time() + timeout
-    with self._condition:
-      while True:
-        if self._cancelled:
-          raise future.CancelledError()
-        elif self._matured:
-          return
-        else:
-          if until is None:
-            self._condition.wait()
-          else:
-            remaining = until - time.time()
-            if remaining < 0:
-              raise future.TimeoutError()
+    def _block(self, timeout):
+        until = None if timeout is None else time.time() + timeout
+        with self._condition:
+            while True:
+                if self._cancelled:
+                    raise future.CancelledError()
+                elif self._matured:
+                    return
+                else:
+                    if until is None:
+                        self._condition.wait()
+                    else:
+                        remaining = until - time.time()
+                        if remaining < 0:
+                            raise future.TimeoutError()
+                        else:
+                            self._condition.wait(timeout=remaining)
+
+    def _update(self, connectivity):
+        with self._condition:
+            if (not self._cancelled and
+                    connectivity is interfaces.ChannelConnectivity.READY):
+                self._matured = True
+                self._channel.unsubscribe(self._update)
+                self._condition.notify_all()
+                done_callbacks = tuple(self._done_callbacks)
+                self._done_callbacks = None
             else:
-              self._condition.wait(timeout=remaining)
+                return
 
-  def _update(self, connectivity):
-    with self._condition:
-      if (not self._cancelled and
-          connectivity is interfaces.ChannelConnectivity.READY):
-        self._matured = True
-        self._channel.unsubscribe(self._update)
-        self._condition.notify_all()
-        done_callbacks = tuple(self._done_callbacks)
-        self._done_callbacks = None
-      else:
-        return
+        for done_callback in done_callbacks:
+            callable_util.call_logging_exceptions(
+                done_callback, _DONE_CALLBACK_EXCEPTION_LOG_MESSAGE, self)
 
-    for done_callback in done_callbacks:
-      callable_util.call_logging_exceptions(
-          done_callback, _DONE_CALLBACK_EXCEPTION_LOG_MESSAGE, self)
+    def cancel(self):
+        with self._condition:
+            if not self._matured:
+                self._cancelled = True
+                self._channel.unsubscribe(self._update)
+                self._condition.notify_all()
+                done_callbacks = tuple(self._done_callbacks)
+                self._done_callbacks = None
+            else:
+                return False
 
-  def cancel(self):
-    with self._condition:
-      if not self._matured:
-        self._cancelled = True
-        self._channel.unsubscribe(self._update)
-        self._condition.notify_all()
-        done_callbacks = tuple(self._done_callbacks)
-        self._done_callbacks = None
-      else:
-        return False
+        for done_callback in done_callbacks:
+            callable_util.call_logging_exceptions(
+                done_callback, _DONE_CALLBACK_EXCEPTION_LOG_MESSAGE, self)
 
-    for done_callback in done_callbacks:
-      callable_util.call_logging_exceptions(
-          done_callback, _DONE_CALLBACK_EXCEPTION_LOG_MESSAGE, self)
+    def cancelled(self):
+        with self._condition:
+            return self._cancelled
 
-  def cancelled(self):
-    with self._condition:
-      return self._cancelled
+    def running(self):
+        with self._condition:
+            return not self._cancelled and not self._matured
 
-  def running(self):
-    with self._condition:
-      return not self._cancelled and not self._matured
+    def done(self):
+        with self._condition:
+            return self._cancelled or self._matured
 
-  def done(self):
-    with self._condition:
-      return self._cancelled or self._matured
+    def result(self, timeout=None):
+        self._block(timeout)
+        return None
 
-  def result(self, timeout=None):
-    self._block(timeout)
-    return None
+    def exception(self, timeout=None):
+        self._block(timeout)
+        return None
 
-  def exception(self, timeout=None):
-    self._block(timeout)
-    return None
+    def traceback(self, timeout=None):
+        self._block(timeout)
+        return None
 
-  def traceback(self, timeout=None):
-    self._block(timeout)
-    return None
+    def add_done_callback(self, fn):
+        with self._condition:
+            if not self._cancelled and not self._matured:
+                self._done_callbacks.append(fn)
+                return
 
-  def add_done_callback(self, fn):
-    with self._condition:
-      if not self._cancelled and not self._matured:
-        self._done_callbacks.append(fn)
-        return
+        fn(self)
 
-    fn(self)
+    def start(self):
+        with self._condition:
+            self._channel.subscribe(self._update, try_to_connect=True)
 
-  def start(self):
-    with self._condition:
-      self._channel.subscribe(self._update, try_to_connect=True)
-
-  def __del__(self):
-    with self._condition:
-      if not self._cancelled and not self._matured:
-        self._channel.unsubscribe(self._update)
+    def __del__(self):
+        with self._condition:
+            if not self._cancelled and not self._matured:
+                self._channel.unsubscribe(self._update)
 
 
 def channel_ready_future(channel):
-  """Creates a future.Future tracking when an implementations.Channel is ready.
+    """Creates a future.Future tracking when an implementations.Channel is ready.
 
   Cancelling the returned future.Future does not tell the given
   implementations.Channel to abandon attempts it may have been making to
@@ -158,7 +157,6 @@
     A future.Future that matures when the given Channel has connectivity
       interfaces.ChannelConnectivity.READY.
   """
-  ready_future = _ChannelReadyFuture(channel)
-  ready_future.start()
-  return ready_future
-
+    ready_future = _ChannelReadyFuture(channel)
+    ready_future.start()
+    return ready_future
diff --git a/src/python/grpcio/grpc/framework/__init__.py b/src/python/grpcio/grpc/framework/__init__.py
index 7086519..b893988 100644
--- a/src/python/grpcio/grpc/framework/__init__.py
+++ b/src/python/grpcio/grpc/framework/__init__.py
@@ -26,5 +26,3 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
diff --git a/src/python/grpcio/grpc/framework/common/__init__.py b/src/python/grpcio/grpc/framework/common/__init__.py
index 7086519..b893988 100644
--- a/src/python/grpcio/grpc/framework/common/__init__.py
+++ b/src/python/grpcio/grpc/framework/common/__init__.py
@@ -26,5 +26,3 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
diff --git a/src/python/grpcio/grpc/framework/common/cardinality.py b/src/python/grpcio/grpc/framework/common/cardinality.py
index 610425e..d8927cf 100644
--- a/src/python/grpcio/grpc/framework/common/cardinality.py
+++ b/src/python/grpcio/grpc/framework/common/cardinality.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Defines an enum for classifying RPC methods by streaming semantics."""
 
 import enum
@@ -34,9 +33,9 @@
 
 @enum.unique
 class Cardinality(enum.Enum):
-  """Describes the streaming semantics of an RPC method."""
+    """Describes the streaming semantics of an RPC method."""
 
-  UNARY_UNARY = 'request-unary/response-unary'
-  UNARY_STREAM = 'request-unary/response-streaming'
-  STREAM_UNARY = 'request-streaming/response-unary'
-  STREAM_STREAM = 'request-streaming/response-streaming'
+    UNARY_UNARY = 'request-unary/response-unary'
+    UNARY_STREAM = 'request-unary/response-streaming'
+    STREAM_UNARY = 'request-streaming/response-unary'
+    STREAM_STREAM = 'request-streaming/response-streaming'
diff --git a/src/python/grpcio/grpc/framework/common/style.py b/src/python/grpcio/grpc/framework/common/style.py
index 6ae694b..43f4211 100644
--- a/src/python/grpcio/grpc/framework/common/style.py
+++ b/src/python/grpcio/grpc/framework/common/style.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Defines an enum for classifying RPC methods by control flow semantics."""
 
 import enum
@@ -34,7 +33,7 @@
 
 @enum.unique
 class Service(enum.Enum):
-  """Describes the control flow style of RPC method implementation."""
+    """Describes the control flow style of RPC method implementation."""
 
-  INLINE = 'inline'
-  EVENT = 'event'
+    INLINE = 'inline'
+    EVENT = 'event'
diff --git a/src/python/grpcio/grpc/framework/foundation/__init__.py b/src/python/grpcio/grpc/framework/foundation/__init__.py
index 7086519..b893988 100644
--- a/src/python/grpcio/grpc/framework/foundation/__init__.py
+++ b/src/python/grpcio/grpc/framework/foundation/__init__.py
@@ -26,5 +26,3 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
diff --git a/src/python/grpcio/grpc/framework/foundation/abandonment.py b/src/python/grpcio/grpc/framework/foundation/abandonment.py
index 960b4d0..32385b9 100644
--- a/src/python/grpcio/grpc/framework/foundation/abandonment.py
+++ b/src/python/grpcio/grpc/framework/foundation/abandonment.py
@@ -26,12 +26,11 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Utilities for indicating abandonment of computation."""
 
 
 class Abandoned(Exception):
-  """Indicates that some computation is being abandoned.
+    """Indicates that some computation is being abandoned.
 
   Abandoning a computation is different than returning a value or raising
   an exception indicating some operational or programming defect.
diff --git a/src/python/grpcio/grpc/framework/foundation/callable_util.py b/src/python/grpcio/grpc/framework/foundation/callable_util.py
index 4f029f9..3b8351c 100644
--- a/src/python/grpcio/grpc/framework/foundation/callable_util.py
+++ b/src/python/grpcio/grpc/framework/foundation/callable_util.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Utilities for working with callables."""
 
 import abc
@@ -39,7 +38,7 @@
 
 
 class Outcome(six.with_metaclass(abc.ABCMeta)):
-  """A sum type describing the outcome of some call.
+    """A sum type describing the outcome of some call.
 
   Attributes:
     kind: One of Kind.RETURNED or Kind.RAISED respectively indicating that the
@@ -50,31 +49,31 @@
       Kind.RAISED.
   """
 
-  @enum.unique
-  class Kind(enum.Enum):
-    """Identifies the general kind of the outcome of some call."""
+    @enum.unique
+    class Kind(enum.Enum):
+        """Identifies the general kind of the outcome of some call."""
 
-    RETURNED = object()
-    RAISED = object()
+        RETURNED = object()
+        RAISED = object()
 
 
 class _EasyOutcome(
-    collections.namedtuple(
-        '_EasyOutcome', ['kind', 'return_value', 'exception']),
-    Outcome):
-  """A trivial implementation of Outcome."""
+        collections.namedtuple('_EasyOutcome',
+                               ['kind', 'return_value', 'exception']), Outcome):
+    """A trivial implementation of Outcome."""
 
 
 def _call_logging_exceptions(behavior, message, *args, **kwargs):
-  try:
-    return _EasyOutcome(Outcome.Kind.RETURNED, behavior(*args, **kwargs), None)
-  except Exception as e:  # pylint: disable=broad-except
-    logging.exception(message)
-    return _EasyOutcome(Outcome.Kind.RAISED, None, e)
+    try:
+        return _EasyOutcome(Outcome.Kind.RETURNED,
+                            behavior(*args, **kwargs), None)
+    except Exception as e:  # pylint: disable=broad-except
+        logging.exception(message)
+        return _EasyOutcome(Outcome.Kind.RAISED, None, e)
 
 
 def with_exceptions_logged(behavior, message):
-  """Wraps a callable in a try-except that logs any exceptions it raises.
+    """Wraps a callable in a try-except that logs any exceptions it raises.
 
   Args:
     behavior: Any callable.
@@ -86,14 +85,16 @@
       future.Outcome describing whether the given behavior returned a value or
       raised an exception.
   """
-  @functools.wraps(behavior)
-  def wrapped_behavior(*args, **kwargs):
-    return _call_logging_exceptions(behavior, message, *args, **kwargs)
-  return wrapped_behavior
+
+    @functools.wraps(behavior)
+    def wrapped_behavior(*args, **kwargs):
+        return _call_logging_exceptions(behavior, message, *args, **kwargs)
+
+    return wrapped_behavior
 
 
 def call_logging_exceptions(behavior, message, *args, **kwargs):
-  """Calls a behavior in a try-except that logs any exceptions it raises.
+    """Calls a behavior in a try-except that logs any exceptions it raises.
 
   Args:
     behavior: Any callable.
@@ -105,4 +106,4 @@
     An Outcome describing whether the given behavior returned a value or raised
       an exception.
   """
-  return _call_logging_exceptions(behavior, message, *args, **kwargs)
+    return _call_logging_exceptions(behavior, message, *args, **kwargs)
diff --git a/src/python/grpcio/grpc/framework/foundation/future.py b/src/python/grpcio/grpc/framework/foundation/future.py
index 6fb58ea..e2ecf62 100644
--- a/src/python/grpcio/grpc/framework/foundation/future.py
+++ b/src/python/grpcio/grpc/framework/foundation/future.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """A Future interface.
 
 Python doesn't have a Future interface in its standard library. In the absence
@@ -53,33 +52,33 @@
 
 
 class TimeoutError(Exception):
-  """Indicates that a particular call timed out."""
+    """Indicates that a particular call timed out."""
 
 
 class CancelledError(Exception):
-  """Indicates that the computation underlying a Future was cancelled."""
+    """Indicates that the computation underlying a Future was cancelled."""
 
 
 class Future(six.with_metaclass(abc.ABCMeta)):
-  """A representation of a computation in another control flow.
+    """A representation of a computation in another control flow.
 
   Computations represented by a Future may be yet to be begun, may be ongoing,
   or may have already completed.
   """
 
-  # NOTE(nathaniel): This isn't the return type that I would want to have if it
-  # were up to me. Were this interface being written from scratch, the return
-  # type of this method would probably be a sum type like:
-  #
-  # NOT_COMMENCED
-  # COMMENCED_AND_NOT_COMPLETED
-  # PARTIAL_RESULT<Partial_Result_Type>
-  # COMPLETED<Result_Type>
-  # UNCANCELLABLE
-  # NOT_IMMEDIATELY_DETERMINABLE
-  @abc.abstractmethod
-  def cancel(self):
-    """Attempts to cancel the computation.
+    # NOTE(nathaniel): This isn't the return type that I would want to have if it
+    # were up to me. Were this interface being written from scratch, the return
+    # type of this method would probably be a sum type like:
+    #
+    # NOT_COMMENCED
+    # COMMENCED_AND_NOT_COMPLETED
+    # PARTIAL_RESULT<Partial_Result_Type>
+    # COMPLETED<Result_Type>
+    # UNCANCELLABLE
+    # NOT_IMMEDIATELY_DETERMINABLE
+    @abc.abstractmethod
+    def cancel(self):
+        """Attempts to cancel the computation.
 
     This method does not block.
 
@@ -92,25 +91,25 @@
         remote system for which a determination of whether or not it commenced
         before being cancelled cannot be made without blocking.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  # NOTE(nathaniel): Here too this isn't the return type that I'd want this
-  # method to have if it were up to me. I think I'd go with another sum type
-  # like:
-  #
-  # NOT_CANCELLED (this object's cancel method hasn't been called)
-  # NOT_COMMENCED
-  # COMMENCED_AND_NOT_COMPLETED
-  # PARTIAL_RESULT<Partial_Result_Type>
-  # COMPLETED<Result_Type>
-  # UNCANCELLABLE
-  # NOT_IMMEDIATELY_DETERMINABLE
-  #
-  # Notice how giving the cancel method the right semantics obviates most
-  # reasons for this method to exist.
-  @abc.abstractmethod
-  def cancelled(self):
-    """Describes whether the computation was cancelled.
+    # NOTE(nathaniel): Here too this isn't the return type that I'd want this
+    # method to have if it were up to me. I think I'd go with another sum type
+    # like:
+    #
+    # NOT_CANCELLED (this object's cancel method hasn't been called)
+    # NOT_COMMENCED
+    # COMMENCED_AND_NOT_COMPLETED
+    # PARTIAL_RESULT<Partial_Result_Type>
+    # COMPLETED<Result_Type>
+    # UNCANCELLABLE
+    # NOT_IMMEDIATELY_DETERMINABLE
+    #
+    # Notice how giving the cancel method the right semantics obviates most
+    # reasons for this method to exist.
+    @abc.abstractmethod
+    def cancelled(self):
+        """Describes whether the computation was cancelled.
 
     This method does not block.
 
@@ -120,11 +119,11 @@
         not limited to this object's cancel method not having been called and
         the computation's result having become immediately available.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def running(self):
-    """Describes whether the computation is taking place.
+    @abc.abstractmethod
+    def running(self):
+        """Describes whether the computation is taking place.
 
     This method does not block.
 
@@ -133,15 +132,15 @@
         taking place now, or False if the computation took place in the past or
         was cancelled.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  # NOTE(nathaniel): These aren't quite the semantics I'd like here either. I
-  # would rather this only returned True in cases in which the underlying
-  # computation completed successfully. A computation's having been cancelled
-  # conflicts with considering that computation "done".
-  @abc.abstractmethod
-  def done(self):
-    """Describes whether the computation has taken place.
+    # NOTE(nathaniel): These aren't quite the semantics I'd like here either. I
+    # would rather this only returned True in cases in which the underlying
+    # computation completed successfully. A computation's having been cancelled
+    # conflicts with considering that computation "done".
+    @abc.abstractmethod
+    def done(self):
+        """Describes whether the computation has taken place.
 
     This method does not block.
 
@@ -150,11 +149,11 @@
         unscheduled or interrupted. False if the computation may possibly be
         executing or scheduled to execute later.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def result(self, timeout=None):
-    """Accesses the outcome of the computation or raises its exception.
+    @abc.abstractmethod
+    def result(self, timeout=None):
+        """Accesses the outcome of the computation or raises its exception.
 
     This method may return immediately or may block.
 
@@ -173,11 +172,11 @@
       Exception: If the computation raised an exception, this call will raise
         the same exception.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def exception(self, timeout=None):
-    """Return the exception raised by the computation.
+    @abc.abstractmethod
+    def exception(self, timeout=None):
+        """Return the exception raised by the computation.
 
     This method may return immediately or may block.
 
@@ -196,11 +195,11 @@
         terminate within the allotted time.
       CancelledError: If the computation was cancelled.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def traceback(self, timeout=None):
-    """Access the traceback of the exception raised by the computation.
+    @abc.abstractmethod
+    def traceback(self, timeout=None):
+        """Access the traceback of the exception raised by the computation.
 
     This method may return immediately or may block.
 
@@ -219,11 +218,11 @@
         terminate within the allotted time.
       CancelledError: If the computation was cancelled.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def add_done_callback(self, fn):
-    """Adds a function to be called at completion of the computation.
+    @abc.abstractmethod
+    def add_done_callback(self, fn):
+        """Adds a function to be called at completion of the computation.
 
     The callback will be passed this Future object describing the outcome of
     the computation.
@@ -234,4 +233,4 @@
     Args:
       fn: A callable taking this Future object as its single parameter.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
diff --git a/src/python/grpcio/grpc/framework/foundation/logging_pool.py b/src/python/grpcio/grpc/framework/foundation/logging_pool.py
index 9b469a1..9164173 100644
--- a/src/python/grpcio/grpc/framework/foundation/logging_pool.py
+++ b/src/python/grpcio/grpc/framework/foundation/logging_pool.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """A thread pool that logs exceptions raised by tasks executed within it."""
 
 import logging
@@ -35,42 +34,46 @@
 
 
 def _wrap(behavior):
-  """Wraps an arbitrary callable behavior in exception-logging."""
-  def _wrapping(*args, **kwargs):
-    try:
-      return behavior(*args, **kwargs)
-    except Exception as e:
-      logging.exception(
-          'Unexpected exception from %s executed in logging pool!', behavior)
-      raise
-  return _wrapping
+    """Wraps an arbitrary callable behavior in exception-logging."""
+
+    def _wrapping(*args, **kwargs):
+        try:
+            return behavior(*args, **kwargs)
+        except Exception as e:
+            logging.exception(
+                'Unexpected exception from %s executed in logging pool!',
+                behavior)
+            raise
+
+    return _wrapping
 
 
 class _LoggingPool(object):
-  """An exception-logging futures.ThreadPoolExecutor-compatible thread pool."""
+    """An exception-logging futures.ThreadPoolExecutor-compatible thread pool."""
 
-  def __init__(self, backing_pool):
-    self._backing_pool = backing_pool
+    def __init__(self, backing_pool):
+        self._backing_pool = backing_pool
 
-  def __enter__(self):
-    return self
+    def __enter__(self):
+        return self
 
-  def __exit__(self, exc_type, exc_val, exc_tb):
-    self._backing_pool.shutdown(wait=True)
+    def __exit__(self, exc_type, exc_val, exc_tb):
+        self._backing_pool.shutdown(wait=True)
 
-  def submit(self, fn, *args, **kwargs):
-    return self._backing_pool.submit(_wrap(fn), *args, **kwargs)
+    def submit(self, fn, *args, **kwargs):
+        return self._backing_pool.submit(_wrap(fn), *args, **kwargs)
 
-  def map(self, func, *iterables, **kwargs):
-    return self._backing_pool.map(
-        _wrap(func), *iterables, timeout=kwargs.get('timeout', None))
+    def map(self, func, *iterables, **kwargs):
+        return self._backing_pool.map(_wrap(func),
+                                      *iterables,
+                                      timeout=kwargs.get('timeout', None))
 
-  def shutdown(self, wait=True):
-    self._backing_pool.shutdown(wait=wait)
+    def shutdown(self, wait=True):
+        self._backing_pool.shutdown(wait=wait)
 
 
 def pool(max_workers):
-  """Creates a thread pool that logs exceptions raised by the tasks within it.
+    """Creates a thread pool that logs exceptions raised by the tasks within it.
 
   Args:
     max_workers: The maximum number of worker threads to allow the pool.
@@ -79,4 +82,4 @@
     A futures.ThreadPoolExecutor-compatible thread pool that logs exceptions
       raised by the tasks executed within it.
   """
-  return _LoggingPool(futures.ThreadPoolExecutor(max_workers))
+    return _LoggingPool(futures.ThreadPoolExecutor(max_workers))
diff --git a/src/python/grpcio/grpc/framework/foundation/stream.py b/src/python/grpcio/grpc/framework/foundation/stream.py
index ddd6cc4..2529a69 100644
--- a/src/python/grpcio/grpc/framework/foundation/stream.py
+++ b/src/python/grpcio/grpc/framework/foundation/stream.py
@@ -26,35 +26,35 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Interfaces related to streams of values or objects."""
 
 import abc
 
 import six
 
+
 class Consumer(six.with_metaclass(abc.ABCMeta)):
-  """Interface for consumers of finite streams of values or objects."""
+    """Interface for consumers of finite streams of values or objects."""
 
-  @abc.abstractmethod
-  def consume(self, value):
-    """Accepts a value.
+    @abc.abstractmethod
+    def consume(self, value):
+        """Accepts a value.
 
     Args:
       value: Any value accepted by this Consumer.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def terminate(self):
-    """Indicates to this Consumer that no more values will be supplied."""
-    raise NotImplementedError()
+    @abc.abstractmethod
+    def terminate(self):
+        """Indicates to this Consumer that no more values will be supplied."""
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def consume_and_terminate(self, value):
-    """Supplies a value and signals that no more values will be supplied.
+    @abc.abstractmethod
+    def consume_and_terminate(self, value):
+        """Supplies a value and signals that no more values will be supplied.
 
     Args:
       value: Any value accepted by this Consumer.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
diff --git a/src/python/grpcio/grpc/framework/foundation/stream_util.py b/src/python/grpcio/grpc/framework/foundation/stream_util.py
index a6f234f..6b356f1 100644
--- a/src/python/grpcio/grpc/framework/foundation/stream_util.py
+++ b/src/python/grpcio/grpc/framework/foundation/stream_util.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Helpful utilities related to the stream module."""
 
 import logging
@@ -38,126 +37,126 @@
 
 
 class TransformingConsumer(stream.Consumer):
-  """A stream.Consumer that passes a transformation of its input to another."""
+    """A stream.Consumer that passes a transformation of its input to another."""
 
-  def __init__(self, transformation, downstream):
-    self._transformation = transformation
-    self._downstream = downstream
+    def __init__(self, transformation, downstream):
+        self._transformation = transformation
+        self._downstream = downstream
 
-  def consume(self, value):
-    self._downstream.consume(self._transformation(value))
+    def consume(self, value):
+        self._downstream.consume(self._transformation(value))
 
-  def terminate(self):
-    self._downstream.terminate()
+    def terminate(self):
+        self._downstream.terminate()
 
-  def consume_and_terminate(self, value):
-    self._downstream.consume_and_terminate(self._transformation(value))
+    def consume_and_terminate(self, value):
+        self._downstream.consume_and_terminate(self._transformation(value))
 
 
 class IterableConsumer(stream.Consumer):
-  """A Consumer that when iterated over emits the values it has consumed."""
+    """A Consumer that when iterated over emits the values it has consumed."""
 
-  def __init__(self):
-    self._condition = threading.Condition()
-    self._values = []
-    self._active = True
+    def __init__(self):
+        self._condition = threading.Condition()
+        self._values = []
+        self._active = True
 
-  def consume(self, stock_reply):
-    with self._condition:
-      if self._active:
-        self._values.append(stock_reply)
-        self._condition.notify()
+    def consume(self, stock_reply):
+        with self._condition:
+            if self._active:
+                self._values.append(stock_reply)
+                self._condition.notify()
 
-  def terminate(self):
-    with self._condition:
-      self._active = False
-      self._condition.notify()
+    def terminate(self):
+        with self._condition:
+            self._active = False
+            self._condition.notify()
 
-  def consume_and_terminate(self, stock_reply):
-    with self._condition:
-      if self._active:
-        self._values.append(stock_reply)
-        self._active = False
-        self._condition.notify()
+    def consume_and_terminate(self, stock_reply):
+        with self._condition:
+            if self._active:
+                self._values.append(stock_reply)
+                self._active = False
+                self._condition.notify()
 
-  def __iter__(self):
-    return self
+    def __iter__(self):
+        return self
 
-  def __next__(self):
-    return self.next()
+    def __next__(self):
+        return self.next()
 
-  def next(self):
-    with self._condition:
-      while self._active and not self._values:
-        self._condition.wait()
-      if self._values:
-        return self._values.pop(0)
-      else:
-        raise StopIteration()
+    def next(self):
+        with self._condition:
+            while self._active and not self._values:
+                self._condition.wait()
+            if self._values:
+                return self._values.pop(0)
+            else:
+                raise StopIteration()
 
 
 class ThreadSwitchingConsumer(stream.Consumer):
-  """A Consumer decorator that affords serialization and asynchrony."""
+    """A Consumer decorator that affords serialization and asynchrony."""
 
-  def __init__(self, sink, pool):
-    self._lock = threading.Lock()
-    self._sink = sink
-    self._pool = pool
-    # True if self._spin has been submitted to the pool to be called once and
-    # that call has not yet returned, False otherwise.
-    self._spinning = False
-    self._values = []
-    self._active = True
+    def __init__(self, sink, pool):
+        self._lock = threading.Lock()
+        self._sink = sink
+        self._pool = pool
+        # True if self._spin has been submitted to the pool to be called once and
+        # that call has not yet returned, False otherwise.
+        self._spinning = False
+        self._values = []
+        self._active = True
 
-  def _spin(self, sink, value, terminate):
-    while True:
-      try:
-        if value is _NO_VALUE:
-          sink.terminate()
-        elif terminate:
-          sink.consume_and_terminate(value)
-        else:
-          sink.consume(value)
-      except Exception as e:  # pylint:disable=broad-except
-        logging.exception(e)
+    def _spin(self, sink, value, terminate):
+        while True:
+            try:
+                if value is _NO_VALUE:
+                    sink.terminate()
+                elif terminate:
+                    sink.consume_and_terminate(value)
+                else:
+                    sink.consume(value)
+            except Exception as e:  # pylint:disable=broad-except
+                logging.exception(e)
 
-      with self._lock:
-        if terminate:
-          self._spinning = False
-          return
-        elif self._values:
-          value = self._values.pop(0)
-          terminate = not self._values and not self._active
-        elif not self._active:
-          value = _NO_VALUE
-          terminate = True
-        else:
-          self._spinning = False
-          return
+            with self._lock:
+                if terminate:
+                    self._spinning = False
+                    return
+                elif self._values:
+                    value = self._values.pop(0)
+                    terminate = not self._values and not self._active
+                elif not self._active:
+                    value = _NO_VALUE
+                    terminate = True
+                else:
+                    self._spinning = False
+                    return
 
-  def consume(self, value):
-    with self._lock:
-      if self._active:
-        if self._spinning:
-          self._values.append(value)
-        else:
-          self._pool.submit(self._spin, self._sink, value, False)
-          self._spinning = True
+    def consume(self, value):
+        with self._lock:
+            if self._active:
+                if self._spinning:
+                    self._values.append(value)
+                else:
+                    self._pool.submit(self._spin, self._sink, value, False)
+                    self._spinning = True
 
-  def terminate(self):
-    with self._lock:
-      if self._active:
-        self._active = False
-        if not self._spinning:
-          self._pool.submit(self._spin, self._sink, _NO_VALUE, True)
-          self._spinning = True
+    def terminate(self):
+        with self._lock:
+            if self._active:
+                self._active = False
+                if not self._spinning:
+                    self._pool.submit(self._spin, self._sink, _NO_VALUE, True)
+                    self._spinning = True
 
-  def consume_and_terminate(self, value):
-    with self._lock:
-      if self._active:
-        self._active = False
-        if self._spinning:
-          self._values.append(value)
-        else:
-          self._pool.submit(self._spin, self._sink, value, True)
-          self._spinning = True
+    def consume_and_terminate(self, value):
+        with self._lock:
+            if self._active:
+                self._active = False
+                if self._spinning:
+                    self._values.append(value)
+                else:
+                    self._pool.submit(self._spin, self._sink, value, True)
+                    self._spinning = True
diff --git a/src/python/grpcio/grpc/framework/interfaces/__init__.py b/src/python/grpcio/grpc/framework/interfaces/__init__.py
index 7086519..b893988 100644
--- a/src/python/grpcio/grpc/framework/interfaces/__init__.py
+++ b/src/python/grpcio/grpc/framework/interfaces/__init__.py
@@ -26,5 +26,3 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
diff --git a/src/python/grpcio/grpc/framework/interfaces/base/__init__.py b/src/python/grpcio/grpc/framework/interfaces/base/__init__.py
index 7086519..b893988 100644
--- a/src/python/grpcio/grpc/framework/interfaces/base/__init__.py
+++ b/src/python/grpcio/grpc/framework/interfaces/base/__init__.py
@@ -26,5 +26,3 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
diff --git a/src/python/grpcio/grpc/framework/interfaces/base/base.py b/src/python/grpcio/grpc/framework/interfaces/base/base.py
index a2ddd9c..cb33282 100644
--- a/src/python/grpcio/grpc/framework/interfaces/base/base.py
+++ b/src/python/grpcio/grpc/framework/interfaces/base/base.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """The base interface of RPC Framework.
 
 Implementations of this interface support the conduct of "operations":
@@ -49,7 +48,7 @@
 
 
 class NoSuchMethodError(Exception):
-  """Indicates that an unrecognized operation has been called.
+    """Indicates that an unrecognized operation has been called.
 
   Attributes:
     code: A code value to communicate to the other side of the operation along
@@ -58,8 +57,8 @@
       along with indication of operation termination. May be None.
   """
 
-  def __init__(self, code, details):
-    """Constructor.
+    def __init__(self, code, details):
+        """Constructor.
 
     Args:
       code: A code value to communicate to the other side of the operation
@@ -67,12 +66,12 @@
       details: A details value to communicate to the other side of the
         operation along with indication of operation termination. May be None.
     """
-    self.code = code
-    self.details = details
+        self.code = code
+        self.details = details
 
 
 class Outcome(object):
-  """The outcome of an operation.
+    """The outcome of an operation.
 
   Attributes:
     kind: A Kind value coarsely identifying how the operation terminated.
@@ -82,23 +81,23 @@
       provided.
   """
 
-  @enum.unique
-  class Kind(enum.Enum):
-    """Ways in which an operation can terminate."""
+    @enum.unique
+    class Kind(enum.Enum):
+        """Ways in which an operation can terminate."""
 
-    COMPLETED = 'completed'
-    CANCELLED = 'cancelled'
-    EXPIRED = 'expired'
-    LOCAL_SHUTDOWN = 'local shutdown'
-    REMOTE_SHUTDOWN = 'remote shutdown'
-    RECEPTION_FAILURE = 'reception failure'
-    TRANSMISSION_FAILURE = 'transmission failure'
-    LOCAL_FAILURE = 'local failure'
-    REMOTE_FAILURE = 'remote failure'
+        COMPLETED = 'completed'
+        CANCELLED = 'cancelled'
+        EXPIRED = 'expired'
+        LOCAL_SHUTDOWN = 'local shutdown'
+        REMOTE_SHUTDOWN = 'remote shutdown'
+        RECEPTION_FAILURE = 'reception failure'
+        TRANSMISSION_FAILURE = 'transmission failure'
+        LOCAL_FAILURE = 'local failure'
+        REMOTE_FAILURE = 'remote failure'
 
 
 class Completion(six.with_metaclass(abc.ABCMeta)):
-  """An aggregate of the values exchanged upon operation completion.
+    """An aggregate of the values exchanged upon operation completion.
 
   Attributes:
     terminal_metadata: A terminal metadata value for the operaton.
@@ -108,21 +107,21 @@
 
 
 class OperationContext(six.with_metaclass(abc.ABCMeta)):
-  """Provides operation-related information and action."""
+    """Provides operation-related information and action."""
 
-  @abc.abstractmethod
-  def outcome(self):
-    """Indicates the operation's outcome (or that the operation is ongoing).
+    @abc.abstractmethod
+    def outcome(self):
+        """Indicates the operation's outcome (or that the operation is ongoing).
 
     Returns:
       None if the operation is still active or the Outcome value for the
         operation if it has terminated.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def add_termination_callback(self, callback):
-    """Adds a function to be called upon operation termination.
+    @abc.abstractmethod
+    def add_termination_callback(self, callback):
+        """Adds a function to be called upon operation termination.
 
     Args:
       callback: A callable to be passed an Outcome value on operation
@@ -134,42 +133,44 @@
         terminated an Outcome value describing the operation termination and the
         passed callback will not be called as a result of this method call.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def time_remaining(self):
-    """Describes the length of allowed time remaining for the operation.
+    @abc.abstractmethod
+    def time_remaining(self):
+        """Describes the length of allowed time remaining for the operation.
 
     Returns:
       A nonnegative float indicating the length of allowed time in seconds
       remaining for the operation to complete before it is considered to have
       timed out. Zero is returned if the operation has terminated.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def cancel(self):
-    """Cancels the operation if the operation has not yet terminated."""
-    raise NotImplementedError()
+    @abc.abstractmethod
+    def cancel(self):
+        """Cancels the operation if the operation has not yet terminated."""
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def fail(self, exception):
-    """Indicates that the operation has failed.
+    @abc.abstractmethod
+    def fail(self, exception):
+        """Indicates that the operation has failed.
 
     Args:
       exception: An exception germane to the operation failure. May be None.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
 class Operator(six.with_metaclass(abc.ABCMeta)):
-  """An interface through which to participate in an operation."""
+    """An interface through which to participate in an operation."""
 
-  @abc.abstractmethod
-  def advance(
-      self, initial_metadata=None, payload=None, completion=None,
-      allowance=None):
-    """Progresses the operation.
+    @abc.abstractmethod
+    def advance(self,
+                initial_metadata=None,
+                payload=None,
+                completion=None,
+                allowance=None):
+        """Progresses the operation.
 
     Args:
       initial_metadata: An initial metadata value. Only one may ever be
@@ -181,23 +182,24 @@
       allowance: A positive integer communicating the number of additional
         payloads allowed to be passed by the remote side of the operation.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
+
 
 class ProtocolReceiver(six.with_metaclass(abc.ABCMeta)):
-  """A means of receiving protocol values during an operation."""
+    """A means of receiving protocol values during an operation."""
 
-  @abc.abstractmethod
-  def context(self, protocol_context):
-    """Accepts the protocol context object for the operation.
+    @abc.abstractmethod
+    def context(self, protocol_context):
+        """Accepts the protocol context object for the operation.
 
     Args:
       protocol_context: The protocol context object for the operation.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
 class Subscription(six.with_metaclass(abc.ABCMeta)):
-  """Describes customer code's interest in values from the other side.
+    """Describes customer code's interest in values from the other side.
 
   Attributes:
     kind: A Kind value describing the overall kind of this value.
@@ -215,20 +217,20 @@
       Kind.FULL.
   """
 
-  @enum.unique
-  class Kind(enum.Enum):
+    @enum.unique
+    class Kind(enum.Enum):
 
-    NONE = 'none'
-    TERMINATION_ONLY = 'termination only'
-    FULL = 'full'
+        NONE = 'none'
+        TERMINATION_ONLY = 'termination only'
+        FULL = 'full'
 
 
 class Servicer(six.with_metaclass(abc.ABCMeta)):
-  """Interface for service implementations."""
+    """Interface for service implementations."""
 
-  @abc.abstractmethod
-  def service(self, group, method, context, output_operator):
-    """Services an operation.
+    @abc.abstractmethod
+    def service(self, group, method, context, output_operator):
+        """Services an operation.
 
     Args:
       group: The group identifier of the operation to be serviced.
@@ -248,20 +250,20 @@
       abandonment.Abandoned: If the operation has been aborted and there no
         longer is any reason to service the operation.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
 class End(six.with_metaclass(abc.ABCMeta)):
-  """Common type for entry-point objects on both sides of an operation."""
+    """Common type for entry-point objects on both sides of an operation."""
 
-  @abc.abstractmethod
-  def start(self):
-    """Starts this object's service of operations."""
-    raise NotImplementedError()
+    @abc.abstractmethod
+    def start(self):
+        """Starts this object's service of operations."""
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def stop(self, grace):
-    """Stops this object's service of operations.
+    @abc.abstractmethod
+    def stop(self, grace):
+        """Stops this object's service of operations.
 
     This object will refuse service of new operations as soon as this method is
     called but operations under way at the time of the call may be given a
@@ -281,13 +283,19 @@
         much sooner (if for example this End had no operations in progress at
         the time its stop method was called).
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def operate(
-      self, group, method, subscription, timeout, initial_metadata=None,
-      payload=None, completion=None, protocol_options=None):
-    """Commences an operation.
+    @abc.abstractmethod
+    def operate(self,
+                group,
+                method,
+                subscription,
+                timeout,
+                initial_metadata=None,
+                payload=None,
+                completion=None,
+                protocol_options=None):
+        """Commences an operation.
 
     Args:
       group: The group identifier of the invoked operation.
@@ -312,23 +320,23 @@
         returned pair is an Operator to which operation values not passed in
         this call should later be passed.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def operation_stats(self):
-    """Reports the number of terminated operations broken down by outcome.
+    @abc.abstractmethod
+    def operation_stats(self):
+        """Reports the number of terminated operations broken down by outcome.
 
     Returns:
       A dictionary from Outcome.Kind value to an integer identifying the number
         of operations that terminated with that outcome kind.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def add_idle_action(self, action):
-    """Adds an action to be called when this End has no ongoing operations.
+    @abc.abstractmethod
+    def add_idle_action(self, action):
+        """Adds an action to be called when this End has no ongoing operations.
 
     Args:
       action: A callable that accepts no arguments.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
diff --git a/src/python/grpcio/grpc/framework/interfaces/base/utilities.py b/src/python/grpcio/grpc/framework/interfaces/base/utilities.py
index 87a8501..461706f 100644
--- a/src/python/grpcio/grpc/framework/interfaces/base/utilities.py
+++ b/src/python/grpcio/grpc/framework/interfaces/base/utilities.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Utilities for use with the base interface of RPC Framework."""
 
 import collections
@@ -34,27 +33,30 @@
 from grpc.framework.interfaces.base import base
 
 
-class _Completion(
-    base.Completion,
-    collections.namedtuple(
-        '_Completion', ('terminal_metadata', 'code', 'message',))):
-  """A trivial implementation of base.Completion."""
+class _Completion(base.Completion,
+                  collections.namedtuple('_Completion', (
+                      'terminal_metadata',
+                      'code',
+                      'message',))):
+    """A trivial implementation of base.Completion."""
 
 
-class _Subscription(
-    base.Subscription,
-    collections.namedtuple(
-        '_Subscription',
-        ('kind', 'termination_callback', 'allowance', 'operator',
-         'protocol_receiver',))):
-  """A trivial implementation of base.Subscription."""
+class _Subscription(base.Subscription,
+                    collections.namedtuple('_Subscription', (
+                        'kind',
+                        'termination_callback',
+                        'allowance',
+                        'operator',
+                        'protocol_receiver',))):
+    """A trivial implementation of base.Subscription."""
 
-_NONE_SUBSCRIPTION = _Subscription(
-    base.Subscription.Kind.NONE, None, None, None, None)
+
+_NONE_SUBSCRIPTION = _Subscription(base.Subscription.Kind.NONE, None, None,
+                                   None, None)
 
 
 def completion(terminal_metadata, code, message):
-  """Creates a base.Completion aggregating the given operation values.
+    """Creates a base.Completion aggregating the given operation values.
 
   Args:
     terminal_metadata: A terminal metadata value for an operaton.
@@ -64,11 +66,11 @@
   Returns:
     A base.Completion aggregating the given operation values.
   """
-  return _Completion(terminal_metadata, code, message)
+    return _Completion(terminal_metadata, code, message)
 
 
 def full_subscription(operator, protocol_receiver):
-  """Creates a "full" base.Subscription for the given base.Operator.
+    """Creates a "full" base.Subscription for the given base.Operator.
 
   Args:
     operator: A base.Operator to be used in an operation.
@@ -78,5 +80,5 @@
     A base.Subscription of kind base.Subscription.Kind.FULL wrapping the given
       base.Operator and base.ProtocolReceiver.
   """
-  return _Subscription(
-      base.Subscription.Kind.FULL, None, None, operator, protocol_receiver)
+    return _Subscription(base.Subscription.Kind.FULL, None, None, operator,
+                         protocol_receiver)
diff --git a/src/python/grpcio/grpc/framework/interfaces/face/__init__.py b/src/python/grpcio/grpc/framework/interfaces/face/__init__.py
index 7086519..b893988 100644
--- a/src/python/grpcio/grpc/framework/interfaces/face/__init__.py
+++ b/src/python/grpcio/grpc/framework/interfaces/face/__init__.py
@@ -26,5 +26,3 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
diff --git a/src/python/grpcio/grpc/framework/interfaces/face/face.py b/src/python/grpcio/grpc/framework/interfaces/face/face.py
index 4826e7f..36ddca1 100644
--- a/src/python/grpcio/grpc/framework/interfaces/face/face.py
+++ b/src/python/grpcio/grpc/framework/interfaces/face/face.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Interfaces defining the Face layer of RPC Framework."""
 
 import abc
@@ -45,33 +44,38 @@
 
 
 class NoSuchMethodError(Exception):
-  """Raised by customer code to indicate an unrecognized method.
+    """Raised by customer code to indicate an unrecognized method.
 
   Attributes:
     group: The group of the unrecognized method.
     name: The name of the unrecognized method.
   """
 
-  def __init__(self, group, method):
-    """Constructor.
+    def __init__(self, group, method):
+        """Constructor.
 
     Args:
       group: The group identifier of the unrecognized RPC name.
       method: The method identifier of the unrecognized RPC name.
     """
-    super(NoSuchMethodError, self).__init__()
-    self.group = group
-    self.method = method
+        super(NoSuchMethodError, self).__init__()
+        self.group = group
+        self.method = method
 
-  def __repr__(self):
-    return 'face.NoSuchMethodError(%s, %s)' % (self.group, self.method,)
+    def __repr__(self):
+        return 'face.NoSuchMethodError(%s, %s)' % (
+            self.group,
+            self.method,)
 
 
 class Abortion(
-    collections.namedtuple(
-        'Abortion',
-        ('kind', 'initial_metadata', 'terminal_metadata', 'code', 'details',))):
-  """A value describing RPC abortion.
+        collections.namedtuple('Abortion', (
+            'kind',
+            'initial_metadata',
+            'terminal_metadata',
+            'code',
+            'details',))):
+    """A value describing RPC abortion.
 
   Attributes:
     kind: A Kind value identifying how the RPC failed.
@@ -85,21 +89,21 @@
       details value was received.
   """
 
-  @enum.unique
-  class Kind(enum.Enum):
-    """Types of RPC abortion."""
+    @enum.unique
+    class Kind(enum.Enum):
+        """Types of RPC abortion."""
 
-    CANCELLED = 'cancelled'
-    EXPIRED = 'expired'
-    LOCAL_SHUTDOWN = 'local shutdown'
-    REMOTE_SHUTDOWN = 'remote shutdown'
-    NETWORK_FAILURE = 'network failure'
-    LOCAL_FAILURE = 'local failure'
-    REMOTE_FAILURE = 'remote failure'
+        CANCELLED = 'cancelled'
+        EXPIRED = 'expired'
+        LOCAL_SHUTDOWN = 'local shutdown'
+        REMOTE_SHUTDOWN = 'remote shutdown'
+        NETWORK_FAILURE = 'network failure'
+        LOCAL_FAILURE = 'local failure'
+        REMOTE_FAILURE = 'remote failure'
 
 
 class AbortionError(six.with_metaclass(abc.ABCMeta, Exception)):
-  """Common super type for exceptions indicating RPC abortion.
+    """Common super type for exceptions indicating RPC abortion.
 
     initial_metadata: The initial metadata from the other side of the RPC or
       None if no initial metadata value was received.
@@ -111,100 +115,100 @@
       details value was received.
   """
 
-  def __init__(self, initial_metadata, terminal_metadata, code, details):
-    super(AbortionError, self).__init__()
-    self.initial_metadata = initial_metadata
-    self.terminal_metadata = terminal_metadata
-    self.code = code
-    self.details = details
+    def __init__(self, initial_metadata, terminal_metadata, code, details):
+        super(AbortionError, self).__init__()
+        self.initial_metadata = initial_metadata
+        self.terminal_metadata = terminal_metadata
+        self.code = code
+        self.details = details
 
-  def __str__(self):
-    return '%s(code=%s, details="%s")' % (
-        self.__class__.__name__, self.code, self.details)
+    def __str__(self):
+        return '%s(code=%s, details="%s")' % (self.__class__.__name__,
+                                              self.code, self.details)
 
 
 class CancellationError(AbortionError):
-  """Indicates that an RPC has been cancelled."""
+    """Indicates that an RPC has been cancelled."""
 
 
 class ExpirationError(AbortionError):
-  """Indicates that an RPC has expired ("timed out")."""
+    """Indicates that an RPC has expired ("timed out")."""
 
 
 class LocalShutdownError(AbortionError):
-  """Indicates that an RPC has terminated due to local shutdown of RPCs."""
+    """Indicates that an RPC has terminated due to local shutdown of RPCs."""
 
 
 class RemoteShutdownError(AbortionError):
-  """Indicates that an RPC has terminated due to remote shutdown of RPCs."""
+    """Indicates that an RPC has terminated due to remote shutdown of RPCs."""
 
 
 class NetworkError(AbortionError):
-  """Indicates that some error occurred on the network."""
+    """Indicates that some error occurred on the network."""
 
 
 class LocalError(AbortionError):
-  """Indicates that an RPC has terminated due to a local defect."""
+    """Indicates that an RPC has terminated due to a local defect."""
 
 
 class RemoteError(AbortionError):
-  """Indicates that an RPC has terminated due to a remote defect."""
+    """Indicates that an RPC has terminated due to a remote defect."""
 
 
 class RpcContext(six.with_metaclass(abc.ABCMeta)):
-  """Provides RPC-related information and action."""
+    """Provides RPC-related information and action."""
 
-  @abc.abstractmethod
-  def is_active(self):
-    """Describes whether the RPC is active or has terminated."""
-    raise NotImplementedError()
+    @abc.abstractmethod
+    def is_active(self):
+        """Describes whether the RPC is active or has terminated."""
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def time_remaining(self):
-    """Describes the length of allowed time remaining for the RPC.
+    @abc.abstractmethod
+    def time_remaining(self):
+        """Describes the length of allowed time remaining for the RPC.
 
     Returns:
       A nonnegative float indicating the length of allowed time in seconds
       remaining for the RPC to complete before it is considered to have timed
       out.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def add_abortion_callback(self, abortion_callback):
-    """Registers a callback to be called if the RPC is aborted.
+    @abc.abstractmethod
+    def add_abortion_callback(self, abortion_callback):
+        """Registers a callback to be called if the RPC is aborted.
 
     Args:
       abortion_callback: A callable to be called and passed an Abortion value
         in the event of RPC abortion.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def cancel(self):
-    """Cancels the RPC.
+    @abc.abstractmethod
+    def cancel(self):
+        """Cancels the RPC.
 
     Idempotent and has no effect if the RPC has already terminated.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def protocol_context(self):
-    """Accesses a custom object specified by an implementation provider.
+    @abc.abstractmethod
+    def protocol_context(self):
+        """Accesses a custom object specified by an implementation provider.
 
     Returns:
       A value specified by the provider of a Face interface implementation
         affording custom state and behavior.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
 class Call(six.with_metaclass(abc.ABCMeta, RpcContext)):
-  """Invocation-side utility object for an RPC."""
+    """Invocation-side utility object for an RPC."""
 
-  @abc.abstractmethod
-  def initial_metadata(self):
-    """Accesses the initial metadata from the service-side of the RPC.
+    @abc.abstractmethod
+    def initial_metadata(self):
+        """Accesses the initial metadata from the service-side of the RPC.
 
     This method blocks until the value is available or is known not to have been
     emitted from the service-side of the RPC.
@@ -213,11 +217,11 @@
       The initial metadata object emitted by the service-side of the RPC, or
         None if there was no such value.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def terminal_metadata(self):
-    """Accesses the terminal metadata from the service-side of the RPC.
+    @abc.abstractmethod
+    def terminal_metadata(self):
+        """Accesses the terminal metadata from the service-side of the RPC.
 
     This method blocks until the value is available or is known not to have been
     emitted from the service-side of the RPC.
@@ -226,11 +230,11 @@
       The terminal metadata object emitted by the service-side of the RPC, or
         None if there was no such value.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def code(self):
-    """Accesses the code emitted by the service-side of the RPC.
+    @abc.abstractmethod
+    def code(self):
+        """Accesses the code emitted by the service-side of the RPC.
 
     This method blocks until the value is available or is known not to have been
     emitted from the service-side of the RPC.
@@ -239,11 +243,11 @@
       The code object emitted by the service-side of the RPC, or None if there
         was no such value.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def details(self):
-    """Accesses the details value emitted by the service-side of the RPC.
+    @abc.abstractmethod
+    def details(self):
+        """Accesses the details value emitted by the service-side of the RPC.
 
     This method blocks until the value is available or is known not to have been
     emitted from the service-side of the RPC.
@@ -252,15 +256,15 @@
       The details value emitted by the service-side of the RPC, or None if there
         was no such value.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
 class ServicerContext(six.with_metaclass(abc.ABCMeta, RpcContext)):
-  """A context object passed to method implementations."""
+    """A context object passed to method implementations."""
 
-  @abc.abstractmethod
-  def invocation_metadata(self):
-    """Accesses the metadata from the invocation-side of the RPC.
+    @abc.abstractmethod
+    def invocation_metadata(self):
+        """Accesses the metadata from the invocation-side of the RPC.
 
     This method blocks until the value is available or is known not to have been
     emitted from the invocation-side of the RPC.
@@ -269,11 +273,11 @@
       The metadata object emitted by the invocation-side of the RPC, or None if
         there was no such value.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def initial_metadata(self, initial_metadata):
-    """Accepts the service-side initial metadata value of the RPC.
+    @abc.abstractmethod
+    def initial_metadata(self, initial_metadata):
+        """Accepts the service-side initial metadata value of the RPC.
 
     This method need not be called by method implementations if they have no
     service-side initial metadata to transmit.
@@ -282,11 +286,11 @@
       initial_metadata: The service-side initial metadata value of the RPC to
         be transmitted to the invocation side of the RPC.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def terminal_metadata(self, terminal_metadata):
-    """Accepts the service-side terminal metadata value of the RPC.
+    @abc.abstractmethod
+    def terminal_metadata(self, terminal_metadata):
+        """Accepts the service-side terminal metadata value of the RPC.
 
     This method need not be called by method implementations if they have no
     service-side terminal metadata to transmit.
@@ -295,11 +299,11 @@
       terminal_metadata: The service-side terminal metadata value of the RPC to
         be transmitted to the invocation side of the RPC.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def code(self, code):
-    """Accepts the service-side code of the RPC.
+    @abc.abstractmethod
+    def code(self, code):
+        """Accepts the service-side code of the RPC.
 
     This method need not be called by method implementations if they have no
     code to transmit.
@@ -308,11 +312,11 @@
       code: The code of the RPC to be transmitted to the invocation side of the
         RPC.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def details(self, details):
-    """Accepts the service-side details of the RPC.
+    @abc.abstractmethod
+    def details(self, details):
+        """Accepts the service-side details of the RPC.
 
     This method need not be called by method implementations if they have no
     service-side details to transmit.
@@ -321,34 +325,34 @@
       details: The service-side details value of the RPC to be transmitted to
         the invocation side of the RPC.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
 class ResponseReceiver(six.with_metaclass(abc.ABCMeta)):
-  """Invocation-side object used to accept the output of an RPC."""
+    """Invocation-side object used to accept the output of an RPC."""
 
-  @abc.abstractmethod
-  def initial_metadata(self, initial_metadata):
-    """Receives the initial metadata from the service-side of the RPC.
+    @abc.abstractmethod
+    def initial_metadata(self, initial_metadata):
+        """Receives the initial metadata from the service-side of the RPC.
 
     Args:
       initial_metadata: The initial metadata object emitted from the
         service-side of the RPC.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def response(self, response):
-    """Receives a response from the service-side of the RPC.
+    @abc.abstractmethod
+    def response(self, response):
+        """Receives a response from the service-side of the RPC.
 
     Args:
       response: A response object emitted from the service-side of the RPC.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def complete(self, terminal_metadata, code, details):
-    """Receives the completion values emitted from the service-side of the RPC.
+    @abc.abstractmethod
+    def complete(self, terminal_metadata, code, details):
+        """Receives the completion values emitted from the service-side of the RPC.
 
     Args:
       terminal_metadata: The terminal metadata object emitted from the
@@ -356,17 +360,20 @@
       code: The code object emitted from the service-side of the RPC.
       details: The details object emitted from the service-side of the RPC.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
 class UnaryUnaryMultiCallable(six.with_metaclass(abc.ABCMeta)):
-  """Affords invoking a unary-unary RPC in any call style."""
+    """Affords invoking a unary-unary RPC in any call style."""
 
-  @abc.abstractmethod
-  def __call__(
-      self, request, timeout, metadata=None, with_call=False,
-      protocol_options=None):
-    """Synchronously invokes the underlying RPC.
+    @abc.abstractmethod
+    def __call__(self,
+                 request,
+                 timeout,
+                 metadata=None,
+                 with_call=False,
+                 protocol_options=None):
+        """Synchronously invokes the underlying RPC.
 
     Args:
       request: The request value for the RPC.
@@ -385,11 +392,11 @@
     Raises:
       AbortionError: Indicating that the RPC was aborted.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def future(self, request, timeout, metadata=None, protocol_options=None):
-    """Asynchronously invokes the underlying RPC.
+    @abc.abstractmethod
+    def future(self, request, timeout, metadata=None, protocol_options=None):
+        """Asynchronously invokes the underlying RPC.
 
     Args:
       request: The request value for the RPC.
@@ -405,13 +412,17 @@
         response value of the RPC. In the event of RPC abortion, the returned
         Future's exception value will be an AbortionError.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def event(
-      self, request, receiver, abortion_callback, timeout,
-      metadata=None, protocol_options=None):
-    """Asynchronously invokes the underlying RPC.
+    @abc.abstractmethod
+    def event(self,
+              request,
+              receiver,
+              abortion_callback,
+              timeout,
+              metadata=None,
+              protocol_options=None):
+        """Asynchronously invokes the underlying RPC.
 
     Args:
       request: The request value for the RPC.
@@ -427,15 +438,15 @@
     Returns:
       A Call for the RPC.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
 class UnaryStreamMultiCallable(six.with_metaclass(abc.ABCMeta)):
-  """Affords invoking a unary-stream RPC in any call style."""
+    """Affords invoking a unary-stream RPC in any call style."""
 
-  @abc.abstractmethod
-  def __call__(self, request, timeout, metadata=None, protocol_options=None):
-    """Invokes the underlying RPC.
+    @abc.abstractmethod
+    def __call__(self, request, timeout, metadata=None, protocol_options=None):
+        """Invokes the underlying RPC.
 
     Args:
       request: The request value for the RPC.
@@ -450,13 +461,17 @@
         values. Drawing response values from the returned iterator may raise
         AbortionError indicating abortion of the RPC.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def event(
-      self, request, receiver, abortion_callback, timeout,
-      metadata=None, protocol_options=None):
-    """Asynchronously invokes the underlying RPC.
+    @abc.abstractmethod
+    def event(self,
+              request,
+              receiver,
+              abortion_callback,
+              timeout,
+              metadata=None,
+              protocol_options=None):
+        """Asynchronously invokes the underlying RPC.
 
     Args:
       request: The request value for the RPC.
@@ -472,17 +487,20 @@
     Returns:
       A Call object for the RPC.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
 class StreamUnaryMultiCallable(six.with_metaclass(abc.ABCMeta)):
-  """Affords invoking a stream-unary RPC in any call style."""
+    """Affords invoking a stream-unary RPC in any call style."""
 
-  @abc.abstractmethod
-  def __call__(
-      self, request_iterator, timeout, metadata=None,
-      with_call=False, protocol_options=None):
-    """Synchronously invokes the underlying RPC.
+    @abc.abstractmethod
+    def __call__(self,
+                 request_iterator,
+                 timeout,
+                 metadata=None,
+                 with_call=False,
+                 protocol_options=None):
+        """Synchronously invokes the underlying RPC.
 
     Args:
       request_iterator: An iterator that yields request values for the RPC.
@@ -501,12 +519,15 @@
     Raises:
       AbortionError: Indicating that the RPC was aborted.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def future(
-      self, request_iterator, timeout, metadata=None, protocol_options=None):
-    """Asynchronously invokes the underlying RPC.
+    @abc.abstractmethod
+    def future(self,
+               request_iterator,
+               timeout,
+               metadata=None,
+               protocol_options=None):
+        """Asynchronously invokes the underlying RPC.
 
     Args:
       request_iterator: An iterator that yields request values for the RPC.
@@ -522,13 +543,16 @@
         response value of the RPC. In the event of RPC abortion, the returned
         Future's exception value will be an AbortionError.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def event(
-      self, receiver, abortion_callback, timeout, metadata=None,
-      protocol_options=None):
-    """Asynchronously invokes the underlying RPC.
+    @abc.abstractmethod
+    def event(self,
+              receiver,
+              abortion_callback,
+              timeout,
+              metadata=None,
+              protocol_options=None):
+        """Asynchronously invokes the underlying RPC.
 
     Args:
       receiver: A ResponseReceiver to be passed the response data of the RPC.
@@ -544,16 +568,19 @@
       A single object that is both a Call object for the RPC and a
         stream.Consumer to which the request values of the RPC should be passed.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
 class StreamStreamMultiCallable(six.with_metaclass(abc.ABCMeta)):
-  """Affords invoking a stream-stream RPC in any call style."""
+    """Affords invoking a stream-stream RPC in any call style."""
 
-  @abc.abstractmethod
-  def __call__(
-      self, request_iterator, timeout, metadata=None, protocol_options=None):
-    """Invokes the underlying RPC.
+    @abc.abstractmethod
+    def __call__(self,
+                 request_iterator,
+                 timeout,
+                 metadata=None,
+                 protocol_options=None):
+        """Invokes the underlying RPC.
 
     Args:
       request_iterator: An iterator that yields request values for the RPC.
@@ -568,13 +595,16 @@
         values. Drawing response values from the returned iterator may raise
         AbortionError indicating abortion of the RPC.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def event(
-      self, receiver, abortion_callback, timeout, metadata=None,
-      protocol_options=None):
-    """Asynchronously invokes the underlying RPC.
+    @abc.abstractmethod
+    def event(self,
+              receiver,
+              abortion_callback,
+              timeout,
+              metadata=None,
+              protocol_options=None):
+        """Asynchronously invokes the underlying RPC.
 
     Args:
       receiver: A ResponseReceiver to be passed the response data of the RPC.
@@ -590,11 +620,11 @@
       A single object that is both a Call object for the RPC and a
         stream.Consumer to which the request values of the RPC should be passed.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
 class MethodImplementation(six.with_metaclass(abc.ABCMeta)):
-  """A sum type that describes a method implementation.
+    """A sum type that describes a method implementation.
 
   Attributes:
     cardinality: A cardinality.Cardinality value.
@@ -639,11 +669,11 @@
 
 
 class MultiMethodImplementation(six.with_metaclass(abc.ABCMeta)):
-  """A general type able to service many methods."""
+    """A general type able to service many methods."""
 
-  @abc.abstractmethod
-  def service(self, group, method, response_consumer, context):
-    """Services an RPC.
+    @abc.abstractmethod
+    def service(self, group, method, response_consumer, context):
+        """Services an RPC.
 
     Args:
       group: The group identifier of the RPC.
@@ -666,17 +696,22 @@
       NoSuchMethodError: If this MultiMethod does not recognize the given group
         and name for the RPC and is not able to service the RPC.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
 class GenericStub(six.with_metaclass(abc.ABCMeta)):
-  """Affords RPC invocation via generic methods."""
+    """Affords RPC invocation via generic methods."""
 
-  @abc.abstractmethod
-  def blocking_unary_unary(
-      self, group, method, request, timeout, metadata=None,
-      with_call=False, protocol_options=None):
-    """Invokes a unary-request-unary-response method.
+    @abc.abstractmethod
+    def blocking_unary_unary(self,
+                             group,
+                             method,
+                             request,
+                             timeout,
+                             metadata=None,
+                             with_call=False,
+                             protocol_options=None):
+        """Invokes a unary-request-unary-response method.
 
     This method blocks until either returning the response value of the RPC
     (in the event of RPC completion) or raising an exception (in the event of
@@ -700,13 +735,17 @@
     Raises:
       AbortionError: Indicating that the RPC was aborted.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def future_unary_unary(
-      self, group, method, request, timeout, metadata=None,
-      protocol_options=None):
-    """Invokes a unary-request-unary-response method.
+    @abc.abstractmethod
+    def future_unary_unary(self,
+                           group,
+                           method,
+                           request,
+                           timeout,
+                           metadata=None,
+                           protocol_options=None):
+        """Invokes a unary-request-unary-response method.
 
     Args:
       group: The group identifier of the RPC.
@@ -723,13 +762,17 @@
         response value of the RPC. In the event of RPC abortion, the returned
         Future's exception value will be an AbortionError.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def inline_unary_stream(
-      self, group, method, request, timeout, metadata=None,
-      protocol_options=None):
-    """Invokes a unary-request-stream-response method.
+    @abc.abstractmethod
+    def inline_unary_stream(self,
+                            group,
+                            method,
+                            request,
+                            timeout,
+                            metadata=None,
+                            protocol_options=None):
+        """Invokes a unary-request-stream-response method.
 
     Args:
       group: The group identifier of the RPC.
@@ -745,13 +788,18 @@
         values. Drawing response values from the returned iterator may raise
         AbortionError indicating abortion of the RPC.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def blocking_stream_unary(
-      self, group, method, request_iterator, timeout, metadata=None,
-      with_call=False, protocol_options=None):
-    """Invokes a stream-request-unary-response method.
+    @abc.abstractmethod
+    def blocking_stream_unary(self,
+                              group,
+                              method,
+                              request_iterator,
+                              timeout,
+                              metadata=None,
+                              with_call=False,
+                              protocol_options=None):
+        """Invokes a stream-request-unary-response method.
 
     This method blocks until either returning the response value of the RPC
     (in the event of RPC completion) or raising an exception (in the event of
@@ -775,13 +823,17 @@
     Raises:
       AbortionError: Indicating that the RPC was aborted.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def future_stream_unary(
-      self, group, method, request_iterator, timeout, metadata=None,
-      protocol_options=None):
-    """Invokes a stream-request-unary-response method.
+    @abc.abstractmethod
+    def future_stream_unary(self,
+                            group,
+                            method,
+                            request_iterator,
+                            timeout,
+                            metadata=None,
+                            protocol_options=None):
+        """Invokes a stream-request-unary-response method.
 
     Args:
       group: The group identifier of the RPC.
@@ -798,13 +850,17 @@
         response value of the RPC. In the event of RPC abortion, the returned
         Future's exception value will be an AbortionError.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def inline_stream_stream(
-      self, group, method, request_iterator, timeout, metadata=None,
-      protocol_options=None):
-    """Invokes a stream-request-stream-response method.
+    @abc.abstractmethod
+    def inline_stream_stream(self,
+                             group,
+                             method,
+                             request_iterator,
+                             timeout,
+                             metadata=None,
+                             protocol_options=None):
+        """Invokes a stream-request-stream-response method.
 
     Args:
       group: The group identifier of the RPC.
@@ -820,13 +876,19 @@
         values. Drawing response values from the returned iterator may raise
         AbortionError indicating abortion of the RPC.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def event_unary_unary(
-      self, group, method, request, receiver, abortion_callback, timeout,
-      metadata=None, protocol_options=None):
-    """Event-driven invocation of a unary-request-unary-response method.
+    @abc.abstractmethod
+    def event_unary_unary(self,
+                          group,
+                          method,
+                          request,
+                          receiver,
+                          abortion_callback,
+                          timeout,
+                          metadata=None,
+                          protocol_options=None):
+        """Event-driven invocation of a unary-request-unary-response method.
 
     Args:
       group: The group identifier of the RPC.
@@ -843,13 +905,19 @@
     Returns:
       A Call for the RPC.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def event_unary_stream(
-      self, group, method, request, receiver, abortion_callback, timeout,
-      metadata=None, protocol_options=None):
-    """Event-driven invocation of a unary-request-stream-response method.
+    @abc.abstractmethod
+    def event_unary_stream(self,
+                           group,
+                           method,
+                           request,
+                           receiver,
+                           abortion_callback,
+                           timeout,
+                           metadata=None,
+                           protocol_options=None):
+        """Event-driven invocation of a unary-request-stream-response method.
 
     Args:
       group: The group identifier of the RPC.
@@ -866,13 +934,18 @@
     Returns:
       A Call for the RPC.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def event_stream_unary(
-      self, group, method, receiver, abortion_callback, timeout,
-      metadata=None, protocol_options=None):
-    """Event-driven invocation of a unary-request-unary-response method.
+    @abc.abstractmethod
+    def event_stream_unary(self,
+                           group,
+                           method,
+                           receiver,
+                           abortion_callback,
+                           timeout,
+                           metadata=None,
+                           protocol_options=None):
+        """Event-driven invocation of a unary-request-unary-response method.
 
     Args:
       group: The group identifier of the RPC.
@@ -889,13 +962,18 @@
       A pair of a Call object for the RPC and a stream.Consumer to which the
         request values of the RPC should be passed.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def event_stream_stream(
-      self, group, method, receiver, abortion_callback, timeout,
-      metadata=None, protocol_options=None):
-    """Event-driven invocation of a unary-request-stream-response method.
+    @abc.abstractmethod
+    def event_stream_stream(self,
+                            group,
+                            method,
+                            receiver,
+                            abortion_callback,
+                            timeout,
+                            metadata=None,
+                            protocol_options=None):
+        """Event-driven invocation of a unary-request-stream-response method.
 
     Args:
       group: The group identifier of the RPC.
@@ -912,11 +990,11 @@
       A pair of a Call object for the RPC and a stream.Consumer to which the
         request values of the RPC should be passed.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def unary_unary(self, group, method):
-    """Creates a UnaryUnaryMultiCallable for a unary-unary method.
+    @abc.abstractmethod
+    def unary_unary(self, group, method):
+        """Creates a UnaryUnaryMultiCallable for a unary-unary method.
 
     Args:
       group: The group identifier of the RPC.
@@ -925,11 +1003,11 @@
     Returns:
       A UnaryUnaryMultiCallable value for the named unary-unary method.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def unary_stream(self, group, method):
-    """Creates a UnaryStreamMultiCallable for a unary-stream method.
+    @abc.abstractmethod
+    def unary_stream(self, group, method):
+        """Creates a UnaryStreamMultiCallable for a unary-stream method.
 
     Args:
       group: The group identifier of the RPC.
@@ -938,11 +1016,11 @@
     Returns:
       A UnaryStreamMultiCallable value for the name unary-stream method.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def stream_unary(self, group, method):
-    """Creates a StreamUnaryMultiCallable for a stream-unary method.
+    @abc.abstractmethod
+    def stream_unary(self, group, method):
+        """Creates a StreamUnaryMultiCallable for a stream-unary method.
 
     Args:
       group: The group identifier of the RPC.
@@ -951,11 +1029,11 @@
     Returns:
       A StreamUnaryMultiCallable value for the named stream-unary method.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def stream_stream(self, group, method):
-    """Creates a StreamStreamMultiCallable for a stream-stream method.
+    @abc.abstractmethod
+    def stream_stream(self, group, method):
+        """Creates a StreamStreamMultiCallable for a stream-stream method.
 
     Args:
       group: The group identifier of the RPC.
@@ -964,11 +1042,11 @@
     Returns:
       A StreamStreamMultiCallable value for the named stream-stream method.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
 class DynamicStub(six.with_metaclass(abc.ABCMeta)):
-  """Affords RPC invocation via attributes corresponding to afforded methods.
+    """Affords RPC invocation via attributes corresponding to afforded methods.
 
   Instances of this type may be scoped to a single group so that attribute
   access is unambiguous.
diff --git a/src/python/grpcio/grpc/framework/interfaces/face/utilities.py b/src/python/grpcio/grpc/framework/interfaces/face/utilities.py
index db2ec6e..39a642f 100644
--- a/src/python/grpcio/grpc/framework/interfaces/face/utilities.py
+++ b/src/python/grpcio/grpc/framework/interfaces/face/utilities.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Utilities for RPC Framework's Face interface."""
 
 import collections
@@ -38,18 +37,24 @@
 from grpc.framework.interfaces.face import face
 
 
-class _MethodImplementation(
-    face.MethodImplementation,
-    collections.namedtuple(
-        '_MethodImplementation',
-        ['cardinality', 'style', 'unary_unary_inline', 'unary_stream_inline',
-         'stream_unary_inline', 'stream_stream_inline', 'unary_unary_event',
-         'unary_stream_event', 'stream_unary_event', 'stream_stream_event',])):
-  pass
+class _MethodImplementation(face.MethodImplementation,
+                            collections.namedtuple('_MethodImplementation', [
+                                'cardinality',
+                                'style',
+                                'unary_unary_inline',
+                                'unary_stream_inline',
+                                'stream_unary_inline',
+                                'stream_stream_inline',
+                                'unary_unary_event',
+                                'unary_stream_event',
+                                'stream_unary_event',
+                                'stream_stream_event',
+                            ])):
+    pass
 
 
 def unary_unary_inline(behavior):
-  """Creates an face.MethodImplementation for the given behavior.
+    """Creates an face.MethodImplementation for the given behavior.
 
   Args:
     behavior: The implementation of a unary-unary RPC method as a callable value
@@ -59,13 +64,13 @@
   Returns:
     An face.MethodImplementation derived from the given behavior.
   """
-  return _MethodImplementation(
-      cardinality.Cardinality.UNARY_UNARY, style.Service.INLINE, behavior,
-      None, None, None, None, None, None, None)
+    return _MethodImplementation(cardinality.Cardinality.UNARY_UNARY,
+                                 style.Service.INLINE, behavior, None, None,
+                                 None, None, None, None, None)
 
 
 def unary_stream_inline(behavior):
-  """Creates an face.MethodImplementation for the given behavior.
+    """Creates an face.MethodImplementation for the given behavior.
 
   Args:
     behavior: The implementation of a unary-stream RPC method as a callable
@@ -75,13 +80,13 @@
   Returns:
     An face.MethodImplementation derived from the given behavior.
   """
-  return _MethodImplementation(
-      cardinality.Cardinality.UNARY_STREAM, style.Service.INLINE, None,
-      behavior, None, None, None, None, None, None)
+    return _MethodImplementation(cardinality.Cardinality.UNARY_STREAM,
+                                 style.Service.INLINE, None, behavior, None,
+                                 None, None, None, None, None)
 
 
 def stream_unary_inline(behavior):
-  """Creates an face.MethodImplementation for the given behavior.
+    """Creates an face.MethodImplementation for the given behavior.
 
   Args:
     behavior: The implementation of a stream-unary RPC method as a callable
@@ -91,13 +96,13 @@
   Returns:
     An face.MethodImplementation derived from the given behavior.
   """
-  return _MethodImplementation(
-      cardinality.Cardinality.STREAM_UNARY, style.Service.INLINE, None, None,
-      behavior, None, None, None, None, None)
+    return _MethodImplementation(cardinality.Cardinality.STREAM_UNARY,
+                                 style.Service.INLINE, None, None, behavior,
+                                 None, None, None, None, None)
 
 
 def stream_stream_inline(behavior):
-  """Creates an face.MethodImplementation for the given behavior.
+    """Creates an face.MethodImplementation for the given behavior.
 
   Args:
     behavior: The implementation of a stream-stream RPC method as a callable
@@ -107,13 +112,13 @@
   Returns:
     An face.MethodImplementation derived from the given behavior.
   """
-  return _MethodImplementation(
-      cardinality.Cardinality.STREAM_STREAM, style.Service.INLINE, None, None,
-      None, behavior, None, None, None, None)
+    return _MethodImplementation(cardinality.Cardinality.STREAM_STREAM,
+                                 style.Service.INLINE, None, None, None,
+                                 behavior, None, None, None, None)
 
 
 def unary_unary_event(behavior):
-  """Creates an face.MethodImplementation for the given behavior.
+    """Creates an face.MethodImplementation for the given behavior.
 
   Args:
     behavior: The implementation of a unary-unary RPC method as a callable
@@ -123,13 +128,13 @@
   Returns:
     An face.MethodImplementation derived from the given behavior.
   """
-  return _MethodImplementation(
-      cardinality.Cardinality.UNARY_UNARY, style.Service.EVENT, None, None,
-      None, None, behavior, None, None, None)
+    return _MethodImplementation(cardinality.Cardinality.UNARY_UNARY,
+                                 style.Service.EVENT, None, None, None, None,
+                                 behavior, None, None, None)
 
 
 def unary_stream_event(behavior):
-  """Creates an face.MethodImplementation for the given behavior.
+    """Creates an face.MethodImplementation for the given behavior.
 
   Args:
     behavior: The implementation of a unary-stream RPC method as a callable
@@ -139,13 +144,13 @@
   Returns:
     An face.MethodImplementation derived from the given behavior.
   """
-  return _MethodImplementation(
-      cardinality.Cardinality.UNARY_STREAM, style.Service.EVENT, None, None,
-      None, None, None, behavior, None, None)
+    return _MethodImplementation(cardinality.Cardinality.UNARY_STREAM,
+                                 style.Service.EVENT, None, None, None, None,
+                                 None, behavior, None, None)
 
 
 def stream_unary_event(behavior):
-  """Creates an face.MethodImplementation for the given behavior.
+    """Creates an face.MethodImplementation for the given behavior.
 
   Args:
     behavior: The implementation of a stream-unary RPC method as a callable
@@ -156,13 +161,13 @@
   Returns:
     An face.MethodImplementation derived from the given behavior.
   """
-  return _MethodImplementation(
-      cardinality.Cardinality.STREAM_UNARY, style.Service.EVENT, None, None,
-      None, None, None, None, behavior, None)
+    return _MethodImplementation(cardinality.Cardinality.STREAM_UNARY,
+                                 style.Service.EVENT, None, None, None, None,
+                                 None, None, behavior, None)
 
 
 def stream_stream_event(behavior):
-  """Creates an face.MethodImplementation for the given behavior.
+    """Creates an face.MethodImplementation for the given behavior.
 
   Args:
     behavior: The implementation of a stream-stream RPC method as a callable
@@ -173,6 +178,6 @@
   Returns:
     An face.MethodImplementation derived from the given behavior.
   """
-  return _MethodImplementation(
-      cardinality.Cardinality.STREAM_STREAM, style.Service.EVENT, None, None,
-      None, None, None, None, None, behavior)
+    return _MethodImplementation(cardinality.Cardinality.STREAM_STREAM,
+                                 style.Service.EVENT, None, None, None, None,
+                                 None, None, None, behavior)
diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py
index e8f5bf9..9d470e1 100644
--- a/src/python/grpcio/grpc_core_dependencies.py
+++ b/src/python/grpcio/grpc_core_dependencies.py
@@ -248,6 +248,7 @@
   'src/core/ext/client_channel/connector.c',
   'src/core/ext/client_channel/default_initial_connect_string.c',
   'src/core/ext/client_channel/http_connect_handshaker.c',
+  'src/core/ext/client_channel/http_proxy.c',
   'src/core/ext/client_channel/initial_connect_string.c',
   'src/core/ext/client_channel/lb_policy.c',
   'src/core/ext/client_channel/lb_policy_factory.c',
@@ -298,7 +299,6 @@
   '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_bytes.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',
@@ -317,18 +317,14 @@
   '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/bio_asn1.c',
-  'third_party/boringssl/crypto/asn1/bio_ndef.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/t_pkey.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_prn.c',
   'third_party/boringssl/crypto/asn1/tasn_typ.c',
   'third_party/boringssl/crypto/asn1/tasn_utl.c',
   'third_party/boringssl/crypto/asn1/x_bignum.c',
@@ -358,6 +354,7 @@
   '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',
@@ -369,8 +366,7 @@
   '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_generic.c',
-  'third_party/boringssl/crypto/chacha/chacha_vec.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',
@@ -385,10 +381,14 @@
   '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',
@@ -397,8 +397,6 @@
   '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/directory_posix.c',
-  'third_party/boringssl/crypto/directory_win.c',
   'third_party/boringssl/crypto/dsa/dsa.c',
   'third_party/boringssl/crypto/dsa/dsa_asn1.c',
   'third_party/boringssl/crypto/ec/ec.c',
@@ -417,7 +415,6 @@
   '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/algorithm.c',
   'third_party/boringssl/crypto/evp/digestsign.c',
   'third_party/boringssl/crypto/evp/evp.c',
   'third_party/boringssl/crypto/evp/evp_asn1.c',
@@ -428,6 +425,7 @@
   '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',
@@ -441,6 +439,12 @@
   '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/newhope/error_correction.c',
+  'third_party/boringssl/crypto/newhope/newhope.c',
+  'third_party/boringssl/crypto/newhope/ntt.c',
+  'third_party/boringssl/crypto/newhope/poly.c',
+  'third_party/boringssl/crypto/newhope/precomp.c',
+  'third_party/boringssl/crypto/newhope/reduce.c',
   'third_party/boringssl/crypto/obj/obj.c',
   'third_party/boringssl/crypto/obj/obj_xref.c',
   'third_party/boringssl/crypto/pem/pem_all.c',
@@ -458,6 +462,7 @@
   '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/rand/deterministic.c',
   'third_party/boringssl/crypto/rand/rand.c',
   'third_party/boringssl/crypto/rand/urandom.c',
   'third_party/boringssl/crypto/rand/windows.c',
@@ -482,11 +487,13 @@
   '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',
@@ -561,21 +568,17 @@
   'third_party/boringssl/crypto/x509v3/v3_utl.c',
   'third_party/boringssl/ssl/custom_extensions.c',
   'third_party/boringssl/ssl/d1_both.c',
-  'third_party/boringssl/ssl/d1_clnt.c',
   'third_party/boringssl/ssl/d1_lib.c',
-  'third_party/boringssl/ssl/d1_meth.c',
   'third_party/boringssl/ssl/d1_pkt.c',
   'third_party/boringssl/ssl/d1_srtp.c',
-  'third_party/boringssl/ssl/d1_srvr.c',
+  'third_party/boringssl/ssl/dtls_method.c',
   'third_party/boringssl/ssl/dtls_record.c',
-  'third_party/boringssl/ssl/pqueue/pqueue.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_clnt.c',
   'third_party/boringssl/ssl/s3_enc.c',
   'third_party/boringssl/ssl/s3_lib.c',
-  'third_party/boringssl/ssl/s3_meth.c',
   'third_party/boringssl/ssl/s3_pkt.c',
-  'third_party/boringssl/ssl/s3_srvr.c',
   'third_party/boringssl/ssl/ssl_aead_ctx.c',
   'third_party/boringssl/ssl/ssl_asn1.c',
   'third_party/boringssl/ssl/ssl_buffer.c',
@@ -589,6 +592,11 @@
   'third_party/boringssl/ssl/ssl_stat.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',
   'third_party/zlib/adler32.c',
   'third_party/zlib/compress.c',
diff --git a/src/python/grpcio/support.py b/src/python/grpcio/support.py
index b226e69..a228ba4 100644
--- a/src/python/grpcio/support.py
+++ b/src/python/grpcio/support.py
@@ -27,7 +27,6 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-
 import os
 import os.path
 import shutil
@@ -38,7 +37,6 @@
 
 import commands
 
-
 C_PYTHON_DEV = """
 #include <Python.h>
 int main(int argc, char **argv) { return 0; }
@@ -55,69 +53,70 @@
     (check your environment variables or try re-installing?)
 """
 
-C_CHECKS = {
-  C_PYTHON_DEV: C_PYTHON_DEV_ERROR_MESSAGE,
-}
+C_CHECKS = {C_PYTHON_DEV: C_PYTHON_DEV_ERROR_MESSAGE,}
+
 
 def _compile(compiler, source_string):
-  tempdir = tempfile.mkdtemp()
-  cpath = os.path.join(tempdir, 'a.c')
-  with open(cpath, 'w') as cfile:
-    cfile.write(source_string)
-  try:
-    compiler.compile([cpath])
-  except errors.CompileError as error:
-    return error
-  finally:
-    shutil.rmtree(tempdir)
+    tempdir = tempfile.mkdtemp()
+    cpath = os.path.join(tempdir, 'a.c')
+    with open(cpath, 'w') as cfile:
+        cfile.write(source_string)
+    try:
+        compiler.compile([cpath])
+    except errors.CompileError as error:
+        return error
+    finally:
+        shutil.rmtree(tempdir)
+
 
 def _expect_compile(compiler, source_string, error_message):
-  if _compile(compiler, source_string) is not None:
-    sys.stderr.write(error_message)
-    raise commands.CommandError(
-        "Diagnostics found a compilation environment issue:\n{}"
+    if _compile(compiler, source_string) is not None:
+        sys.stderr.write(error_message)
+        raise commands.CommandError(
+            "Diagnostics found a compilation environment issue:\n{}"
             .format(error_message))
 
+
 def diagnose_compile_error(build_ext, error):
-  """Attempt to diagnose an error during compilation."""
-  for c_check, message in C_CHECKS.items():
-    _expect_compile(build_ext.compiler, c_check, message)
-  python_sources = [
-      source for source in build_ext.get_source_files()
-      if source.startswith('./src/python') and source.endswith('c')
-  ]
-  for source in python_sources:
-    if not os.path.isfile(source):
-      raise commands.CommandError(
-          ("Diagnostics found a missing Python extension source file:\n{}\n\n"
-           "This is usually because the Cython sources haven't been transpiled "
-           "into C yet and you're building from source.\n"
-           "Try setting the environment variable "
-           "`GRPC_PYTHON_BUILD_WITH_CYTHON=1` when invoking `setup.py` or "
-           "when using `pip`, e.g.:\n\n"
-           "pip install -rrequirements.txt\n"
-           "GRPC_PYTHON_BUILD_WITH_CYTHON=1 pip install .")
-            .format(source)
-          )
+    """Attempt to diagnose an error during compilation."""
+    for c_check, message in C_CHECKS.items():
+        _expect_compile(build_ext.compiler, c_check, message)
+    python_sources = [
+        source for source in build_ext.get_source_files()
+        if source.startswith('./src/python') and source.endswith('c')
+    ]
+    for source in python_sources:
+        if not os.path.isfile(source):
+            raise commands.CommandError((
+                "Diagnostics found a missing Python extension source file:\n{}\n\n"
+                "This is usually because the Cython sources haven't been transpiled "
+                "into C yet and you're building from source.\n"
+                "Try setting the environment variable "
+                "`GRPC_PYTHON_BUILD_WITH_CYTHON=1` when invoking `setup.py` or "
+                "when using `pip`, e.g.:\n\n"
+                "pip install -rrequirements.txt\n"
+                "GRPC_PYTHON_BUILD_WITH_CYTHON=1 pip install .").format(source))
+
 
 def diagnose_attribute_error(build_ext, error):
-  if any('_needs_stub' in arg for arg in error.args):
-    raise commands.CommandError(
-        "We expect a missing `_needs_stub` attribute from older versions of "
-        "setuptools. Consider upgrading setuptools.")
+    if any('_needs_stub' in arg for arg in error.args):
+        raise commands.CommandError(
+            "We expect a missing `_needs_stub` attribute from older versions of "
+            "setuptools. Consider upgrading setuptools.")
+
 
 _ERROR_DIAGNOSES = {
     errors.CompileError: diagnose_compile_error,
     AttributeError: diagnose_attribute_error
 }
 
-def diagnose_build_ext_error(build_ext, error, formatted):
-  diagnostic = _ERROR_DIAGNOSES.get(type(error))
-  if diagnostic is None:
-    raise commands.CommandError(
-        "\n\nWe could not diagnose your build failure. Please file an issue at "
-        "http://www.github.com/grpc/grpc with `[Python install]` in the title."
-        "\n\n{}".format(formatted))
-  else:
-    diagnostic(build_ext, error)
 
+def diagnose_build_ext_error(build_ext, error, formatted):
+    diagnostic = _ERROR_DIAGNOSES.get(type(error))
+    if diagnostic is None:
+        raise commands.CommandError(
+            "\n\nWe could not diagnose your build failure. Please file an issue at "
+            "http://www.github.com/grpc/grpc with `[Python install]` in the title."
+            "\n\n{}".format(formatted))
+    else:
+        diagnostic(build_ext, error)
diff --git a/src/python/grpcio_health_checking/grpc_health/__init__.py b/src/python/grpcio_health_checking/grpc_health/__init__.py
index 7086519..b893988 100644
--- a/src/python/grpcio_health_checking/grpc_health/__init__.py
+++ b/src/python/grpcio_health_checking/grpc_health/__init__.py
@@ -26,5 +26,3 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
diff --git a/src/python/grpcio_health_checking/grpc_health/v1/__init__.py b/src/python/grpcio_health_checking/grpc_health/v1/__init__.py
index 7086519..b893988 100644
--- a/src/python/grpcio_health_checking/grpc_health/v1/__init__.py
+++ b/src/python/grpcio_health_checking/grpc_health/v1/__init__.py
@@ -26,5 +26,3 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
diff --git a/src/python/grpcio_health_checking/grpc_health/v1/health.py b/src/python/grpcio_health_checking/grpc_health/v1/health.py
index 0df679b..f0f11cf 100644
--- a/src/python/grpcio_health_checking/grpc_health/v1/health.py
+++ b/src/python/grpcio_health_checking/grpc_health/v1/health.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Reference implementation for health checking in gRPC Python."""
 
 import threading
@@ -37,23 +36,23 @@
 
 
 class HealthServicer(health_pb2.HealthServicer):
-  """Servicer handling RPCs for service statuses."""
+    """Servicer handling RPCs for service statuses."""
 
-  def __init__(self):
-    self._server_status_lock = threading.Lock()
-    self._server_status = {}
+    def __init__(self):
+        self._server_status_lock = threading.Lock()
+        self._server_status = {}
 
-  def Check(self, request, context):
-    with self._server_status_lock:
-      status = self._server_status.get(request.service)
-      if status is None:
-        context.set_code(grpc.StatusCode.NOT_FOUND)
-        return health_pb2.HealthCheckResponse()
-      else:
-        return health_pb2.HealthCheckResponse(status=status)
+    def Check(self, request, context):
+        with self._server_status_lock:
+            status = self._server_status.get(request.service)
+            if status is None:
+                context.set_code(grpc.StatusCode.NOT_FOUND)
+                return health_pb2.HealthCheckResponse()
+            else:
+                return health_pb2.HealthCheckResponse(status=status)
 
-  def set(self, service, status):
-    """Sets the status of a service.
+    def set(self, service, status):
+        """Sets the status of a service.
 
     Args:
         service: string, the name of the service.
@@ -61,5 +60,5 @@
         status: HealthCheckResponse.status enum value indicating
             the status of the service
     """
-    with self._server_status_lock:
-      self._server_status[service] = status
+        with self._server_status_lock:
+            self._server_status[service] = status
diff --git a/src/python/grpcio_health_checking/health_commands.py b/src/python/grpcio_health_checking/health_commands.py
index 0c420a6..14375a7 100644
--- a/src/python/grpcio_health_checking/health_commands.py
+++ b/src/python/grpcio_health_checking/health_commands.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Provides distutils command classes for the GRPC Python setup process."""
 
 import os
@@ -39,40 +38,40 @@
 
 
 class CopyProtoModules(setuptools.Command):
-  """Command to copy proto modules from grpc/src/proto."""
+    """Command to copy proto modules from grpc/src/proto."""
 
-  description = ''
-  user_options = []
+    description = ''
+    user_options = []
 
-  def initialize_options(self):
-    pass
+    def initialize_options(self):
+        pass
 
-  def finalize_options(self):
-    pass
+    def finalize_options(self):
+        pass
 
-  def run(self):
-    if os.path.isfile(HEALTH_PROTO):
-      shutil.copyfile(
-          HEALTH_PROTO,
-          os.path.join(ROOT_DIR, 'grpc_health/v1/health.proto'))
+    def run(self):
+        if os.path.isfile(HEALTH_PROTO):
+            shutil.copyfile(
+                HEALTH_PROTO,
+                os.path.join(ROOT_DIR, 'grpc_health/v1/health.proto'))
 
 
 class BuildPackageProtos(setuptools.Command):
-  """Command to generate project *_pb2.py modules from proto files."""
+    """Command to generate project *_pb2.py modules from proto files."""
 
-  description = 'build grpc protobuf modules'
-  user_options = []
+    description = 'build grpc protobuf modules'
+    user_options = []
 
-  def initialize_options(self):
-    pass
+    def initialize_options(self):
+        pass
 
-  def finalize_options(self):
-    pass
+    def finalize_options(self):
+        pass
 
-  def run(self):
-    # due to limitations of the proto generator, we require that only *one*
-    # directory is provided as an 'include' directory. We assume it's the '' key
-    # to `self.distribution.package_dir` (and get a key error if it's not
-    # there).
-    from grpc_tools import command
-    command.build_package_protos(self.distribution.package_dir[''])
+    def run(self):
+        # due to limitations of the proto generator, we require that only *one*
+        # directory is provided as an 'include' directory. We assume it's the '' key
+        # to `self.distribution.package_dir` (and get a key error if it's not
+        # there).
+        from grpc_tools import command
+        command.build_package_protos(self.distribution.package_dir[''])
diff --git a/src/python/grpcio_health_checking/setup.py b/src/python/grpcio_health_checking/setup.py
index e88f389..4c3991d 100644
--- a/src/python/grpcio_health_checking/setup.py
+++ b/src/python/grpcio_health_checking/setup.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Setup module for the GRPC Python package's optional health checking."""
 
 import os
@@ -41,18 +40,14 @@
 import health_commands
 import grpc_version
 
-PACKAGE_DIRECTORIES = {
-    '': '.',
-}
+PACKAGE_DIRECTORIES = {'': '.',}
 
 SETUP_REQUIRES = (
-    'grpcio-tools>={version}'.format(version=grpc_version.VERSION),
-)
+    'grpcio-tools>={version}'.format(version=grpc_version.VERSION),)
 
 INSTALL_REQUIRES = (
     'protobuf>=3.0.0',
-    'grpcio>={version}'.format(version=grpc_version.VERSION),
-)
+    'grpcio>={version}'.format(version=grpc_version.VERSION),)
 
 COMMAND_CLASS = {
     # Run preprocess from the repository *before* doing any packaging!
@@ -68,5 +63,4 @@
     packages=setuptools.find_packages('.'),
     install_requires=INSTALL_REQUIRES,
     setup_requires=SETUP_REQUIRES,
-    cmdclass=COMMAND_CLASS
-)
+    cmdclass=COMMAND_CLASS)
diff --git a/src/python/grpcio_reflection/grpc_reflection/__init__.py b/src/python/grpcio_reflection/grpc_reflection/__init__.py
index d5ad73a..100a624 100644
--- a/src/python/grpcio_reflection/grpc_reflection/__init__.py
+++ b/src/python/grpcio_reflection/grpc_reflection/__init__.py
@@ -26,4 +26,3 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
diff --git a/src/python/grpcio_reflection/grpc_reflection/v1alpha/__init__.py b/src/python/grpcio_reflection/grpc_reflection/v1alpha/__init__.py
index d5ad73a..100a624 100644
--- a/src/python/grpcio_reflection/grpc_reflection/v1alpha/__init__.py
+++ b/src/python/grpcio_reflection/grpc_reflection/v1alpha/__init__.py
@@ -26,4 +26,3 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
diff --git a/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py b/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py
index bfcbce8..87f2839 100644
--- a/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py
+++ b/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Reference implementation for reflection in gRPC Python."""
 
 import threading
@@ -39,105 +38,96 @@
 
 _POOL = descriptor_pool.Default()
 
+
 def _not_found_error():
-  return reflection_pb2.ServerReflectionResponse(
-      error_response=reflection_pb2.ErrorResponse(
-          error_code=grpc.StatusCode.NOT_FOUND.value[0],
-          error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(),
-      )
-  )
+    return reflection_pb2.ServerReflectionResponse(
+        error_response=reflection_pb2.ErrorResponse(
+            error_code=grpc.StatusCode.NOT_FOUND.value[0],
+            error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(),))
+
 
 def _file_descriptor_response(descriptor):
-  proto = descriptor_pb2.FileDescriptorProto()
-  descriptor.CopyToProto(proto)
-  serialized_proto = proto.SerializeToString()
-  return reflection_pb2.ServerReflectionResponse(
-      file_descriptor_response=reflection_pb2.FileDescriptorResponse(
-        file_descriptor_proto=(serialized_proto,)
-      ),
-  )
+    proto = descriptor_pb2.FileDescriptorProto()
+    descriptor.CopyToProto(proto)
+    serialized_proto = proto.SerializeToString()
+    return reflection_pb2.ServerReflectionResponse(
+        file_descriptor_response=reflection_pb2.FileDescriptorResponse(
+            file_descriptor_proto=(serialized_proto,)),)
 
 
 class ReflectionServicer(reflection_pb2.ServerReflectionServicer):
-  """Servicer handling RPCs for service statuses."""
+    """Servicer handling RPCs for service statuses."""
 
-  def __init__(self, service_names, pool=None):
-    """Constructor.
+    def __init__(self, service_names, pool=None):
+        """Constructor.
 
     Args:
       service_names: Iterable of fully-qualified service names available.
     """
-    self._service_names = list(service_names)
-    self._pool = _POOL if pool is None else pool
+        self._service_names = list(service_names)
+        self._pool = _POOL if pool is None else pool
 
-  def _file_by_filename(self, filename):
-    try:
-      descriptor = self._pool.FindFileByName(filename)
-    except KeyError:
-      return _not_found_error()
-    else:
-      return _file_descriptor_response(descriptor)
+    def _file_by_filename(self, filename):
+        try:
+            descriptor = self._pool.FindFileByName(filename)
+        except KeyError:
+            return _not_found_error()
+        else:
+            return _file_descriptor_response(descriptor)
 
-  def _file_containing_symbol(self, fully_qualified_name):
-    try:
-      descriptor = self._pool.FindFileContainingSymbol(fully_qualified_name)
-    except KeyError:
-      return _not_found_error()
-    else:
-      return _file_descriptor_response(descriptor)
+    def _file_containing_symbol(self, fully_qualified_name):
+        try:
+            descriptor = self._pool.FindFileContainingSymbol(
+                fully_qualified_name)
+        except KeyError:
+            return _not_found_error()
+        else:
+            return _file_descriptor_response(descriptor)
 
-  def _file_containing_extension(containing_type, extension_number):
-    # TODO(atash) Python protobuf currently doesn't support querying extensions.
-    # https://github.com/google/protobuf/issues/2248
-    return reflection_pb2.ServerReflectionResponse(
-        error_response=reflection_pb2.ErrorResponse(
-            error_code=grpc.StatusCode.UNIMPLEMENTED.value[0],
-            error_message=grpc.StatusCode.UNIMPLMENTED.value[1].encode(),
-        )
-    )
+    def _file_containing_extension(containing_type, extension_number):
+        # TODO(atash) Python protobuf currently doesn't support querying extensions.
+        # https://github.com/google/protobuf/issues/2248
+        return reflection_pb2.ServerReflectionResponse(
+            error_response=reflection_pb2.ErrorResponse(
+                error_code=grpc.StatusCode.UNIMPLEMENTED.value[0],
+                error_message=grpc.StatusCode.UNIMPLMENTED.value[1].encode(),))
 
-  def _extension_numbers_of_type(fully_qualified_name):
-    # TODO(atash) We're allowed to leave this unsupported according to the
-    # protocol, but we should still eventually implement it. Hits the same issue
-    # as `_file_containing_extension`, however.
-    # https://github.com/google/protobuf/issues/2248
-    return reflection_pb2.ServerReflectionResponse(
-        error_response=reflection_pb2.ErrorResponse(
-            error_code=grpc.StatusCode.UNIMPLEMENTED.value[0],
-            error_message=grpc.StatusCode.UNIMPLMENTED.value[1].encode(),
-        )
-    )
+    def _extension_numbers_of_type(fully_qualified_name):
+        # TODO(atash) We're allowed to leave this unsupported according to the
+        # protocol, but we should still eventually implement it. Hits the same issue
+        # as `_file_containing_extension`, however.
+        # https://github.com/google/protobuf/issues/2248
+        return reflection_pb2.ServerReflectionResponse(
+            error_response=reflection_pb2.ErrorResponse(
+                error_code=grpc.StatusCode.UNIMPLEMENTED.value[0],
+                error_message=grpc.StatusCode.UNIMPLMENTED.value[1].encode(),))
 
-  def _list_services(self):
-    return reflection_pb2.ServerReflectionResponse(
-        list_services_response=reflection_pb2.ListServiceResponse(
-            service=[
+    def _list_services(self):
+        return reflection_pb2.ServerReflectionResponse(
+            list_services_response=reflection_pb2.ListServiceResponse(service=[
                 reflection_pb2.ServiceResponse(name=service_name)
                 for service_name in self._service_names
-            ]
-        )
-    )
+            ]))
 
-  def ServerReflectionInfo(self, request_iterator, context):
-    for request in request_iterator:
-      if request.HasField('file_by_filename'):
-        yield self._file_by_filename(request.file_by_filename)
-      elif request.HasField('file_containing_symbol'):
-        yield self._file_containing_symbol(request.file_containing_symbol)
-      elif request.HasField('file_containing_extension'):
-        yield self._file_containing_extension(
-            request.file_containing_extension.containing_type,
-            request.file_containing_extension.extension_number)
-      elif request.HasField('all_extension_numbers_of_type'):
-        yield _all_extension_numbers_of_type(
-            request.all_extension_numbers_of_type)
-      elif request.HasField('list_services'):
-        yield self._list_services()
-      else:
-        yield reflection_pb2.ServerReflectionResponse(
-            error_response=reflection_pb2.ErrorResponse(
-                error_code=grpc.StatusCode.INVALID_ARGUMENT.value[0],
-                error_message=grpc.StatusCode.INVALID_ARGUMENT.value[1].encode(),
-            )
-        )
-
+    def ServerReflectionInfo(self, request_iterator, context):
+        for request in request_iterator:
+            if request.HasField('file_by_filename'):
+                yield self._file_by_filename(request.file_by_filename)
+            elif request.HasField('file_containing_symbol'):
+                yield self._file_containing_symbol(
+                    request.file_containing_symbol)
+            elif request.HasField('file_containing_extension'):
+                yield self._file_containing_extension(
+                    request.file_containing_extension.containing_type,
+                    request.file_containing_extension.extension_number)
+            elif request.HasField('all_extension_numbers_of_type'):
+                yield _all_extension_numbers_of_type(
+                    request.all_extension_numbers_of_type)
+            elif request.HasField('list_services'):
+                yield self._list_services()
+            else:
+                yield reflection_pb2.ServerReflectionResponse(
+                    error_response=reflection_pb2.ErrorResponse(
+                        error_code=grpc.StatusCode.INVALID_ARGUMENT.value[0],
+                        error_message=grpc.StatusCode.INVALID_ARGUMENT.value[1]
+                        .encode(),))
diff --git a/src/python/grpcio_reflection/reflection_commands.py b/src/python/grpcio_reflection/reflection_commands.py
index dee5491..62237e0 100644
--- a/src/python/grpcio_reflection/reflection_commands.py
+++ b/src/python/grpcio_reflection/reflection_commands.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Provides distutils command classes for the GRPC Python setup process."""
 
 import os
@@ -35,44 +34,46 @@
 import setuptools
 
 ROOT_DIR = os.path.abspath(os.path.dirname(os.path.abspath(__file__)))
-HEALTH_PROTO = os.path.join(ROOT_DIR, '../../proto/grpc/reflection/v1alpha/reflection.proto')
+HEALTH_PROTO = os.path.join(
+    ROOT_DIR, '../../proto/grpc/reflection/v1alpha/reflection.proto')
 
 
 class CopyProtoModules(setuptools.Command):
-  """Command to copy proto modules from grpc/src/proto."""
+    """Command to copy proto modules from grpc/src/proto."""
 
-  description = ''
-  user_options = []
+    description = ''
+    user_options = []
 
-  def initialize_options(self):
-    pass
+    def initialize_options(self):
+        pass
 
-  def finalize_options(self):
-    pass
+    def finalize_options(self):
+        pass
 
-  def run(self):
-    if os.path.isfile(HEALTH_PROTO):
-      shutil.copyfile(
-          HEALTH_PROTO,
-          os.path.join(ROOT_DIR, 'grpc_reflection/v1alpha/reflection.proto'))
+    def run(self):
+        if os.path.isfile(HEALTH_PROTO):
+            shutil.copyfile(
+                HEALTH_PROTO,
+                os.path.join(ROOT_DIR,
+                             'grpc_reflection/v1alpha/reflection.proto'))
 
 
 class BuildPackageProtos(setuptools.Command):
-  """Command to generate project *_pb2.py modules from proto files."""
+    """Command to generate project *_pb2.py modules from proto files."""
 
-  description = 'build grpc protobuf modules'
-  user_options = []
+    description = 'build grpc protobuf modules'
+    user_options = []
 
-  def initialize_options(self):
-    pass
+    def initialize_options(self):
+        pass
 
-  def finalize_options(self):
-    pass
+    def finalize_options(self):
+        pass
 
-  def run(self):
-    # due to limitations of the proto generator, we require that only *one*
-    # directory is provided as an 'include' directory. We assume it's the '' key
-    # to `self.distribution.package_dir` (and get a key error if it's not
-    # there).
-    from grpc_tools import command
-    command.build_package_protos(self.distribution.package_dir[''])
+    def run(self):
+        # due to limitations of the proto generator, we require that only *one*
+        # directory is provided as an 'include' directory. We assume it's the '' key
+        # to `self.distribution.package_dir` (and get a key error if it's not
+        # there).
+        from grpc_tools import command
+        command.build_package_protos(self.distribution.package_dir[''])
diff --git a/src/python/grpcio_reflection/setup.py b/src/python/grpcio_reflection/setup.py
index cfc41f4..2926923 100644
--- a/src/python/grpcio_reflection/setup.py
+++ b/src/python/grpcio_reflection/setup.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Setup module for the GRPC Python package's optional reflection."""
 
 import os
@@ -41,18 +40,14 @@
 import reflection_commands
 import grpc_version
 
-PACKAGE_DIRECTORIES = {
-    '': '.',
-}
+PACKAGE_DIRECTORIES = {'': '.',}
 
 SETUP_REQUIRES = (
-    'grpcio-tools>={version}'.format(version=grpc_version.VERSION),
-)
+    'grpcio-tools>={version}'.format(version=grpc_version.VERSION),)
 
 INSTALL_REQUIRES = (
     'protobuf>=3.0.0',
-    'grpcio>={version}'.format(version=grpc_version.VERSION),
-)
+    'grpcio>={version}'.format(version=grpc_version.VERSION),)
 
 COMMAND_CLASS = {
     # Run preprocess from the repository *before* doing any packaging!
@@ -68,5 +63,4 @@
     packages=setuptools.find_packages('.'),
     install_requires=INSTALL_REQUIRES,
     setup_requires=SETUP_REQUIRES,
-    cmdclass=COMMAND_CLASS
-)
+    cmdclass=COMMAND_CLASS)
diff --git a/src/python/grpcio_tests/commands.py b/src/python/grpcio_tests/commands.py
index e822971..af0ffe3 100644
--- a/src/python/grpcio_tests/commands.py
+++ b/src/python/grpcio_tests/commands.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Provides distutils command classes for the gRPC Python setup process."""
 
 import distutils
@@ -55,163 +54,162 @@
 
 
 class CommandError(object):
-  pass
+    pass
 
 
 class GatherProto(setuptools.Command):
 
-  description = 'gather proto dependencies'
-  user_options = []
+    description = 'gather proto dependencies'
+    user_options = []
 
-  def initialize_options(self):
-    pass
+    def initialize_options(self):
+        pass
 
-  def finalize_options(self):
-    pass
+    def finalize_options(self):
+        pass
 
-  def run(self):
-    # TODO(atash) ensure that we're running from the repository directory when
-    # this command is used
-    try:
-      shutil.rmtree(PROTO_STEM)
-    except Exception as error:
-      # We don't care if this command fails
-      pass
-    shutil.copytree(GRPC_PROTO_STEM, PROTO_STEM)
-    for root, _, _ in os.walk(PYTHON_PROTO_TOP_LEVEL):
-      path = os.path.join(root, '__init__.py')
-      open(path, 'a').close()
+    def run(self):
+        # TODO(atash) ensure that we're running from the repository directory when
+        # this command is used
+        try:
+            shutil.rmtree(PROTO_STEM)
+        except Exception as error:
+            # We don't care if this command fails
+            pass
+        shutil.copytree(GRPC_PROTO_STEM, PROTO_STEM)
+        for root, _, _ in os.walk(PYTHON_PROTO_TOP_LEVEL):
+            path = os.path.join(root, '__init__.py')
+            open(path, 'a').close()
 
 
 class BuildProtoModules(setuptools.Command):
-  """Command to generate project *_pb2.py modules from proto files."""
+    """Command to generate project *_pb2.py modules from proto files."""
 
-  description = 'build protobuf modules'
-  user_options = [
-    ('include=', None, 'path patterns to include in protobuf generation'),
-    ('exclude=', None, 'path patterns to exclude from protobuf generation')
-  ]
+    description = 'build protobuf modules'
+    user_options = [
+        ('include=', None, 'path patterns to include in protobuf generation'),
+        ('exclude=', None, 'path patterns to exclude from protobuf generation')
+    ]
 
-  def initialize_options(self):
-    self.exclude = None
-    self.include = r'.*\.proto$'
+    def initialize_options(self):
+        self.exclude = None
+        self.include = r'.*\.proto$'
 
-  def finalize_options(self):
-    pass
+    def finalize_options(self):
+        pass
 
-  def run(self):
-    import grpc_tools.protoc as protoc
+    def run(self):
+        import grpc_tools.protoc as protoc
 
-    include_regex = re.compile(self.include)
-    exclude_regex = re.compile(self.exclude) if self.exclude else None
-    paths = []
-    for walk_root, directories, filenames in os.walk(PROTO_STEM):
-      for filename in filenames:
-        path = os.path.join(walk_root, filename)
-        if include_regex.match(path) and not (
-            exclude_regex and exclude_regex.match(path)):
-          paths.append(path)
+        include_regex = re.compile(self.include)
+        exclude_regex = re.compile(self.exclude) if self.exclude else None
+        paths = []
+        for walk_root, directories, filenames in os.walk(PROTO_STEM):
+            for filename in filenames:
+                path = os.path.join(walk_root, filename)
+                if include_regex.match(path) and not (
+                        exclude_regex and exclude_regex.match(path)):
+                    paths.append(path)
 
-    # TODO(kpayson): It would be nice to do this in a batch command,
-    # but we currently have name conflicts in src/proto
-    for path in paths:
-      command = [
-          'grpc_tools.protoc',
-          '-I {}'.format(PROTO_STEM),
-          '--python_out={}'.format(PROTO_STEM),
-          '--grpc_python_out={}'.format(PROTO_STEM),
-      ] + [path]
-      if protoc.main(command) != 0:
-        sys.stderr.write(
-            'warning: Command:\n{}\nFailed'.format(
-                command))
+        # TODO(kpayson): It would be nice to do this in a batch command,
+        # but we currently have name conflicts in src/proto
+        for path in paths:
+            command = [
+                'grpc_tools.protoc',
+                '-I {}'.format(PROTO_STEM),
+                '--python_out={}'.format(PROTO_STEM),
+                '--grpc_python_out={}'.format(PROTO_STEM),
+            ] + [path]
+            if protoc.main(command) != 0:
+                sys.stderr.write(
+                    'warning: Command:\n{}\nFailed'.format(command))
 
-    # Generated proto directories dont include __init__.py, but
-    # these are needed for python package resolution
-    for walk_root, _, _ in os.walk(PROTO_STEM):
-      path = os.path.join(walk_root, '__init__.py')
-      open(path, 'a').close()
+        # Generated proto directories dont include __init__.py, but
+        # these are needed for python package resolution
+        for walk_root, _, _ in os.walk(PROTO_STEM):
+            path = os.path.join(walk_root, '__init__.py')
+            open(path, 'a').close()
 
 
 class BuildPy(build_py.build_py):
-  """Custom project build command."""
+    """Custom project build command."""
 
-  def run(self):
-    try:
-      self.run_command('build_package_protos')
-    except CommandError as error:
-      sys.stderr.write('warning: %s\n' % error.message)
-    build_py.build_py.run(self)
+    def run(self):
+        try:
+            self.run_command('build_package_protos')
+        except CommandError as error:
+            sys.stderr.write('warning: %s\n' % error.message)
+        build_py.build_py.run(self)
 
 
 class TestLite(setuptools.Command):
-  """Command to run tests without fetching or building anything."""
+    """Command to run tests without fetching or building anything."""
 
-  description = 'run tests without fetching or building anything.'
-  user_options = []
+    description = 'run tests without fetching or building anything.'
+    user_options = []
 
-  def initialize_options(self):
-    pass
+    def initialize_options(self):
+        pass
 
-  def finalize_options(self):
-    # distutils requires this override.
-    pass
+    def finalize_options(self):
+        # distutils requires this override.
+        pass
 
-  def run(self):
-    self._add_eggs_to_path()
+    def run(self):
+        self._add_eggs_to_path()
 
-    import tests
-    loader = tests.Loader()
-    loader.loadTestsFromNames(['tests'])
-    runner = tests.Runner()
-    result = runner.run(loader.suite)
-    if not result.wasSuccessful():
-      sys.exit('Test failure')
+        import tests
+        loader = tests.Loader()
+        loader.loadTestsFromNames(['tests'])
+        runner = tests.Runner()
+        result = runner.run(loader.suite)
+        if not result.wasSuccessful():
+            sys.exit('Test failure')
 
-  def _add_eggs_to_path(self):
-    """Fetch install and test requirements"""
-    self.distribution.fetch_build_eggs(self.distribution.install_requires)
-    self.distribution.fetch_build_eggs(self.distribution.tests_require)
+    def _add_eggs_to_path(self):
+        """Fetch install and test requirements"""
+        self.distribution.fetch_build_eggs(self.distribution.install_requires)
+        self.distribution.fetch_build_eggs(self.distribution.tests_require)
 
 
 class RunInterop(test.test):
 
-  description = 'run interop test client/server'
-  user_options = [
-    ('args=', 'a', 'pass-thru arguments for the client/server'),
-    ('client', 'c', 'flag indicating to run the client'),
-    ('server', 's', 'flag indicating to run the server')
-  ]
+    description = 'run interop test client/server'
+    user_options = [('args=', 'a', 'pass-thru arguments for the client/server'),
+                    ('client', 'c', 'flag indicating to run the client'),
+                    ('server', 's', 'flag indicating to run the server')]
 
-  def initialize_options(self):
-    self.args = ''
-    self.client = False
-    self.server = False
+    def initialize_options(self):
+        self.args = ''
+        self.client = False
+        self.server = False
 
-  def finalize_options(self):
-    if self.client and self.server:
-      raise DistutilsOptionError('you may only specify one of client or server')
+    def finalize_options(self):
+        if self.client and self.server:
+            raise DistutilsOptionError(
+                'you may only specify one of client or server')
 
-  def run(self):
-    if self.distribution.install_requires:
-      self.distribution.fetch_build_eggs(self.distribution.install_requires)
-    if self.distribution.tests_require:
-      self.distribution.fetch_build_eggs(self.distribution.tests_require)
-    if self.client:
-      self.run_client()
-    elif self.server:
-      self.run_server()
+    def run(self):
+        if self.distribution.install_requires:
+            self.distribution.fetch_build_eggs(
+                self.distribution.install_requires)
+        if self.distribution.tests_require:
+            self.distribution.fetch_build_eggs(self.distribution.tests_require)
+        if self.client:
+            self.run_client()
+        elif self.server:
+            self.run_server()
 
-  def run_server(self):
-    # We import here to ensure that our setuptools parent has had a chance to
-    # edit the Python system path.
-    from tests.interop import server
-    sys.argv[1:] = self.args.split()
-    server.serve()
+    def run_server(self):
+        # We import here to ensure that our setuptools parent has had a chance to
+        # edit the Python system path.
+        from tests.interop import server
+        sys.argv[1:] = self.args.split()
+        server.serve()
 
-  def run_client(self):
-    # We import here to ensure that our setuptools parent has had a chance to
-    # edit the Python system path.
-    from tests.interop import client
-    sys.argv[1:] = self.args.split()
-    client.test_interoperability()
+    def run_client(self):
+        # We import here to ensure that our setuptools parent has had a chance to
+        # edit the Python system path.
+        from tests.interop import client
+        sys.argv[1:] = self.args.split()
+        client.test_interoperability()
diff --git a/src/python/grpcio_tests/setup.py b/src/python/grpcio_tests/setup.py
index 375fbd6..f0407d1 100644
--- a/src/python/grpcio_tests/setup.py
+++ b/src/python/grpcio_tests/setup.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """A setup module for the gRPC Python package."""
 
 import os
@@ -48,9 +47,7 @@
 
 LICENSE = '3-clause BSD'
 
-PACKAGE_DIRECTORIES = {
-    '': '.',
-}
+PACKAGE_DIRECTORIES = {'': '.',}
 
 INSTALL_REQUIRES = (
     'coverage>=4.0',
@@ -61,13 +58,11 @@
     'grpcio-health-checking>={version}'.format(version=grpc_version.VERSION),
     'oauth2client>=1.4.7',
     'protobuf>=3.0.0',
-    'six>=1.10',
-)
+    'six>=1.10',)
 
 COMMAND_CLASS = {
     # Run `preprocess` *before* doing any packaging!
     'preprocess': commands.GatherProto,
-
     'build_package_protos': grpc_tools.command.BuildPackageProtos,
     'build_py': commands.BuildPy,
     'run_interop': commands.RunInterop,
@@ -80,9 +75,7 @@
         'credentials/server1.key',
         'credentials/server1.pem',
     ],
-    'tests.protoc_plugin.protos.invocation_testing': [
-        'same.proto',
-    ],
+    'tests.protoc_plugin.protos.invocation_testing': ['same.proto',],
     'tests.protoc_plugin.protos.invocation_testing.split_messages': [
         'messages.proto',
     ],
@@ -94,9 +87,7 @@
         'credentials/server1.key',
         'credentials/server1.pem',
     ],
-    'tests': [
-        'tests.json'
-    ],
+    'tests': ['tests.json'],
 }
 
 TEST_SUITE = 'tests'
@@ -107,16 +98,15 @@
 PACKAGES = setuptools.find_packages('.')
 
 setuptools.setup(
-  name='grpcio-tests',
-  version=grpc_version.VERSION,
-  license=LICENSE,
-  packages=list(PACKAGES),
-  package_dir=PACKAGE_DIRECTORIES,
-  package_data=PACKAGE_DATA,
-  install_requires=INSTALL_REQUIRES,
-  cmdclass=COMMAND_CLASS,
-  tests_require=TESTS_REQUIRE,
-  test_suite=TEST_SUITE,
-  test_loader=TEST_LOADER,
-  test_runner=TEST_RUNNER,
-)
+    name='grpcio-tests',
+    version=grpc_version.VERSION,
+    license=LICENSE,
+    packages=list(PACKAGES),
+    package_dir=PACKAGE_DIRECTORIES,
+    package_data=PACKAGE_DATA,
+    install_requires=INSTALL_REQUIRES,
+    cmdclass=COMMAND_CLASS,
+    tests_require=TESTS_REQUIRE,
+    test_suite=TEST_SUITE,
+    test_loader=TEST_LOADER,
+    test_runner=TEST_RUNNER,)
diff --git a/src/python/grpcio_tests/tests/_loader.py b/src/python/grpcio_tests/tests/_loader.py
index 621bedc..165bc53 100644
--- a/src/python/grpcio_tests/tests/_loader.py
+++ b/src/python/grpcio_tests/tests/_loader.py
@@ -40,7 +40,7 @@
 
 
 class Loader(object):
-  """Test loader for setuptools test suite support.
+    """Test loader for setuptools test suite support.
 
   Attributes:
     suite (unittest.TestSuite): All tests collected by the loader.
@@ -51,57 +51,57 @@
       contributes to the test suite.
   """
 
-  def __init__(self):
-    self.suite = unittest.TestSuite()
-    self.loader = unittest.TestLoader()
-    self.module_matcher = re.compile(TEST_MODULE_REGEX)
+    def __init__(self):
+        self.suite = unittest.TestSuite()
+        self.loader = unittest.TestLoader()
+        self.module_matcher = re.compile(TEST_MODULE_REGEX)
 
-  def loadTestsFromNames(self, names, module=None):
-    """Function mirroring TestLoader::loadTestsFromNames, as expected by
+    def loadTestsFromNames(self, names, module=None):
+        """Function mirroring TestLoader::loadTestsFromNames, as expected by
     setuptools.setup argument `test_loader`."""
-    # ensure that we capture decorators and definitions (else our coverage
-    # measure unnecessarily suffers)
-    coverage_context = coverage.Coverage(data_suffix=True)
-    coverage_context.start()
-    modules = [importlib.import_module(name) for name in names]
-    for module in modules:
-      self.visit_module(module)
-    for module in modules:
-      try:
-        package_paths = module.__path__
-      except:
-        continue
-      self.walk_packages(package_paths)
-    coverage_context.stop()
-    coverage_context.save()
-    return self.suite
+        # ensure that we capture decorators and definitions (else our coverage
+        # measure unnecessarily suffers)
+        coverage_context = coverage.Coverage(data_suffix=True)
+        coverage_context.start()
+        modules = [importlib.import_module(name) for name in names]
+        for module in modules:
+            self.visit_module(module)
+        for module in modules:
+            try:
+                package_paths = module.__path__
+            except:
+                continue
+            self.walk_packages(package_paths)
+        coverage_context.stop()
+        coverage_context.save()
+        return self.suite
 
-  def walk_packages(self, package_paths):
-    """Walks over the packages, dispatching `visit_module` calls.
+    def walk_packages(self, package_paths):
+        """Walks over the packages, dispatching `visit_module` calls.
 
     Args:
       package_paths (list): A list of paths over which to walk through modules
         along.
     """
-    for importer, module_name, is_package in (
-        pkgutil.walk_packages(package_paths)):
-      module = importer.find_module(module_name).load_module(module_name)
-      self.visit_module(module)
+        for importer, module_name, is_package in (
+                pkgutil.walk_packages(package_paths)):
+            module = importer.find_module(module_name).load_module(module_name)
+            self.visit_module(module)
 
-  def visit_module(self, module):
-    """Visits the module, adding discovered tests to the test suite.
+    def visit_module(self, module):
+        """Visits the module, adding discovered tests to the test suite.
 
     Args:
       module (module): Module to match against self.module_matcher; if matched
         it has its tests loaded via self.loader into self.suite.
     """
-    if self.module_matcher.match(module.__name__):
-      module_suite = self.loader.loadTestsFromModule(module)
-      self.suite.addTest(module_suite)
+        if self.module_matcher.match(module.__name__):
+            module_suite = self.loader.loadTestsFromModule(module)
+            self.suite.addTest(module_suite)
 
 
 def iterate_suite_cases(suite):
-  """Generator over all unittest.TestCases in a unittest.TestSuite.
+    """Generator over all unittest.TestCases in a unittest.TestSuite.
 
   Args:
     suite (unittest.TestSuite): Suite to iterate over in the generator.
@@ -109,11 +109,12 @@
   Returns:
     generator: A generator over all unittest.TestCases in `suite`.
   """
-  for item in suite:
-    if isinstance(item, unittest.TestSuite):
-      for child_item in iterate_suite_cases(item):
-        yield child_item
-    elif isinstance(item, unittest.TestCase):
-      yield item
-    else:
-      raise ValueError('unexpected suite item of type {}'.format(type(item)))
+    for item in suite:
+        if isinstance(item, unittest.TestSuite):
+            for child_item in iterate_suite_cases(item):
+                yield child_item
+        elif isinstance(item, unittest.TestCase):
+            yield item
+        else:
+            raise ValueError(
+                'unexpected suite item of type {}'.format(type(item)))
diff --git a/src/python/grpcio_tests/tests/_result.py b/src/python/grpcio_tests/tests/_result.py
index 1acec6a..794b754 100644
--- a/src/python/grpcio_tests/tests/_result.py
+++ b/src/python/grpcio_tests/tests/_result.py
@@ -41,9 +41,11 @@
 from tests import _loader
 
 
-class CaseResult(collections.namedtuple('CaseResult', [
-    'id', 'name', 'kind', 'stdout', 'stderr', 'skip_reason', 'traceback'])):
-  """A serializable result of a single test case.
+class CaseResult(
+        collections.namedtuple('CaseResult', [
+            'id', 'name', 'kind', 'stdout', 'stderr', 'skip_reason', 'traceback'
+        ])):
+    """A serializable result of a single test case.
 
   Attributes:
     id (object): Any serializable object used to denote the identity of this
@@ -59,62 +61,78 @@
       None.
   """
 
-  class Kind:
-    UNTESTED = 'untested'
-    RUNNING = 'running'
-    ERROR = 'error'
-    FAILURE = 'failure'
-    SUCCESS = 'success'
-    SKIP = 'skip'
-    EXPECTED_FAILURE = 'expected failure'
-    UNEXPECTED_SUCCESS = 'unexpected success'
+    class Kind:
+        UNTESTED = 'untested'
+        RUNNING = 'running'
+        ERROR = 'error'
+        FAILURE = 'failure'
+        SUCCESS = 'success'
+        SKIP = 'skip'
+        EXPECTED_FAILURE = 'expected failure'
+        UNEXPECTED_SUCCESS = 'unexpected success'
 
-  def __new__(cls, id=None, name=None, kind=None, stdout=None, stderr=None,
-              skip_reason=None, traceback=None):
-    """Helper keyword constructor for the namedtuple.
+    def __new__(cls,
+                id=None,
+                name=None,
+                kind=None,
+                stdout=None,
+                stderr=None,
+                skip_reason=None,
+                traceback=None):
+        """Helper keyword constructor for the namedtuple.
 
     See this class' attributes for information on the arguments."""
-    assert id is not None
-    assert name is None or isinstance(name, str)
-    if kind is CaseResult.Kind.UNTESTED:
-      pass
-    elif kind is CaseResult.Kind.RUNNING:
-      pass
-    elif kind is CaseResult.Kind.ERROR:
-      assert traceback is not None
-    elif kind is CaseResult.Kind.FAILURE:
-      assert traceback is not None
-    elif kind is CaseResult.Kind.SUCCESS:
-      pass
-    elif kind is CaseResult.Kind.SKIP:
-      assert skip_reason is not None
-    elif kind is CaseResult.Kind.EXPECTED_FAILURE:
-      assert traceback is not None
-    elif kind is CaseResult.Kind.UNEXPECTED_SUCCESS:
-      pass
-    else:
-      assert False
-    return super(cls, CaseResult).__new__(
-        cls, id, name, kind, stdout, stderr, skip_reason, traceback)
+        assert id is not None
+        assert name is None or isinstance(name, str)
+        if kind is CaseResult.Kind.UNTESTED:
+            pass
+        elif kind is CaseResult.Kind.RUNNING:
+            pass
+        elif kind is CaseResult.Kind.ERROR:
+            assert traceback is not None
+        elif kind is CaseResult.Kind.FAILURE:
+            assert traceback is not None
+        elif kind is CaseResult.Kind.SUCCESS:
+            pass
+        elif kind is CaseResult.Kind.SKIP:
+            assert skip_reason is not None
+        elif kind is CaseResult.Kind.EXPECTED_FAILURE:
+            assert traceback is not None
+        elif kind is CaseResult.Kind.UNEXPECTED_SUCCESS:
+            pass
+        else:
+            assert False
+        return super(cls, CaseResult).__new__(cls, id, name, kind, stdout,
+                                              stderr, skip_reason, traceback)
 
-  def updated(self, name=None, kind=None, stdout=None, stderr=None,
-              skip_reason=None, traceback=None):
-    """Get a new validated CaseResult with the fields updated.
+    def updated(self,
+                name=None,
+                kind=None,
+                stdout=None,
+                stderr=None,
+                skip_reason=None,
+                traceback=None):
+        """Get a new validated CaseResult with the fields updated.
 
     See this class' attributes for information on the arguments."""
-    name = self.name if name is None else name
-    kind = self.kind if kind is None else kind
-    stdout = self.stdout if stdout is None else stdout
-    stderr = self.stderr if stderr is None else stderr
-    skip_reason = self.skip_reason if skip_reason is None else skip_reason
-    traceback = self.traceback if traceback is None else traceback
-    return CaseResult(id=self.id, name=name, kind=kind, stdout=stdout,
-                      stderr=stderr, skip_reason=skip_reason,
-                      traceback=traceback)
+        name = self.name if name is None else name
+        kind = self.kind if kind is None else kind
+        stdout = self.stdout if stdout is None else stdout
+        stderr = self.stderr if stderr is None else stderr
+        skip_reason = self.skip_reason if skip_reason is None else skip_reason
+        traceback = self.traceback if traceback is None else traceback
+        return CaseResult(
+            id=self.id,
+            name=name,
+            kind=kind,
+            stdout=stdout,
+            stderr=stderr,
+            skip_reason=skip_reason,
+            traceback=traceback)
 
 
 class AugmentedResult(unittest.TestResult):
-  """unittest.Result that keeps track of additional information.
+    """unittest.Result that keeps track of additional information.
 
   Uses CaseResult objects to store test-case results, providing additional
   information beyond that of the standard Python unittest library, such as
@@ -127,228 +145,215 @@
       to CaseResult objects corresponding to those IDs.
   """
 
-  def __init__(self, id_map):
-    """Initialize the object with an identifier mapping.
+    def __init__(self, id_map):
+        """Initialize the object with an identifier mapping.
 
     Arguments:
       id_map (callable): Corresponds to the attribute `id_map`."""
-    super(AugmentedResult, self).__init__()
-    self.id_map = id_map
-    self.cases = None
+        super(AugmentedResult, self).__init__()
+        self.id_map = id_map
+        self.cases = None
 
-  def startTestRun(self):
-    """See unittest.TestResult.startTestRun."""
-    super(AugmentedResult, self).startTestRun()
-    self.cases = dict()
+    def startTestRun(self):
+        """See unittest.TestResult.startTestRun."""
+        super(AugmentedResult, self).startTestRun()
+        self.cases = dict()
 
-  def stopTestRun(self):
-    """See unittest.TestResult.stopTestRun."""
-    super(AugmentedResult, self).stopTestRun()
+    def stopTestRun(self):
+        """See unittest.TestResult.stopTestRun."""
+        super(AugmentedResult, self).stopTestRun()
 
-  def startTest(self, test):
-    """See unittest.TestResult.startTest."""
-    super(AugmentedResult, self).startTest(test)
-    case_id = self.id_map(test)
-    self.cases[case_id] = CaseResult(
-        id=case_id, name=test.id(), kind=CaseResult.Kind.RUNNING)
+    def startTest(self, test):
+        """See unittest.TestResult.startTest."""
+        super(AugmentedResult, self).startTest(test)
+        case_id = self.id_map(test)
+        self.cases[case_id] = CaseResult(
+            id=case_id, name=test.id(), kind=CaseResult.Kind.RUNNING)
 
-  def addError(self, test, error):
-    """See unittest.TestResult.addError."""
-    super(AugmentedResult, self).addError(test, error)
-    case_id = self.id_map(test)
-    self.cases[case_id] = self.cases[case_id].updated(
-        kind=CaseResult.Kind.ERROR, traceback=error)
+    def addError(self, test, error):
+        """See unittest.TestResult.addError."""
+        super(AugmentedResult, self).addError(test, error)
+        case_id = self.id_map(test)
+        self.cases[case_id] = self.cases[case_id].updated(
+            kind=CaseResult.Kind.ERROR, traceback=error)
 
-  def addFailure(self, test, error):
-    """See unittest.TestResult.addFailure."""
-    super(AugmentedResult, self).addFailure(test, error)
-    case_id = self.id_map(test)
-    self.cases[case_id] = self.cases[case_id].updated(
-        kind=CaseResult.Kind.FAILURE, traceback=error)
+    def addFailure(self, test, error):
+        """See unittest.TestResult.addFailure."""
+        super(AugmentedResult, self).addFailure(test, error)
+        case_id = self.id_map(test)
+        self.cases[case_id] = self.cases[case_id].updated(
+            kind=CaseResult.Kind.FAILURE, traceback=error)
 
-  def addSuccess(self, test):
-    """See unittest.TestResult.addSuccess."""
-    super(AugmentedResult, self).addSuccess(test)
-    case_id = self.id_map(test)
-    self.cases[case_id] = self.cases[case_id].updated(
-        kind=CaseResult.Kind.SUCCESS)
+    def addSuccess(self, test):
+        """See unittest.TestResult.addSuccess."""
+        super(AugmentedResult, self).addSuccess(test)
+        case_id = self.id_map(test)
+        self.cases[case_id] = self.cases[case_id].updated(
+            kind=CaseResult.Kind.SUCCESS)
 
-  def addSkip(self, test, reason):
-    """See unittest.TestResult.addSkip."""
-    super(AugmentedResult, self).addSkip(test, reason)
-    case_id = self.id_map(test)
-    self.cases[case_id] = self.cases[case_id].updated(
-        kind=CaseResult.Kind.SKIP, skip_reason=reason)
+    def addSkip(self, test, reason):
+        """See unittest.TestResult.addSkip."""
+        super(AugmentedResult, self).addSkip(test, reason)
+        case_id = self.id_map(test)
+        self.cases[case_id] = self.cases[case_id].updated(
+            kind=CaseResult.Kind.SKIP, skip_reason=reason)
 
-  def addExpectedFailure(self, test, error):
-    """See unittest.TestResult.addExpectedFailure."""
-    super(AugmentedResult, self).addExpectedFailure(test, error)
-    case_id = self.id_map(test)
-    self.cases[case_id] = self.cases[case_id].updated(
-        kind=CaseResult.Kind.EXPECTED_FAILURE, traceback=error)
+    def addExpectedFailure(self, test, error):
+        """See unittest.TestResult.addExpectedFailure."""
+        super(AugmentedResult, self).addExpectedFailure(test, error)
+        case_id = self.id_map(test)
+        self.cases[case_id] = self.cases[case_id].updated(
+            kind=CaseResult.Kind.EXPECTED_FAILURE, traceback=error)
 
-  def addUnexpectedSuccess(self, test):
-    """See unittest.TestResult.addUnexpectedSuccess."""
-    super(AugmentedResult, self).addUnexpectedSuccess(test)
-    case_id = self.id_map(test)
-    self.cases[case_id] = self.cases[case_id].updated(
-        kind=CaseResult.Kind.UNEXPECTED_SUCCESS)
+    def addUnexpectedSuccess(self, test):
+        """See unittest.TestResult.addUnexpectedSuccess."""
+        super(AugmentedResult, self).addUnexpectedSuccess(test)
+        case_id = self.id_map(test)
+        self.cases[case_id] = self.cases[case_id].updated(
+            kind=CaseResult.Kind.UNEXPECTED_SUCCESS)
 
-  def set_output(self, test, stdout, stderr):
-    """Set the output attributes for the CaseResult corresponding to a test.
+    def set_output(self, test, stdout, stderr):
+        """Set the output attributes for the CaseResult corresponding to a test.
 
     Args:
       test (unittest.TestCase): The TestCase to set the outputs of.
       stdout (str): Output from stdout to assign to self.id_map(test).
       stderr (str): Output from stderr to assign to self.id_map(test).
     """
-    case_id = self.id_map(test)
-    self.cases[case_id] = self.cases[case_id].updated(
-        stdout=stdout.decode(), stderr=stderr.decode())
+        case_id = self.id_map(test)
+        self.cases[case_id] = self.cases[case_id].updated(
+            stdout=stdout.decode(), stderr=stderr.decode())
 
-  def augmented_results(self, filter):
-    """Convenience method to retrieve filtered case results.
+    def augmented_results(self, filter):
+        """Convenience method to retrieve filtered case results.
 
     Args:
       filter (callable): A unary predicate to filter over CaseResult objects.
     """
-    return (self.cases[case_id] for case_id in self.cases
-            if filter(self.cases[case_id]))
+        return (self.cases[case_id] for case_id in self.cases
+                if filter(self.cases[case_id]))
 
 
 class CoverageResult(AugmentedResult):
-  """Extension to AugmentedResult adding coverage.py support per test.\
+    """Extension to AugmentedResult adding coverage.py support per test.\
 
   Attributes:
     coverage_context (coverage.Coverage): coverage.py management object.
   """
 
-  def __init__(self, id_map):
-    """See AugmentedResult.__init__."""
-    super(CoverageResult, self).__init__(id_map=id_map)
-    self.coverage_context = None
+    def __init__(self, id_map):
+        """See AugmentedResult.__init__."""
+        super(CoverageResult, self).__init__(id_map=id_map)
+        self.coverage_context = None
 
-  def startTest(self, test):
-    """See unittest.TestResult.startTest.
+    def startTest(self, test):
+        """See unittest.TestResult.startTest.
 
     Additionally initializes and begins code coverage tracking."""
-    super(CoverageResult, self).startTest(test)
-    self.coverage_context = coverage.Coverage(data_suffix=True)
-    self.coverage_context.start()
+        super(CoverageResult, self).startTest(test)
+        self.coverage_context = coverage.Coverage(data_suffix=True)
+        self.coverage_context.start()
 
-  def stopTest(self, test):
-    """See unittest.TestResult.stopTest.
+    def stopTest(self, test):
+        """See unittest.TestResult.stopTest.
 
     Additionally stops and deinitializes code coverage tracking."""
-    super(CoverageResult, self).stopTest(test)
-    self.coverage_context.stop()
-    self.coverage_context.save()
-    self.coverage_context = None
+        super(CoverageResult, self).stopTest(test)
+        self.coverage_context.stop()
+        self.coverage_context.save()
+        self.coverage_context = None
 
-  def stopTestRun(self):
-    """See unittest.TestResult.stopTestRun."""
-    super(CoverageResult, self).stopTestRun()
-    # TODO(atash): Dig deeper into why the following line fails to properly
-    # combine coverage data from the Cython plugin.
-    #coverage.Coverage().combine()
+    def stopTestRun(self):
+        """See unittest.TestResult.stopTestRun."""
+        super(CoverageResult, self).stopTestRun()
+        # TODO(atash): Dig deeper into why the following line fails to properly
+        # combine coverage data from the Cython plugin.
+        #coverage.Coverage().combine()
 
 
 class _Colors:
-  """Namespaced constants for terminal color magic numbers."""
-  HEADER = '\033[95m'
-  INFO = '\033[94m'
-  OK = '\033[92m'
-  WARN = '\033[93m'
-  FAIL = '\033[91m'
-  BOLD = '\033[1m'
-  UNDERLINE = '\033[4m'
-  END = '\033[0m'
+    """Namespaced constants for terminal color magic numbers."""
+    HEADER = '\033[95m'
+    INFO = '\033[94m'
+    OK = '\033[92m'
+    WARN = '\033[93m'
+    FAIL = '\033[91m'
+    BOLD = '\033[1m'
+    UNDERLINE = '\033[4m'
+    END = '\033[0m'
 
 
 class TerminalResult(CoverageResult):
-  """Extension to CoverageResult adding basic terminal reporting."""
+    """Extension to CoverageResult adding basic terminal reporting."""
 
-  def __init__(self, out, id_map):
-    """Initialize the result object.
+    def __init__(self, out, id_map):
+        """Initialize the result object.
 
     Args:
       out (file-like): Output file to which terminal-colored live results will
         be written.
       id_map (callable): See AugmentedResult.__init__.
     """
-    super(TerminalResult, self).__init__(id_map=id_map)
-    self.out = out
+        super(TerminalResult, self).__init__(id_map=id_map)
+        self.out = out
 
-  def startTestRun(self):
-    """See unittest.TestResult.startTestRun."""
-    super(TerminalResult, self).startTestRun()
-    self.out.write(
-        _Colors.HEADER +
-        'Testing gRPC Python...\n' +
-        _Colors.END)
+    def startTestRun(self):
+        """See unittest.TestResult.startTestRun."""
+        super(TerminalResult, self).startTestRun()
+        self.out.write(_Colors.HEADER + 'Testing gRPC Python...\n' +
+                       _Colors.END)
 
-  def stopTestRun(self):
-    """See unittest.TestResult.stopTestRun."""
-    super(TerminalResult, self).stopTestRun()
-    self.out.write(summary(self))
-    self.out.flush()
+    def stopTestRun(self):
+        """See unittest.TestResult.stopTestRun."""
+        super(TerminalResult, self).stopTestRun()
+        self.out.write(summary(self))
+        self.out.flush()
 
-  def addError(self, test, error):
-    """See unittest.TestResult.addError."""
-    super(TerminalResult, self).addError(test, error)
-    self.out.write(
-        _Colors.FAIL +
-        'ERROR         {}\n'.format(test.id()) +
-        _Colors.END)
-    self.out.flush()
+    def addError(self, test, error):
+        """See unittest.TestResult.addError."""
+        super(TerminalResult, self).addError(test, error)
+        self.out.write(_Colors.FAIL + 'ERROR         {}\n'.format(test.id()) +
+                       _Colors.END)
+        self.out.flush()
 
-  def addFailure(self, test, error):
-    """See unittest.TestResult.addFailure."""
-    super(TerminalResult, self).addFailure(test, error)
-    self.out.write(
-        _Colors.FAIL +
-        'FAILURE       {}\n'.format(test.id()) +
-        _Colors.END)
-    self.out.flush()
+    def addFailure(self, test, error):
+        """See unittest.TestResult.addFailure."""
+        super(TerminalResult, self).addFailure(test, error)
+        self.out.write(_Colors.FAIL + 'FAILURE       {}\n'.format(test.id()) +
+                       _Colors.END)
+        self.out.flush()
 
-  def addSuccess(self, test):
-    """See unittest.TestResult.addSuccess."""
-    super(TerminalResult, self).addSuccess(test)
-    self.out.write(
-        _Colors.OK +
-        'SUCCESS       {}\n'.format(test.id()) +
-        _Colors.END)
-    self.out.flush()
+    def addSuccess(self, test):
+        """See unittest.TestResult.addSuccess."""
+        super(TerminalResult, self).addSuccess(test)
+        self.out.write(_Colors.OK + 'SUCCESS       {}\n'.format(test.id()) +
+                       _Colors.END)
+        self.out.flush()
 
-  def addSkip(self, test, reason):
-    """See unittest.TestResult.addSkip."""
-    super(TerminalResult, self).addSkip(test, reason)
-    self.out.write(
-        _Colors.INFO +
-        'SKIP          {}\n'.format(test.id()) +
-        _Colors.END)
-    self.out.flush()
+    def addSkip(self, test, reason):
+        """See unittest.TestResult.addSkip."""
+        super(TerminalResult, self).addSkip(test, reason)
+        self.out.write(_Colors.INFO + 'SKIP          {}\n'.format(test.id()) +
+                       _Colors.END)
+        self.out.flush()
 
-  def addExpectedFailure(self, test, error):
-    """See unittest.TestResult.addExpectedFailure."""
-    super(TerminalResult, self).addExpectedFailure(test, error)
-    self.out.write(
-        _Colors.INFO +
-        'FAILURE_OK    {}\n'.format(test.id()) +
-        _Colors.END)
-    self.out.flush()
+    def addExpectedFailure(self, test, error):
+        """See unittest.TestResult.addExpectedFailure."""
+        super(TerminalResult, self).addExpectedFailure(test, error)
+        self.out.write(_Colors.INFO + 'FAILURE_OK    {}\n'.format(test.id()) +
+                       _Colors.END)
+        self.out.flush()
 
-  def addUnexpectedSuccess(self, test):
-    """See unittest.TestResult.addUnexpectedSuccess."""
-    super(TerminalResult, self).addUnexpectedSuccess(test)
-    self.out.write(
-        _Colors.INFO +
-        'UNEXPECTED_OK {}\n'.format(test.id()) +
-        _Colors.END)
-    self.out.flush()
+    def addUnexpectedSuccess(self, test):
+        """See unittest.TestResult.addUnexpectedSuccess."""
+        super(TerminalResult, self).addUnexpectedSuccess(test)
+        self.out.write(_Colors.INFO + 'UNEXPECTED_OK {}\n'.format(test.id()) +
+                       _Colors.END)
+        self.out.flush()
+
 
 def _traceback_string(type, value, trace):
-  """Generate a descriptive string of a Python exception traceback.
+    """Generate a descriptive string of a Python exception traceback.
 
   Args:
     type (class): The type of the exception.
@@ -358,12 +363,13 @@
   Returns:
     str: Formatted exception descriptive string.
   """
-  buffer = moves.cStringIO()
-  traceback.print_exception(type, value, trace, file=buffer)
-  return buffer.getvalue()
+    buffer = moves.cStringIO()
+    traceback.print_exception(type, value, trace, file=buffer)
+    return buffer.getvalue()
+
 
 def summary(result):
-  """A summary string of a result object.
+    """A summary string of a result object.
 
   Args:
     result (AugmentedResult): The result object to get the summary of.
@@ -371,62 +377,68 @@
   Returns:
     str: The summary string.
   """
-  assert isinstance(result, AugmentedResult)
-  untested = list(result.augmented_results(
-      lambda case_result: case_result.kind is CaseResult.Kind.UNTESTED))
-  running = list(result.augmented_results(
-      lambda case_result: case_result.kind is CaseResult.Kind.RUNNING))
-  failures = list(result.augmented_results(
-      lambda case_result: case_result.kind is CaseResult.Kind.FAILURE))
-  errors = list(result.augmented_results(
-      lambda case_result: case_result.kind is CaseResult.Kind.ERROR))
-  successes = list(result.augmented_results(
-      lambda case_result: case_result.kind is CaseResult.Kind.SUCCESS))
-  skips = list(result.augmented_results(
-      lambda case_result: case_result.kind is CaseResult.Kind.SKIP))
-  expected_failures = list(result.augmented_results(
-      lambda case_result: case_result.kind is CaseResult.Kind.EXPECTED_FAILURE))
-  unexpected_successes = list(result.augmented_results(
-      lambda case_result: case_result.kind is CaseResult.Kind.UNEXPECTED_SUCCESS))
-  running_names = [case.name for case in running]
-  finished_count = (len(failures) + len(errors) + len(successes) +
-                    len(expected_failures) + len(unexpected_successes))
-  statistics = (
-      '{finished} tests finished:\n'
-      '\t{successful} successful\n'
-      '\t{unsuccessful} unsuccessful\n'
-      '\t{skipped} skipped\n'
-      '\t{expected_fail} expected failures\n'
-      '\t{unexpected_successful} unexpected successes\n'
-      'Interrupted Tests:\n'
-      '\t{interrupted}\n'
-      .format(finished=finished_count,
-              successful=len(successes),
-              unsuccessful=(len(failures)+len(errors)),
-              skipped=len(skips),
-              expected_fail=len(expected_failures),
-              unexpected_successful=len(unexpected_successes),
-              interrupted=str(running_names)))
-  tracebacks = '\n\n'.join([
-      (_Colors.FAIL + '{test_name}' + _Colors.END + '\n' +
-       _Colors.BOLD + 'traceback:' + _Colors.END + '\n' +
-       '{traceback}\n' +
-       _Colors.BOLD + 'stdout:' + _Colors.END + '\n' +
-       '{stdout}\n' +
-       _Colors.BOLD + 'stderr:' + _Colors.END + '\n' +
-       '{stderr}\n').format(
-           test_name=result.name,
-           traceback=_traceback_string(*result.traceback),
-           stdout=result.stdout, stderr=result.stderr)
-      for result in itertools.chain(failures, errors)
-  ])
-  notes = 'Unexpected successes: {}\n'.format([
-      result.name for result in unexpected_successes])
-  return statistics + '\nErrors/Failures: \n' + tracebacks + '\n' + notes
+    assert isinstance(result, AugmentedResult)
+    untested = list(
+        result.augmented_results(
+            lambda case_result: case_result.kind is CaseResult.Kind.UNTESTED))
+    running = list(
+        result.augmented_results(
+            lambda case_result: case_result.kind is CaseResult.Kind.RUNNING))
+    failures = list(
+        result.augmented_results(
+            lambda case_result: case_result.kind is CaseResult.Kind.FAILURE))
+    errors = list(
+        result.augmented_results(
+            lambda case_result: case_result.kind is CaseResult.Kind.ERROR))
+    successes = list(
+        result.augmented_results(
+            lambda case_result: case_result.kind is CaseResult.Kind.SUCCESS))
+    skips = list(
+        result.augmented_results(
+            lambda case_result: case_result.kind is CaseResult.Kind.SKIP))
+    expected_failures = list(
+        result.augmented_results(
+            lambda case_result: case_result.kind is CaseResult.Kind.EXPECTED_FAILURE
+        ))
+    unexpected_successes = list(
+        result.augmented_results(
+            lambda case_result: case_result.kind is CaseResult.Kind.UNEXPECTED_SUCCESS
+        ))
+    running_names = [case.name for case in running]
+    finished_count = (len(failures) + len(errors) + len(successes) +
+                      len(expected_failures) + len(unexpected_successes))
+    statistics = ('{finished} tests finished:\n'
+                  '\t{successful} successful\n'
+                  '\t{unsuccessful} unsuccessful\n'
+                  '\t{skipped} skipped\n'
+                  '\t{expected_fail} expected failures\n'
+                  '\t{unexpected_successful} unexpected successes\n'
+                  'Interrupted Tests:\n'
+                  '\t{interrupted}\n'.format(
+                      finished=finished_count,
+                      successful=len(successes),
+                      unsuccessful=(len(failures) + len(errors)),
+                      skipped=len(skips),
+                      expected_fail=len(expected_failures),
+                      unexpected_successful=len(unexpected_successes),
+                      interrupted=str(running_names)))
+    tracebacks = '\n\n'.join(
+        [(_Colors.FAIL + '{test_name}' + _Colors.END + '\n' + _Colors.BOLD +
+          'traceback:' + _Colors.END + '\n' + '{traceback}\n' + _Colors.BOLD +
+          'stdout:' + _Colors.END + '\n' + '{stdout}\n' + _Colors.BOLD +
+          'stderr:' + _Colors.END + '\n' + '{stderr}\n').format(
+              test_name=result.name,
+              traceback=_traceback_string(*result.traceback),
+              stdout=result.stdout,
+              stderr=result.stderr)
+         for result in itertools.chain(failures, errors)])
+    notes = 'Unexpected successes: {}\n'.format(
+        [result.name for result in unexpected_successes])
+    return statistics + '\nErrors/Failures: \n' + tracebacks + '\n' + notes
 
 
 def jenkins_junit_xml(result):
-  """An XML tree object that when written is recognizable by Jenkins.
+    """An XML tree object that when written is recognizable by Jenkins.
 
   Args:
     result (AugmentedResult): The result object to get the junit xml output of.
@@ -434,20 +446,18 @@
   Returns:
     ElementTree.ElementTree: The XML tree.
   """
-  assert isinstance(result, AugmentedResult)
-  root = ElementTree.Element('testsuites')
-  suite = ElementTree.SubElement(root, 'testsuite', {
-      'name': 'Python gRPC tests',
-  })
-  for case in result.cases.values():
-    if case.kind is CaseResult.Kind.SUCCESS:
-      ElementTree.SubElement(suite, 'testcase', {
-          'name': case.name,
-      })
-    elif case.kind in (CaseResult.Kind.ERROR, CaseResult.Kind.FAILURE):
-      case_xml = ElementTree.SubElement(suite, 'testcase', {
-          'name': case.name,
-      })
-      error_xml = ElementTree.SubElement(case_xml, 'error', {})
-      error_xml.text = ''.format(case.stderr, case.traceback)
-  return ElementTree.ElementTree(element=root)
+    assert isinstance(result, AugmentedResult)
+    root = ElementTree.Element('testsuites')
+    suite = ElementTree.SubElement(root, 'testsuite', {
+        'name': 'Python gRPC tests',
+    })
+    for case in result.cases.values():
+        if case.kind is CaseResult.Kind.SUCCESS:
+            ElementTree.SubElement(suite, 'testcase', {'name': case.name,})
+        elif case.kind in (CaseResult.Kind.ERROR, CaseResult.Kind.FAILURE):
+            case_xml = ElementTree.SubElement(suite, 'testcase', {
+                'name': case.name,
+            })
+            error_xml = ElementTree.SubElement(case_xml, 'error', {})
+            error_xml.text = ''.format(case.stderr, case.traceback)
+    return ElementTree.ElementTree(element=root)
diff --git a/src/python/grpcio_tests/tests/_runner.py b/src/python/grpcio_tests/tests/_runner.py
index 926dcbe..1138a22 100644
--- a/src/python/grpcio_tests/tests/_runner.py
+++ b/src/python/grpcio_tests/tests/_runner.py
@@ -49,7 +49,7 @@
 
 
 class CaptureFile(object):
-  """A context-managed file to redirect output to a byte array.
+    """A context-managed file to redirect output to a byte array.
 
   Use by invoking `start` (`__enter__`) and at some point invoking `stop`
   (`__exit__`). At any point after the initial call to `start` call `output` to
@@ -66,57 +66,56 @@
       Only non-None when self is started.
   """
 
-  def __init__(self, fd):
-    self._redirected_fd = fd
-    self._saved_fd = os.dup(self._redirected_fd)
-    self._into_file = None
+    def __init__(self, fd):
+        self._redirected_fd = fd
+        self._saved_fd = os.dup(self._redirected_fd)
+        self._into_file = None
 
-  def output(self):
-    """Get all output from the redirected-to file if it exists."""
-    if self._into_file:
-      self._into_file.seek(0)
-      return bytes(self._into_file.read())
-    else:
-      return bytes()
+    def output(self):
+        """Get all output from the redirected-to file if it exists."""
+        if self._into_file:
+            self._into_file.seek(0)
+            return bytes(self._into_file.read())
+        else:
+            return bytes()
 
-  def start(self):
-    """Start redirection of writes to the file descriptor."""
-    self._into_file = tempfile.TemporaryFile()
-    os.dup2(self._into_file.fileno(), self._redirected_fd)
+    def start(self):
+        """Start redirection of writes to the file descriptor."""
+        self._into_file = tempfile.TemporaryFile()
+        os.dup2(self._into_file.fileno(), self._redirected_fd)
 
-  def stop(self):
-    """Stop redirection of writes to the file descriptor."""
-    # n.b. this dup2 call auto-closes self._redirected_fd
-    os.dup2(self._saved_fd, self._redirected_fd)
+    def stop(self):
+        """Stop redirection of writes to the file descriptor."""
+        # n.b. this dup2 call auto-closes self._redirected_fd
+        os.dup2(self._saved_fd, self._redirected_fd)
 
-  def write_bypass(self, value):
-    """Bypass the redirection and write directly to the original file.
+    def write_bypass(self, value):
+        """Bypass the redirection and write directly to the original file.
 
     Arguments:
       value (str): What to write to the original file.
     """
-    if six.PY3 and not isinstance(value, six.binary_type):
-      value = bytes(value, 'ascii')
-    if self._saved_fd is None:
-      os.write(self._redirect_fd, value)
-    else:
-      os.write(self._saved_fd, value)
+        if six.PY3 and not isinstance(value, six.binary_type):
+            value = bytes(value, 'ascii')
+        if self._saved_fd is None:
+            os.write(self._redirect_fd, value)
+        else:
+            os.write(self._saved_fd, value)
 
-  def __enter__(self):
-    self.start()
-    return self
+    def __enter__(self):
+        self.start()
+        return self
 
-  def __exit__(self, type, value, traceback):
-    self.stop()
+    def __exit__(self, type, value, traceback):
+        self.stop()
 
-  def close(self):
-    """Close any resources used by self not closed by stop()."""
-    os.close(self._saved_fd)
+    def close(self):
+        """Close any resources used by self not closed by stop()."""
+        os.close(self._saved_fd)
 
 
-class AugmentedCase(collections.namedtuple('AugmentedCase', [
-    'case', 'id'])):
-  """A test case with a guaranteed unique externally specified identifier.
+class AugmentedCase(collections.namedtuple('AugmentedCase', ['case', 'id'])):
+    """A test case with a guaranteed unique externally specified identifier.
 
   Attributes:
     case (unittest.TestCase): TestCase we're decorating with an additional
@@ -125,105 +124,107 @@
       purposes.
   """
 
-  def __new__(cls, case, id=None):
-    if id is None:
-      id = uuid.uuid4()
-    return super(cls, AugmentedCase).__new__(cls, case, id)
+    def __new__(cls, case, id=None):
+        if id is None:
+            id = uuid.uuid4()
+        return super(cls, AugmentedCase).__new__(cls, case, id)
 
 
 class Runner(object):
 
-  def run(self, suite):
-    """See setuptools' test_runner setup argument for information."""
-    # only run test cases with id starting with given prefix
-    testcase_filter = os.getenv('GRPC_PYTHON_TESTRUNNER_FILTER')
-    filtered_cases = []
-    for case in _loader.iterate_suite_cases(suite):
-      if not testcase_filter or case.id().startswith(testcase_filter):
-        filtered_cases.append(case)
+    def run(self, suite):
+        """See setuptools' test_runner setup argument for information."""
+        # only run test cases with id starting with given prefix
+        testcase_filter = os.getenv('GRPC_PYTHON_TESTRUNNER_FILTER')
+        filtered_cases = []
+        for case in _loader.iterate_suite_cases(suite):
+            if not testcase_filter or case.id().startswith(testcase_filter):
+                filtered_cases.append(case)
 
-    # Ensure that every test case has no collision with any other test case in
-    # the augmented results.
-    augmented_cases = [AugmentedCase(case, uuid.uuid4())
-                       for case in filtered_cases]
-    case_id_by_case = dict((augmented_case.case, augmented_case.id)
-                           for augmented_case in augmented_cases)
-    result_out = moves.cStringIO()
-    result = _result.TerminalResult(
-        result_out, id_map=lambda case: case_id_by_case[case])
-    stdout_pipe = CaptureFile(sys.stdout.fileno())
-    stderr_pipe = CaptureFile(sys.stderr.fileno())
-    kill_flag = [False]
+        # Ensure that every test case has no collision with any other test case in
+        # the augmented results.
+        augmented_cases = [
+            AugmentedCase(case, uuid.uuid4()) for case in filtered_cases
+        ]
+        case_id_by_case = dict((augmented_case.case, augmented_case.id)
+                               for augmented_case in augmented_cases)
+        result_out = moves.cStringIO()
+        result = _result.TerminalResult(
+            result_out, id_map=lambda case: case_id_by_case[case])
+        stdout_pipe = CaptureFile(sys.stdout.fileno())
+        stderr_pipe = CaptureFile(sys.stderr.fileno())
+        kill_flag = [False]
 
-    def sigint_handler(signal_number, frame):
-      if signal_number == signal.SIGINT:
-        kill_flag[0] = True  # Python 2.7 not having 'local'... :-(
-      signal.signal(signal_number, signal.SIG_DFL)
+        def sigint_handler(signal_number, frame):
+            if signal_number == signal.SIGINT:
+                kill_flag[0] = True  # Python 2.7 not having 'local'... :-(
+            signal.signal(signal_number, signal.SIG_DFL)
 
-    def fault_handler(signal_number, frame):
-      stdout_pipe.write_bypass(
-          'Received fault signal {}\nstdout:\n{}\n\nstderr:{}\n'
-          .format(signal_number, stdout_pipe.output(),
-                  stderr_pipe.output()))
-      os._exit(1)
+        def fault_handler(signal_number, frame):
+            stdout_pipe.write_bypass(
+                'Received fault signal {}\nstdout:\n{}\n\nstderr:{}\n'.format(
+                    signal_number, stdout_pipe.output(), stderr_pipe.output()))
+            os._exit(1)
 
-    def check_kill_self():
-      if kill_flag[0]:
-        stdout_pipe.write_bypass('Stopping tests short...')
-        result.stopTestRun()
-        stdout_pipe.write_bypass(result_out.getvalue())
-        stdout_pipe.write_bypass(
-            '\ninterrupted stdout:\n{}\n'.format(stdout_pipe.output().decode()))
-        stderr_pipe.write_bypass(
-            '\ninterrupted stderr:\n{}\n'.format(stderr_pipe.output().decode()))
-        os._exit(1)
-    def try_set_handler(name, handler):
-      try:
-        signal.signal(getattr(signal, name), handler)
-      except AttributeError:
-        pass
-    try_set_handler('SIGINT', sigint_handler)
-    try_set_handler('SIGSEGV', fault_handler)
-    try_set_handler('SIGBUS', fault_handler)
-    try_set_handler('SIGABRT', fault_handler)
-    try_set_handler('SIGFPE', fault_handler)
-    try_set_handler('SIGILL', fault_handler)
-    # Sometimes output will lag after a test has successfully finished; we
-    # ignore such writes to our pipes.
-    try_set_handler('SIGPIPE', signal.SIG_IGN)
+        def check_kill_self():
+            if kill_flag[0]:
+                stdout_pipe.write_bypass('Stopping tests short...')
+                result.stopTestRun()
+                stdout_pipe.write_bypass(result_out.getvalue())
+                stdout_pipe.write_bypass('\ninterrupted stdout:\n{}\n'.format(
+                    stdout_pipe.output().decode()))
+                stderr_pipe.write_bypass('\ninterrupted stderr:\n{}\n'.format(
+                    stderr_pipe.output().decode()))
+                os._exit(1)
 
-    # Run the tests
-    result.startTestRun()
-    for augmented_case in augmented_cases:
-      sys.stdout.write('Running       {}\n'.format(augmented_case.case.id()))
-      sys.stdout.flush()
-      case_thread = threading.Thread(
-          target=augmented_case.case.run, args=(result,))
-      try:
-        with stdout_pipe, stderr_pipe:
-          case_thread.start()
-          while case_thread.is_alive():
+        def try_set_handler(name, handler):
+            try:
+                signal.signal(getattr(signal, name), handler)
+            except AttributeError:
+                pass
+
+        try_set_handler('SIGINT', sigint_handler)
+        try_set_handler('SIGSEGV', fault_handler)
+        try_set_handler('SIGBUS', fault_handler)
+        try_set_handler('SIGABRT', fault_handler)
+        try_set_handler('SIGFPE', fault_handler)
+        try_set_handler('SIGILL', fault_handler)
+        # Sometimes output will lag after a test has successfully finished; we
+        # ignore such writes to our pipes.
+        try_set_handler('SIGPIPE', signal.SIG_IGN)
+
+        # Run the tests
+        result.startTestRun()
+        for augmented_case in augmented_cases:
+            sys.stdout.write(
+                'Running       {}\n'.format(augmented_case.case.id()))
+            sys.stdout.flush()
+            case_thread = threading.Thread(
+                target=augmented_case.case.run, args=(result,))
+            try:
+                with stdout_pipe, stderr_pipe:
+                    case_thread.start()
+                    while case_thread.is_alive():
+                        check_kill_self()
+                        time.sleep(0)
+                    case_thread.join()
+            except:
+                # re-raise the exception after forcing the with-block to end
+                raise
+            result.set_output(augmented_case.case,
+                              stdout_pipe.output(), stderr_pipe.output())
+            sys.stdout.write(result_out.getvalue())
+            sys.stdout.flush()
+            result_out.truncate(0)
             check_kill_self()
-            time.sleep(0)
-          case_thread.join()
-      except:
-        # re-raise the exception after forcing the with-block to end
-        raise
-      result.set_output(
-          augmented_case.case, stdout_pipe.output(), stderr_pipe.output())
-      sys.stdout.write(result_out.getvalue())
-      sys.stdout.flush()
-      result_out.truncate(0)
-      check_kill_self()
-    result.stopTestRun()
-    stdout_pipe.close()
-    stderr_pipe.close()
+        result.stopTestRun()
+        stdout_pipe.close()
+        stderr_pipe.close()
 
-    # Report results
-    sys.stdout.write(result_out.getvalue())
-    sys.stdout.flush()
-    signal.signal(signal.SIGINT, signal.SIG_DFL)
-    with open('report.xml', 'wb') as report_xml_file:
-      _result.jenkins_junit_xml(result).write(report_xml_file)
-    return result
-
+        # Report results
+        sys.stdout.write(result_out.getvalue())
+        sys.stdout.flush()
+        signal.signal(signal.SIGINT, signal.SIG_DFL)
+        with open('report.xml', 'wb') as report_xml_file:
+            _result.jenkins_junit_xml(result).write(report_xml_file)
+        return result
diff --git a/src/python/grpcio_tests/tests/health_check/_health_servicer_test.py b/src/python/grpcio_tests/tests/health_check/_health_servicer_test.py
index 5dde72b..363b4c5 100644
--- a/src/python/grpcio_tests/tests/health_check/_health_servicer_test.py
+++ b/src/python/grpcio_tests/tests/health_check/_health_servicer_test.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Tests of grpc_health.v1.health."""
 
 import unittest
@@ -41,55 +40,55 @@
 
 class HealthServicerTest(unittest.TestCase):
 
-  def setUp(self):
-    servicer = health.HealthServicer()
-    servicer.set('', health_pb2.HealthCheckResponse.SERVING)
-    servicer.set('grpc.test.TestServiceServing',
-                 health_pb2.HealthCheckResponse.SERVING)
-    servicer.set('grpc.test.TestServiceUnknown',
-                 health_pb2.HealthCheckResponse.UNKNOWN)
-    servicer.set('grpc.test.TestServiceNotServing',
-                 health_pb2.HealthCheckResponse.NOT_SERVING)
-    server_pool = logging_pool.pool(test_constants.THREAD_CONCURRENCY)
-    self._server = grpc.server(server_pool)
-    port = self._server.add_insecure_port('[::]:0')
-    health_pb2.add_HealthServicer_to_server(servicer, self._server)
-    self._server.start()
+    def setUp(self):
+        servicer = health.HealthServicer()
+        servicer.set('', health_pb2.HealthCheckResponse.SERVING)
+        servicer.set('grpc.test.TestServiceServing',
+                     health_pb2.HealthCheckResponse.SERVING)
+        servicer.set('grpc.test.TestServiceUnknown',
+                     health_pb2.HealthCheckResponse.UNKNOWN)
+        servicer.set('grpc.test.TestServiceNotServing',
+                     health_pb2.HealthCheckResponse.NOT_SERVING)
+        server_pool = logging_pool.pool(test_constants.THREAD_CONCURRENCY)
+        self._server = grpc.server(server_pool)
+        port = self._server.add_insecure_port('[::]:0')
+        health_pb2.add_HealthServicer_to_server(servicer, self._server)
+        self._server.start()
 
-    channel = grpc.insecure_channel('localhost:%d' % port)
-    self._stub = health_pb2.HealthStub(channel)
+        channel = grpc.insecure_channel('localhost:%d' % port)
+        self._stub = health_pb2.HealthStub(channel)
 
-  def test_empty_service(self):
-    request = health_pb2.HealthCheckRequest()
-    resp = self._stub.Check(request)
-    self.assertEqual(health_pb2.HealthCheckResponse.SERVING, resp.status)
+    def test_empty_service(self):
+        request = health_pb2.HealthCheckRequest()
+        resp = self._stub.Check(request)
+        self.assertEqual(health_pb2.HealthCheckResponse.SERVING, resp.status)
 
-  def test_serving_service(self):
-    request = health_pb2.HealthCheckRequest(
-        service='grpc.test.TestServiceServing')
-    resp = self._stub.Check(request)
-    self.assertEqual(health_pb2.HealthCheckResponse.SERVING, resp.status)
+    def test_serving_service(self):
+        request = health_pb2.HealthCheckRequest(
+            service='grpc.test.TestServiceServing')
+        resp = self._stub.Check(request)
+        self.assertEqual(health_pb2.HealthCheckResponse.SERVING, resp.status)
 
-  def test_unknown_serivce(self):
-    request = health_pb2.HealthCheckRequest(
-        service='grpc.test.TestServiceUnknown')
-    resp = self._stub.Check(request)
-    self.assertEqual(health_pb2.HealthCheckResponse.UNKNOWN, resp.status)
+    def test_unknown_serivce(self):
+        request = health_pb2.HealthCheckRequest(
+            service='grpc.test.TestServiceUnknown')
+        resp = self._stub.Check(request)
+        self.assertEqual(health_pb2.HealthCheckResponse.UNKNOWN, resp.status)
 
-  def test_not_serving_service(self):
-    request = health_pb2.HealthCheckRequest(
-        service='grpc.test.TestServiceNotServing')
-    resp = self._stub.Check(request)
-    self.assertEqual(health_pb2.HealthCheckResponse.NOT_SERVING, resp.status)
+    def test_not_serving_service(self):
+        request = health_pb2.HealthCheckRequest(
+            service='grpc.test.TestServiceNotServing')
+        resp = self._stub.Check(request)
+        self.assertEqual(health_pb2.HealthCheckResponse.NOT_SERVING,
+                         resp.status)
 
-  def test_not_found_service(self):
-    request = health_pb2.HealthCheckRequest(
-        service='not-found')
-    with self.assertRaises(grpc.RpcError) as context:
-      resp = self._stub.Check(request)
-  
-    self.assertEqual(grpc.StatusCode.NOT_FOUND, context.exception.code())
+    def test_not_found_service(self):
+        request = health_pb2.HealthCheckRequest(service='not-found')
+        with self.assertRaises(grpc.RpcError) as context:
+            resp = self._stub.Check(request)
+
+        self.assertEqual(grpc.StatusCode.NOT_FOUND, context.exception.code())
 
 
 if __name__ == '__main__':
-  unittest.main(verbosity=2)
+    unittest.main(verbosity=2)
diff --git a/src/python/grpcio_tests/tests/http2/_negative_http2_client.py b/src/python/grpcio_tests/tests/http2/_negative_http2_client.py
deleted file mode 100644
index f860468..0000000
--- a/src/python/grpcio_tests/tests/http2/_negative_http2_client.py
+++ /dev/null
@@ -1,153 +0,0 @@
-# Copyright 2016, Google Inc.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-#     * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-#     * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-"""The Python client used to test negative http2 conditions."""
-
-import argparse
-
-import grpc
-from src.proto.grpc.testing import test_pb2
-from src.proto.grpc.testing import messages_pb2
-
-def _validate_payload_type_and_length(response, expected_type, expected_length):
-  if response.payload.type is not expected_type:
-    raise ValueError(
-      'expected payload type %s, got %s' %
-          (expected_type, type(response.payload.type)))
-  elif len(response.payload.body) != expected_length:
-    raise ValueError(
-      'expected payload body size %d, got %d' %
-          (expected_length, len(response.payload.body)))
-
-def _expect_status_code(call, expected_code):
-  if call.code() != expected_code:
-    raise ValueError(
-      'expected code %s, got %s' % (expected_code, call.code()))
-
-def _expect_status_details(call, expected_details):
-  if call.details() != expected_details:
-    raise ValueError(
-      'expected message %s, got %s' % (expected_details, call.details()))
-
-def _validate_status_code_and_details(call, expected_code, expected_details):
-  _expect_status_code(call, expected_code)
-  _expect_status_details(call, expected_details)
-
-# common requests
-_REQUEST_SIZE = 314159
-_RESPONSE_SIZE = 271828
-
-_SIMPLE_REQUEST = messages_pb2.SimpleRequest(
-    response_type=messages_pb2.COMPRESSABLE,
-    response_size=_RESPONSE_SIZE,
-    payload=messages_pb2.Payload(body=b'\x00' * _REQUEST_SIZE))
-
-def _goaway(stub):
-  first_response = stub.UnaryCall(_SIMPLE_REQUEST)
-  _validate_payload_type_and_length(first_response, 
-      messages_pb2.COMPRESSABLE, _RESPONSE_SIZE)
-  second_response = stub.UnaryCall(_SIMPLE_REQUEST)
-  _validate_payload_type_and_length(second_response, 
-      messages_pb2.COMPRESSABLE, _RESPONSE_SIZE)
-
-def _rst_after_header(stub):
-  resp_future = stub.UnaryCall.future(_SIMPLE_REQUEST)
-  _validate_status_code_and_details(resp_future, grpc.StatusCode.UNAVAILABLE, "")
-
-def _rst_during_data(stub):
-  resp_future = stub.UnaryCall.future(_SIMPLE_REQUEST)
-  _validate_status_code_and_details(resp_future, grpc.StatusCode.UNKNOWN, "")
-
-def _rst_after_data(stub):
-  resp_future = stub.UnaryCall.future(_SIMPLE_REQUEST)
-  _validate_payload_type_and_length(next(resp_future),
-      messages_pb2.COMPRESSABLE, _RESPONSE_SIZE)
-  _validate_status_code_and_details(resp_future, grpc.StatusCode.UNKNOWN, "")
-
-def _ping(stub):
-  response = stub.UnaryCall(_SIMPLE_REQUEST)
-  _validate_payload_type_and_length(response, 
-      messages_pb2.COMPRESSABLE, _RESPONSE_SIZE)
-
-def _max_streams(stub):
-  # send one req to ensure server sets MAX_STREAMS
-  response = stub.UnaryCall(_SIMPLE_REQUEST)
-  _validate_payload_type_and_length(response, 
-      messages_pb2.COMPRESSABLE, _RESPONSE_SIZE)
-
-  # give the streams a workout
-  futures = []
-  for _ in range(15):
-    futures.append(stub.UnaryCall.future(_SIMPLE_REQUEST))
-  for future in futures:
-    _validate_payload_type_and_length(future.result(),
-        messages_pb2.COMPRESSABLE, _RESPONSE_SIZE)
-
-def _run_test_case(test_case, stub):
-  if test_case == 'goaway':
-    _goaway(stub)
-  elif test_case == 'rst_after_header':
-    _rst_after_header(stub)
-  elif test_case == 'rst_during_data':
-    _rst_during_data(stub)
-  elif test_case == 'rst_after_data':
-    _rst_after_data(stub)
-  elif test_case =='ping':
-    _ping(stub)
-  elif test_case == 'max_streams':
-    _max_streams(stub)
-  else:
-    raise ValueError("Invalid test case: %s" % test_case)
-
-def _args():
-  parser = argparse.ArgumentParser()
-  parser.add_argument(
-      '--server_host', help='the host to which to connect', type=str,
-      default="127.0.0.1")
-  parser.add_argument(
-      '--server_port', help='the port to which to connect', type=int,
-      default="8080")
-  parser.add_argument(
-      '--test_case', help='the test case to execute', type=str,
-      default="goaway")
-  return parser.parse_args()
-
-def _stub(server_host, server_port):
-  target = '{}:{}'.format(server_host, server_port)
-  channel = grpc.insecure_channel(target)
-  return test_pb2.TestServiceStub(channel)
-
-def main():
-  args = _args()
-  stub = _stub(args.server_host, args.server_port)
-  _run_test_case(args.test_case, stub)
-
-
-if __name__ == '__main__':
-  main()
diff --git a/src/python/grpcio_tests/tests/http2/negative_http2_client.py b/src/python/grpcio_tests/tests/http2/negative_http2_client.py
new file mode 100644
index 0000000..b8adf09
--- /dev/null
+++ b/src/python/grpcio_tests/tests/http2/negative_http2_client.py
@@ -0,0 +1,175 @@
+# Copyright 2016, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""The Python client used to test negative http2 conditions."""
+
+import argparse
+
+import grpc
+from src.proto.grpc.testing import test_pb2
+from src.proto.grpc.testing import messages_pb2
+
+
+def _validate_payload_type_and_length(response, expected_type, expected_length):
+    if response.payload.type is not expected_type:
+        raise ValueError('expected payload type %s, got %s' %
+                         (expected_type, type(response.payload.type)))
+    elif len(response.payload.body) != expected_length:
+        raise ValueError('expected payload body size %d, got %d' %
+                         (expected_length, len(response.payload.body)))
+
+
+def _expect_status_code(call, expected_code):
+    if call.code() != expected_code:
+        raise ValueError('expected code %s, got %s' %
+                         (expected_code, call.code()))
+
+
+def _expect_status_details(call, expected_details):
+    if call.details() != expected_details:
+        raise ValueError('expected message %s, got %s' %
+                         (expected_details, call.details()))
+
+
+def _validate_status_code_and_details(call, expected_code, expected_details):
+    _expect_status_code(call, expected_code)
+    _expect_status_details(call, expected_details)
+
+
+# common requests
+_REQUEST_SIZE = 314159
+_RESPONSE_SIZE = 271828
+
+_SIMPLE_REQUEST = messages_pb2.SimpleRequest(
+    response_type=messages_pb2.COMPRESSABLE,
+    response_size=_RESPONSE_SIZE,
+    payload=messages_pb2.Payload(body=b'\x00' * _REQUEST_SIZE))
+
+
+def _goaway(stub):
+    first_response = stub.UnaryCall(_SIMPLE_REQUEST)
+    _validate_payload_type_and_length(first_response, messages_pb2.COMPRESSABLE,
+                                      _RESPONSE_SIZE)
+    second_response = stub.UnaryCall(_SIMPLE_REQUEST)
+    _validate_payload_type_and_length(second_response,
+                                      messages_pb2.COMPRESSABLE, _RESPONSE_SIZE)
+
+
+def _rst_after_header(stub):
+    resp_future = stub.UnaryCall.future(_SIMPLE_REQUEST)
+    _validate_status_code_and_details(resp_future, grpc.StatusCode.INTERNAL,
+                                      "Received RST_STREAM with error code 0")
+
+
+def _rst_during_data(stub):
+    resp_future = stub.UnaryCall.future(_SIMPLE_REQUEST)
+    _validate_status_code_and_details(resp_future, grpc.StatusCode.INTERNAL,
+                                      "Received RST_STREAM with error code 0")
+
+
+def _rst_after_data(stub):
+    resp_future = stub.UnaryCall.future(_SIMPLE_REQUEST)
+    _validate_payload_type_and_length(
+        next(resp_future), messages_pb2.COMPRESSABLE, _RESPONSE_SIZE)
+    _validate_status_code_and_details(resp_future, grpc.StatusCode.INTERNAL,
+                                      "Received RST_STREAM with error code 0")
+
+
+def _ping(stub):
+    response = stub.UnaryCall(_SIMPLE_REQUEST)
+    _validate_payload_type_and_length(response, messages_pb2.COMPRESSABLE,
+                                      _RESPONSE_SIZE)
+
+
+def _max_streams(stub):
+    # send one req to ensure server sets MAX_STREAMS
+    response = stub.UnaryCall(_SIMPLE_REQUEST)
+    _validate_payload_type_and_length(response, messages_pb2.COMPRESSABLE,
+                                      _RESPONSE_SIZE)
+
+    # give the streams a workout
+    futures = []
+    for _ in range(15):
+        futures.append(stub.UnaryCall.future(_SIMPLE_REQUEST))
+    for future in futures:
+        _validate_payload_type_and_length(
+            future.result(), messages_pb2.COMPRESSABLE, _RESPONSE_SIZE)
+
+
+def _run_test_case(test_case, stub):
+    if test_case == 'goaway':
+        _goaway(stub)
+    elif test_case == 'rst_after_header':
+        _rst_after_header(stub)
+    elif test_case == 'rst_during_data':
+        _rst_during_data(stub)
+    elif test_case == 'rst_after_data':
+        _rst_after_data(stub)
+    elif test_case == 'ping':
+        _ping(stub)
+    elif test_case == 'max_streams':
+        _max_streams(stub)
+    else:
+        raise ValueError("Invalid test case: %s" % test_case)
+
+
+def _args():
+    parser = argparse.ArgumentParser()
+    parser.add_argument(
+        '--server_host',
+        help='the host to which to connect',
+        type=str,
+        default="127.0.0.1")
+    parser.add_argument(
+        '--server_port',
+        help='the port to which to connect',
+        type=int,
+        default="8080")
+    parser.add_argument(
+        '--test_case',
+        help='the test case to execute',
+        type=str,
+        default="goaway")
+    return parser.parse_args()
+
+
+def _stub(server_host, server_port):
+    target = '{}:{}'.format(server_host, server_port)
+    channel = grpc.insecure_channel(target)
+    grpc.channel_ready_future(channel).result()
+    return test_pb2.TestServiceStub(channel)
+
+
+def main():
+    args = _args()
+    stub = _stub(args.server_host, args.server_port)
+    _run_test_case(args.test_case, stub)
+
+
+if __name__ == '__main__':
+    main()
diff --git a/src/python/grpcio_tests/tests/interop/__init__.py b/src/python/grpcio_tests/tests/interop/__init__.py
index 7086519..b893988 100644
--- a/src/python/grpcio_tests/tests/interop/__init__.py
+++ b/src/python/grpcio_tests/tests/interop/__init__.py
@@ -26,5 +26,3 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
diff --git a/src/python/grpcio_tests/tests/interop/_insecure_intraop_test.py b/src/python/grpcio_tests/tests/interop/_insecure_intraop_test.py
index 4fb22b4..58f3b36 100644
--- a/src/python/grpcio_tests/tests/interop/_insecure_intraop_test.py
+++ b/src/python/grpcio_tests/tests/interop/_insecure_intraop_test.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Insecure client-server interoperability as a unit test."""
 
 from concurrent import futures
@@ -40,19 +39,18 @@
 from tests.interop import server
 
 
-class InsecureIntraopTest(
-    _intraop_test_case.IntraopTestCase,
-    unittest.TestCase):
+class InsecureIntraopTest(_intraop_test_case.IntraopTestCase,
+                          unittest.TestCase):
 
-  def setUp(self):
-    self.server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
-    test_pb2.add_TestServiceServicer_to_server(
-        methods.TestService(), self.server)
-    port = self.server.add_insecure_port('[::]:0')
-    self.server.start()
-    self.stub = test_pb2.TestServiceStub(
-        grpc.insecure_channel('localhost:{}'.format(port)))
+    def setUp(self):
+        self.server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
+        test_pb2.add_TestServiceServicer_to_server(methods.TestService(),
+                                                   self.server)
+        port = self.server.add_insecure_port('[::]:0')
+        self.server.start()
+        self.stub = test_pb2.TestServiceStub(
+            grpc.insecure_channel('localhost:{}'.format(port)))
 
 
 if __name__ == '__main__':
-  unittest.main(verbosity=2)
+    unittest.main(verbosity=2)
diff --git a/src/python/grpcio_tests/tests/interop/_intraop_test_case.py b/src/python/grpcio_tests/tests/interop/_intraop_test_case.py
index fe1c173..424f939 100644
--- a/src/python/grpcio_tests/tests/interop/_intraop_test_case.py
+++ b/src/python/grpcio_tests/tests/interop/_intraop_test_case.py
@@ -26,39 +26,41 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Common code for unit tests of the interoperability test code."""
 
 from tests.interop import methods
 
 
 class IntraopTestCase(object):
-  """Unit test methods.
+    """Unit test methods.
 
   This class must be mixed in with unittest.TestCase and a class that defines
   setUp and tearDown methods that manage a stub attribute.
   """
 
-  def testEmptyUnary(self):
-    methods.TestCase.EMPTY_UNARY.test_interoperability(self.stub, None)
+    def testEmptyUnary(self):
+        methods.TestCase.EMPTY_UNARY.test_interoperability(self.stub, None)
 
-  def testLargeUnary(self):
-    methods.TestCase.LARGE_UNARY.test_interoperability(self.stub, None)
+    def testLargeUnary(self):
+        methods.TestCase.LARGE_UNARY.test_interoperability(self.stub, None)
 
-  def testServerStreaming(self):
-    methods.TestCase.SERVER_STREAMING.test_interoperability(self.stub, None)
+    def testServerStreaming(self):
+        methods.TestCase.SERVER_STREAMING.test_interoperability(self.stub, None)
 
-  def testClientStreaming(self):
-    methods.TestCase.CLIENT_STREAMING.test_interoperability(self.stub, None)
+    def testClientStreaming(self):
+        methods.TestCase.CLIENT_STREAMING.test_interoperability(self.stub, None)
 
-  def testPingPong(self):
-    methods.TestCase.PING_PONG.test_interoperability(self.stub, None)
+    def testPingPong(self):
+        methods.TestCase.PING_PONG.test_interoperability(self.stub, None)
 
-  def testCancelAfterBegin(self):
-    methods.TestCase.CANCEL_AFTER_BEGIN.test_interoperability(self.stub, None)
+    def testCancelAfterBegin(self):
+        methods.TestCase.CANCEL_AFTER_BEGIN.test_interoperability(self.stub,
+                                                                  None)
 
-  def testCancelAfterFirstResponse(self):
-    methods.TestCase.CANCEL_AFTER_FIRST_RESPONSE.test_interoperability(self.stub, None)
+    def testCancelAfterFirstResponse(self):
+        methods.TestCase.CANCEL_AFTER_FIRST_RESPONSE.test_interoperability(
+            self.stub, None)
 
-  def testTimeoutOnSleepingServer(self):
-    methods.TestCase.TIMEOUT_ON_SLEEPING_SERVER.test_interoperability(self.stub, None)
+    def testTimeoutOnSleepingServer(self):
+        methods.TestCase.TIMEOUT_ON_SLEEPING_SERVER.test_interoperability(
+            self.stub, None)
diff --git a/src/python/grpcio_tests/tests/interop/_secure_intraop_test.py b/src/python/grpcio_tests/tests/interop/_secure_intraop_test.py
index 3665c69..b28406e 100644
--- a/src/python/grpcio_tests/tests/interop/_secure_intraop_test.py
+++ b/src/python/grpcio_tests/tests/interop/_secure_intraop_test.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Secure client-server interoperability as a unit test."""
 
 from concurrent import futures
@@ -42,24 +41,24 @@
 _SERVER_HOST_OVERRIDE = 'foo.test.google.fr'
 
 
-class SecureIntraopTest(
-    _intraop_test_case.IntraopTestCase,
-    unittest.TestCase):
+class SecureIntraopTest(_intraop_test_case.IntraopTestCase, unittest.TestCase):
 
-  def setUp(self):
-    self.server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
-    test_pb2.add_TestServiceServicer_to_server(
-        methods.TestService(), self.server)
-    port = self.server.add_secure_port(
-        '[::]:0', grpc.ssl_server_credentials(
-            [(resources.private_key(), resources.certificate_chain())]))
-    self.server.start()
-    self.stub = test_pb2.TestServiceStub(
-        grpc.secure_channel(
-            'localhost:{}'.format(port),
-            grpc.ssl_channel_credentials(resources.test_root_certificates()),
-            (('grpc.ssl_target_name_override', _SERVER_HOST_OVERRIDE,),)))
+    def setUp(self):
+        self.server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
+        test_pb2.add_TestServiceServicer_to_server(methods.TestService(),
+                                                   self.server)
+        port = self.server.add_secure_port(
+            '[::]:0',
+            grpc.ssl_server_credentials(
+                [(resources.private_key(), resources.certificate_chain())]))
+        self.server.start()
+        self.stub = test_pb2.TestServiceStub(
+            grpc.secure_channel('localhost:{}'.format(port),
+                                grpc.ssl_channel_credentials(
+                                    resources.test_root_certificates()), ((
+                                        'grpc.ssl_target_name_override',
+                                        _SERVER_HOST_OVERRIDE,),)))
 
 
 if __name__ == '__main__':
-  unittest.main(verbosity=2)
+    unittest.main(verbosity=2)
diff --git a/src/python/grpcio_tests/tests/interop/client.py b/src/python/grpcio_tests/tests/interop/client.py
index afaa466..f177896 100644
--- a/src/python/grpcio_tests/tests/interop/client.py
+++ b/src/python/grpcio_tests/tests/interop/client.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """The Python implementation of the GRPC interoperability test client."""
 
 import argparse
@@ -41,93 +40,107 @@
 
 
 def _args():
-  parser = argparse.ArgumentParser()
-  parser.add_argument(
-      '--server_host', help='the host to which to connect', type=str,
-      default="127.0.0.1")
-  parser.add_argument(
-      '--server_port', help='the port to which to connect', type=int)
-  parser.add_argument(
-      '--test_case', help='the test case to execute', type=str,
-      default="large_unary")
-  parser.add_argument(
-      '--use_tls', help='require a secure connection', default=False,
-      type=resources.parse_bool)
-  parser.add_argument(
-      '--use_test_ca', help='replace platform root CAs with ca.pem',
-      default=False, type=resources.parse_bool)
-  parser.add_argument(
-      '--server_host_override', default="foo.test.google.fr",
-      help='the server host to which to claim to connect', type=str)
-  parser.add_argument('--oauth_scope', help='scope for OAuth tokens', type=str)
-  parser.add_argument(
-      '--default_service_account',
-      help='email address of the default service account', type=str)
-  return parser.parse_args()
+    parser = argparse.ArgumentParser()
+    parser.add_argument(
+        '--server_host',
+        help='the host to which to connect',
+        type=str,
+        default="127.0.0.1")
+    parser.add_argument(
+        '--server_port', help='the port to which to connect', type=int)
+    parser.add_argument(
+        '--test_case',
+        help='the test case to execute',
+        type=str,
+        default="large_unary")
+    parser.add_argument(
+        '--use_tls',
+        help='require a secure connection',
+        default=False,
+        type=resources.parse_bool)
+    parser.add_argument(
+        '--use_test_ca',
+        help='replace platform root CAs with ca.pem',
+        default=False,
+        type=resources.parse_bool)
+    parser.add_argument(
+        '--server_host_override',
+        default="foo.test.google.fr",
+        help='the server host to which to claim to connect',
+        type=str)
+    parser.add_argument(
+        '--oauth_scope', help='scope for OAuth tokens', type=str)
+    parser.add_argument(
+        '--default_service_account',
+        help='email address of the default service account',
+        type=str)
+    return parser.parse_args()
 
 
 def _application_default_credentials():
-  return oauth2client_client.GoogleCredentials.get_application_default()
+    return oauth2client_client.GoogleCredentials.get_application_default()
 
 
 def _stub(args):
-  target = '{}:{}'.format(args.server_host, args.server_port)
-  if args.test_case == 'oauth2_auth_token':
-    google_credentials = _application_default_credentials()
-    scoped_credentials = google_credentials.create_scoped([args.oauth_scope])
-    access_token = scoped_credentials.get_access_token().access_token
-    call_credentials = grpc.access_token_call_credentials(access_token)
-  elif args.test_case == 'compute_engine_creds':
-    google_credentials = _application_default_credentials()
-    scoped_credentials = google_credentials.create_scoped([args.oauth_scope])
-    # TODO(https://github.com/grpc/grpc/issues/6799): Eliminate this last
-    # remaining use of the Beta API.
-    call_credentials = implementations.google_call_credentials(
-        scoped_credentials)
-  elif args.test_case == 'jwt_token_creds':
-    google_credentials = _application_default_credentials()
-    # TODO(https://github.com/grpc/grpc/issues/6799): Eliminate this last
-    # remaining use of the Beta API.
-    call_credentials = implementations.google_call_credentials(
-        google_credentials)
-  else:
-    call_credentials = None
-  if args.use_tls:
-    if args.use_test_ca:
-      root_certificates = resources.test_root_certificates()
+    target = '{}:{}'.format(args.server_host, args.server_port)
+    if args.test_case == 'oauth2_auth_token':
+        google_credentials = _application_default_credentials()
+        scoped_credentials = google_credentials.create_scoped(
+            [args.oauth_scope])
+        access_token = scoped_credentials.get_access_token().access_token
+        call_credentials = grpc.access_token_call_credentials(access_token)
+    elif args.test_case == 'compute_engine_creds':
+        google_credentials = _application_default_credentials()
+        scoped_credentials = google_credentials.create_scoped(
+            [args.oauth_scope])
+        # TODO(https://github.com/grpc/grpc/issues/6799): Eliminate this last
+        # remaining use of the Beta API.
+        call_credentials = implementations.google_call_credentials(
+            scoped_credentials)
+    elif args.test_case == 'jwt_token_creds':
+        google_credentials = _application_default_credentials()
+        # TODO(https://github.com/grpc/grpc/issues/6799): Eliminate this last
+        # remaining use of the Beta API.
+        call_credentials = implementations.google_call_credentials(
+            google_credentials)
     else:
-      root_certificates = None  # will load default roots.
+        call_credentials = None
+    if args.use_tls:
+        if args.use_test_ca:
+            root_certificates = resources.test_root_certificates()
+        else:
+            root_certificates = None  # will load default roots.
 
-    channel_credentials = grpc.ssl_channel_credentials(root_certificates)
-    if call_credentials is not None:
-      channel_credentials = grpc.composite_channel_credentials(
-          channel_credentials, call_credentials)
+        channel_credentials = grpc.ssl_channel_credentials(root_certificates)
+        if call_credentials is not None:
+            channel_credentials = grpc.composite_channel_credentials(
+                channel_credentials, call_credentials)
 
-    channel = grpc.secure_channel(
-        target, channel_credentials,
-        (('grpc.ssl_target_name_override', args.server_host_override,),))
-  else:
-    channel = grpc.insecure_channel(target)
-  if args.test_case == "unimplemented_service":
-    return test_pb2.UnimplementedServiceStub(channel)
-  else:
-    return test_pb2.TestServiceStub(channel)
+        channel = grpc.secure_channel(target, channel_credentials, ((
+            'grpc.ssl_target_name_override',
+            args.server_host_override,),))
+    else:
+        channel = grpc.insecure_channel(target)
+    if args.test_case == "unimplemented_service":
+        return test_pb2.UnimplementedServiceStub(channel)
+    else:
+        return test_pb2.TestServiceStub(channel)
 
 
 def _test_case_from_arg(test_case_arg):
-  for test_case in methods.TestCase:
-    if test_case_arg == test_case.value:
-      return test_case
-  else:
-    raise ValueError('No test case "%s"!' % test_case_arg)
+    for test_case in methods.TestCase:
+        if test_case_arg == test_case.value:
+            return test_case
+    else:
+        raise ValueError('No test case "%s"!' % test_case_arg)
 
 
 def test_interoperability():
-  args = _args()
-  stub = _stub(args)
-  test_case = _test_case_from_arg(args.test_case)
-  test_case.test_interoperability(stub, args)
+    args = _args()
+    stub = _stub(args)
+    test_case = _test_case_from_arg(args.test_case)
+    test_case.test_interoperability(stub, args)
 
 
 if __name__ == '__main__':
-  test_interoperability()
+    test_interoperability()
diff --git a/src/python/grpcio_tests/tests/interop/methods.py b/src/python/grpcio_tests/tests/interop/methods.py
index 9038ae5..bdb2585 100644
--- a/src/python/grpcio_tests/tests/interop/methods.py
+++ b/src/python/grpcio_tests/tests/interop/methods.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Implementations of interoperability test methods."""
 
 import enum
@@ -46,463 +45,482 @@
 _INITIAL_METADATA_KEY = "x-grpc-test-echo-initial"
 _TRAILING_METADATA_KEY = "x-grpc-test-echo-trailing-bin"
 
+
 def _maybe_echo_metadata(servicer_context):
-  """Copies metadata from request to response if it is present."""
-  invocation_metadata = dict(servicer_context.invocation_metadata())
-  if _INITIAL_METADATA_KEY in invocation_metadata:
-    initial_metadatum = (
-        _INITIAL_METADATA_KEY, invocation_metadata[_INITIAL_METADATA_KEY])
-    servicer_context.send_initial_metadata((initial_metadatum,))
-  if _TRAILING_METADATA_KEY in invocation_metadata:
-    trailing_metadatum = (
-      _TRAILING_METADATA_KEY, invocation_metadata[_TRAILING_METADATA_KEY])
-    servicer_context.set_trailing_metadata((trailing_metadatum,))
+    """Copies metadata from request to response if it is present."""
+    invocation_metadata = dict(servicer_context.invocation_metadata())
+    if _INITIAL_METADATA_KEY in invocation_metadata:
+        initial_metadatum = (_INITIAL_METADATA_KEY,
+                             invocation_metadata[_INITIAL_METADATA_KEY])
+        servicer_context.send_initial_metadata((initial_metadatum,))
+    if _TRAILING_METADATA_KEY in invocation_metadata:
+        trailing_metadatum = (_TRAILING_METADATA_KEY,
+                              invocation_metadata[_TRAILING_METADATA_KEY])
+        servicer_context.set_trailing_metadata((trailing_metadatum,))
+
 
 def _maybe_echo_status_and_message(request, servicer_context):
-  """Sets the response context code and details if the request asks for them"""
-  if request.HasField('response_status'):
-    servicer_context.set_code(request.response_status.code)
-    servicer_context.set_details(request.response_status.message)
+    """Sets the response context code and details if the request asks for them"""
+    if request.HasField('response_status'):
+        servicer_context.set_code(request.response_status.code)
+        servicer_context.set_details(request.response_status.message)
+
 
 class TestService(test_pb2.TestServiceServicer):
 
-  def EmptyCall(self, request, context):
-    _maybe_echo_metadata(context)
-    return empty_pb2.Empty()
+    def EmptyCall(self, request, context):
+        _maybe_echo_metadata(context)
+        return empty_pb2.Empty()
 
-  def UnaryCall(self, request, context):
-    _maybe_echo_metadata(context)
-    _maybe_echo_status_and_message(request, context)
-    return messages_pb2.SimpleResponse(
-        payload=messages_pb2.Payload(
+    def UnaryCall(self, request, context):
+        _maybe_echo_metadata(context)
+        _maybe_echo_status_and_message(request, context)
+        return messages_pb2.SimpleResponse(payload=messages_pb2.Payload(
             type=messages_pb2.COMPRESSABLE,
             body=b'\x00' * request.response_size))
 
-  def StreamingOutputCall(self, request, context):
-    _maybe_echo_status_and_message(request, context)
-    for response_parameters in request.response_parameters:
-      yield messages_pb2.StreamingOutputCallResponse(
-          payload=messages_pb2.Payload(
-              type=request.response_type,
-              body=b'\x00' * response_parameters.size))
+    def StreamingOutputCall(self, request, context):
+        _maybe_echo_status_and_message(request, context)
+        for response_parameters in request.response_parameters:
+            yield messages_pb2.StreamingOutputCallResponse(
+                payload=messages_pb2.Payload(
+                    type=request.response_type,
+                    body=b'\x00' * response_parameters.size))
 
-  def StreamingInputCall(self, request_iterator, context):
-    aggregate_size = 0
-    for request in request_iterator:
-      if request.payload is not None and request.payload.body:
-        aggregate_size += len(request.payload.body)
-    return messages_pb2.StreamingInputCallResponse(
-        aggregated_payload_size=aggregate_size)
+    def StreamingInputCall(self, request_iterator, context):
+        aggregate_size = 0
+        for request in request_iterator:
+            if request.payload is not None and request.payload.body:
+                aggregate_size += len(request.payload.body)
+        return messages_pb2.StreamingInputCallResponse(
+            aggregated_payload_size=aggregate_size)
 
-  def FullDuplexCall(self, request_iterator, context):
-    _maybe_echo_metadata(context)
-    for request in request_iterator:
-      _maybe_echo_status_and_message(request, context)
-      for response_parameters in request.response_parameters:
-        yield messages_pb2.StreamingOutputCallResponse(
-            payload=messages_pb2.Payload(
-                type=request.payload.type,
-                body=b'\x00' * response_parameters.size))
+    def FullDuplexCall(self, request_iterator, context):
+        _maybe_echo_metadata(context)
+        for request in request_iterator:
+            _maybe_echo_status_and_message(request, context)
+            for response_parameters in request.response_parameters:
+                yield messages_pb2.StreamingOutputCallResponse(
+                    payload=messages_pb2.Payload(
+                        type=request.payload.type,
+                        body=b'\x00' * response_parameters.size))
 
-  # NOTE(nathaniel): Apparently this is the same as the full-duplex call?
-  # NOTE(atash): It isn't even called in the interop spec (Oct 22 2015)...
-  def HalfDuplexCall(self, request_iterator, context):
-    return self.FullDuplexCall(request_iterator, context)
+    # NOTE(nathaniel): Apparently this is the same as the full-duplex call?
+    # NOTE(atash): It isn't even called in the interop spec (Oct 22 2015)...
+    def HalfDuplexCall(self, request_iterator, context):
+        return self.FullDuplexCall(request_iterator, context)
 
 
 def _expect_status_code(call, expected_code):
-  if call.code() != expected_code:
-    raise ValueError(
-      'expected code %s, got %s' % (expected_code, call.code()))
+    if call.code() != expected_code:
+        raise ValueError('expected code %s, got %s' %
+                         (expected_code, call.code()))
 
 
 def _expect_status_details(call, expected_details):
-  if call.details() != expected_details:
-    raise ValueError(
-      'expected message %s, got %s' % (expected_details, call.details()))
+    if call.details() != expected_details:
+        raise ValueError('expected message %s, got %s' %
+                         (expected_details, call.details()))
 
 
 def _validate_status_code_and_details(call, expected_code, expected_details):
-  _expect_status_code(call, expected_code)
-  _expect_status_details(call, expected_details)
+    _expect_status_code(call, expected_code)
+    _expect_status_details(call, expected_details)
 
 
 def _validate_payload_type_and_length(response, expected_type, expected_length):
-  if response.payload.type is not expected_type:
-    raise ValueError(
-      'expected payload type %s, got %s' %
-          (expected_type, type(response.payload.type)))
-  elif len(response.payload.body) != expected_length:
-    raise ValueError(
-      'expected payload body size %d, got %d' %
-          (expected_length, len(response.payload.body)))
+    if response.payload.type is not expected_type:
+        raise ValueError('expected payload type %s, got %s' %
+                         (expected_type, type(response.payload.type)))
+    elif len(response.payload.body) != expected_length:
+        raise ValueError('expected payload body size %d, got %d' %
+                         (expected_length, len(response.payload.body)))
 
 
-def _large_unary_common_behavior(
-    stub, fill_username, fill_oauth_scope, call_credentials):
-  size = 314159
-  request = messages_pb2.SimpleRequest(
-      response_type=messages_pb2.COMPRESSABLE, response_size=size,
-      payload=messages_pb2.Payload(body=b'\x00' * 271828),
-      fill_username=fill_username, fill_oauth_scope=fill_oauth_scope)
-  response_future = stub.UnaryCall.future(
-      request, credentials=call_credentials)
-  response = response_future.result()
-  _validate_payload_type_and_length(response, messages_pb2.COMPRESSABLE, size)
-  return response
+def _large_unary_common_behavior(stub, fill_username, fill_oauth_scope,
+                                 call_credentials):
+    size = 314159
+    request = messages_pb2.SimpleRequest(
+        response_type=messages_pb2.COMPRESSABLE,
+        response_size=size,
+        payload=messages_pb2.Payload(body=b'\x00' * 271828),
+        fill_username=fill_username,
+        fill_oauth_scope=fill_oauth_scope)
+    response_future = stub.UnaryCall.future(
+        request, credentials=call_credentials)
+    response = response_future.result()
+    _validate_payload_type_and_length(response, messages_pb2.COMPRESSABLE, size)
+    return response
 
 
 def _empty_unary(stub):
-  response = stub.EmptyCall(empty_pb2.Empty())
-  if not isinstance(response, empty_pb2.Empty):
-    raise TypeError(
-        'response is of type "%s", not empty_pb2.Empty!', type(response))
+    response = stub.EmptyCall(empty_pb2.Empty())
+    if not isinstance(response, empty_pb2.Empty):
+        raise TypeError('response is of type "%s", not empty_pb2.Empty!',
+                        type(response))
 
 
 def _large_unary(stub):
-  _large_unary_common_behavior(stub, False, False, None)
+    _large_unary_common_behavior(stub, False, False, None)
 
 
 def _client_streaming(stub):
-  payload_body_sizes = (27182, 8, 1828, 45904,)
-  payloads = (
-      messages_pb2.Payload(body=b'\x00' * size)
-      for size in payload_body_sizes)
-  requests = (
-      messages_pb2.StreamingInputCallRequest(payload=payload)
-      for payload in payloads)
-  response = stub.StreamingInputCall(requests)
-  if response.aggregated_payload_size != 74922:
-    raise ValueError(
-        'incorrect size %d!' % response.aggregated_payload_size)
+    payload_body_sizes = (
+        27182,
+        8,
+        1828,
+        45904,)
+    payloads = (messages_pb2.Payload(body=b'\x00' * size)
+                for size in payload_body_sizes)
+    requests = (messages_pb2.StreamingInputCallRequest(payload=payload)
+                for payload in payloads)
+    response = stub.StreamingInputCall(requests)
+    if response.aggregated_payload_size != 74922:
+        raise ValueError('incorrect size %d!' %
+                         response.aggregated_payload_size)
 
 
 def _server_streaming(stub):
-  sizes = (31415, 9, 2653, 58979,)
+    sizes = (
+        31415,
+        9,
+        2653,
+        58979,)
 
-  request = messages_pb2.StreamingOutputCallRequest(
-      response_type=messages_pb2.COMPRESSABLE,
-      response_parameters=(
-          messages_pb2.ResponseParameters(size=sizes[0]),
-          messages_pb2.ResponseParameters(size=sizes[1]),
-          messages_pb2.ResponseParameters(size=sizes[2]),
-          messages_pb2.ResponseParameters(size=sizes[3]),
-      )
-  )
-  response_iterator = stub.StreamingOutputCall(request)
-  for index, response in enumerate(response_iterator):
-    _validate_payload_type_and_length(
-        response, messages_pb2.COMPRESSABLE, sizes[index])
-
+    request = messages_pb2.StreamingOutputCallRequest(
+        response_type=messages_pb2.COMPRESSABLE,
+        response_parameters=(
+            messages_pb2.ResponseParameters(size=sizes[0]),
+            messages_pb2.ResponseParameters(size=sizes[1]),
+            messages_pb2.ResponseParameters(size=sizes[2]),
+            messages_pb2.ResponseParameters(size=sizes[3]),))
+    response_iterator = stub.StreamingOutputCall(request)
+    for index, response in enumerate(response_iterator):
+        _validate_payload_type_and_length(response, messages_pb2.COMPRESSABLE,
+                                          sizes[index])
 
 
 class _Pipe(object):
 
-  def __init__(self):
-    self._condition = threading.Condition()
-    self._values = []
-    self._open = True
+    def __init__(self):
+        self._condition = threading.Condition()
+        self._values = []
+        self._open = True
 
-  def __iter__(self):
-    return self
+    def __iter__(self):
+        return self
 
-  def __next__(self):
-    return self.next()
+    def __next__(self):
+        return self.next()
 
-  def next(self):
-    with self._condition:
-      while not self._values and self._open:
-        self._condition.wait()
-      if self._values:
-        return self._values.pop(0)
-      else:
-        raise StopIteration()
+    def next(self):
+        with self._condition:
+            while not self._values and self._open:
+                self._condition.wait()
+            if self._values:
+                return self._values.pop(0)
+            else:
+                raise StopIteration()
 
-  def add(self, value):
-    with self._condition:
-      self._values.append(value)
-      self._condition.notify()
+    def add(self, value):
+        with self._condition:
+            self._values.append(value)
+            self._condition.notify()
 
-  def close(self):
-    with self._condition:
-      self._open = False
-      self._condition.notify()
+    def close(self):
+        with self._condition:
+            self._open = False
+            self._condition.notify()
 
-  def __enter__(self):
-    return self
+    def __enter__(self):
+        return self
 
-  def __exit__(self, type, value, traceback):
-    self.close()
+    def __exit__(self, type, value, traceback):
+        self.close()
 
 
 def _ping_pong(stub):
-  request_response_sizes = (31415, 9, 2653, 58979,)
-  request_payload_sizes = (27182, 8, 1828, 45904,)
+    request_response_sizes = (
+        31415,
+        9,
+        2653,
+        58979,)
+    request_payload_sizes = (
+        27182,
+        8,
+        1828,
+        45904,)
 
-  with _Pipe() as pipe:
-    response_iterator = stub.FullDuplexCall(pipe)
-    for response_size, payload_size in zip(
-        request_response_sizes, request_payload_sizes):
-      request = messages_pb2.StreamingOutputCallRequest(
-          response_type=messages_pb2.COMPRESSABLE,
-          response_parameters=(
-              messages_pb2.ResponseParameters(size=response_size),),
-          payload=messages_pb2.Payload(body=b'\x00' * payload_size))
-      pipe.add(request)
-      response = next(response_iterator)
-      _validate_payload_type_and_length(
-          response, messages_pb2.COMPRESSABLE, response_size)
+    with _Pipe() as pipe:
+        response_iterator = stub.FullDuplexCall(pipe)
+        for response_size, payload_size in zip(request_response_sizes,
+                                               request_payload_sizes):
+            request = messages_pb2.StreamingOutputCallRequest(
+                response_type=messages_pb2.COMPRESSABLE,
+                response_parameters=(
+                    messages_pb2.ResponseParameters(size=response_size),),
+                payload=messages_pb2.Payload(body=b'\x00' * payload_size))
+            pipe.add(request)
+            response = next(response_iterator)
+            _validate_payload_type_and_length(
+                response, messages_pb2.COMPRESSABLE, response_size)
 
 
 def _cancel_after_begin(stub):
-  with _Pipe() as pipe:
-    response_future = stub.StreamingInputCall.future(pipe)
-    response_future.cancel()
-    if not response_future.cancelled():
-      raise ValueError('expected cancelled method to return True')
-    if response_future.code() is not grpc.StatusCode.CANCELLED:
-      raise ValueError('expected status code CANCELLED')
+    with _Pipe() as pipe:
+        response_future = stub.StreamingInputCall.future(pipe)
+        response_future.cancel()
+        if not response_future.cancelled():
+            raise ValueError('expected cancelled method to return True')
+        if response_future.code() is not grpc.StatusCode.CANCELLED:
+            raise ValueError('expected status code CANCELLED')
 
 
 def _cancel_after_first_response(stub):
-  request_response_sizes = (31415, 9, 2653, 58979,)
-  request_payload_sizes = (27182, 8, 1828, 45904,)
-  with _Pipe() as pipe:
-    response_iterator = stub.FullDuplexCall(pipe)
+    request_response_sizes = (
+        31415,
+        9,
+        2653,
+        58979,)
+    request_payload_sizes = (
+        27182,
+        8,
+        1828,
+        45904,)
+    with _Pipe() as pipe:
+        response_iterator = stub.FullDuplexCall(pipe)
 
-    response_size = request_response_sizes[0]
-    payload_size = request_payload_sizes[0]
-    request = messages_pb2.StreamingOutputCallRequest(
-        response_type=messages_pb2.COMPRESSABLE,
-        response_parameters=(
-            messages_pb2.ResponseParameters(size=response_size),),
-        payload=messages_pb2.Payload(body=b'\x00' * payload_size))
-    pipe.add(request)
-    response = next(response_iterator)
-    # We test the contents of `response` in the Ping Pong test - don't check
-    # them here.
-    response_iterator.cancel()
+        response_size = request_response_sizes[0]
+        payload_size = request_payload_sizes[0]
+        request = messages_pb2.StreamingOutputCallRequest(
+            response_type=messages_pb2.COMPRESSABLE,
+            response_parameters=(
+                messages_pb2.ResponseParameters(size=response_size),),
+            payload=messages_pb2.Payload(body=b'\x00' * payload_size))
+        pipe.add(request)
+        response = next(response_iterator)
+        # We test the contents of `response` in the Ping Pong test - don't check
+        # them here.
+        response_iterator.cancel()
 
-    try:
-      next(response_iterator)
-    except grpc.RpcError as rpc_error:
-      if rpc_error.code() is not grpc.StatusCode.CANCELLED:
-        raise
-    else:
-      raise ValueError('expected call to be cancelled')
+        try:
+            next(response_iterator)
+        except grpc.RpcError as rpc_error:
+            if rpc_error.code() is not grpc.StatusCode.CANCELLED:
+                raise
+        else:
+            raise ValueError('expected call to be cancelled')
 
 
 def _timeout_on_sleeping_server(stub):
-  request_payload_size = 27182
-  with _Pipe() as pipe:
-    response_iterator = stub.FullDuplexCall(pipe, timeout=0.001)
+    request_payload_size = 27182
+    with _Pipe() as pipe:
+        response_iterator = stub.FullDuplexCall(pipe, timeout=0.001)
 
-    request = messages_pb2.StreamingOutputCallRequest(
-        response_type=messages_pb2.COMPRESSABLE,
-        payload=messages_pb2.Payload(body=b'\x00' * request_payload_size))
-    pipe.add(request)
-    try:
-      next(response_iterator)
-    except grpc.RpcError as rpc_error:
-      if rpc_error.code() is not grpc.StatusCode.DEADLINE_EXCEEDED:
-        raise
-    else:
-      raise ValueError('expected call to exceed deadline')
+        request = messages_pb2.StreamingOutputCallRequest(
+            response_type=messages_pb2.COMPRESSABLE,
+            payload=messages_pb2.Payload(body=b'\x00' * request_payload_size))
+        pipe.add(request)
+        try:
+            next(response_iterator)
+        except grpc.RpcError as rpc_error:
+            if rpc_error.code() is not grpc.StatusCode.DEADLINE_EXCEEDED:
+                raise
+        else:
+            raise ValueError('expected call to exceed deadline')
 
 
 def _empty_stream(stub):
-  with _Pipe() as pipe:
-    response_iterator = stub.FullDuplexCall(pipe)
-    pipe.close()
-    try:
-      next(response_iterator)
-      raise ValueError('expected exactly 0 responses')
-    except StopIteration:
-      pass
+    with _Pipe() as pipe:
+        response_iterator = stub.FullDuplexCall(pipe)
+        pipe.close()
+        try:
+            next(response_iterator)
+            raise ValueError('expected exactly 0 responses')
+        except StopIteration:
+            pass
 
 
 def _status_code_and_message(stub):
-  details = 'test status message'
-  code = 2
-  status = grpc.StatusCode.UNKNOWN # code = 2
+    details = 'test status message'
+    code = 2
+    status = grpc.StatusCode.UNKNOWN  # code = 2
 
-  # Test with a UnaryCall
-  request = messages_pb2.SimpleRequest(
-      response_type=messages_pb2.COMPRESSABLE,
-      response_size=1,
-      payload=messages_pb2.Payload(body=b'\x00'),
-      response_status=messages_pb2.EchoStatus(code=code, message=details)
-  )
-  response_future = stub.UnaryCall.future(request)
-  _validate_status_code_and_details(response_future, status, details)
-
-  # Test with a FullDuplexCall
-  with _Pipe() as pipe:
-    response_iterator = stub.FullDuplexCall(pipe)
-    request = messages_pb2.StreamingOutputCallRequest(
+    # Test with a UnaryCall
+    request = messages_pb2.SimpleRequest(
         response_type=messages_pb2.COMPRESSABLE,
-        response_parameters=(
-            messages_pb2.ResponseParameters(size=1),),
+        response_size=1,
         payload=messages_pb2.Payload(body=b'\x00'),
-        response_status=messages_pb2.EchoStatus(code=code, message=details))
-    pipe.add(request)   # sends the initial request.
-  # Dropping out of with block closes the pipe
-  _validate_status_code_and_details(response_iterator, status, details)
+        response_status=messages_pb2.EchoStatus(
+            code=code, message=details))
+    response_future = stub.UnaryCall.future(request)
+    _validate_status_code_and_details(response_future, status, details)
+
+    # Test with a FullDuplexCall
+    with _Pipe() as pipe:
+        response_iterator = stub.FullDuplexCall(pipe)
+        request = messages_pb2.StreamingOutputCallRequest(
+            response_type=messages_pb2.COMPRESSABLE,
+            response_parameters=(messages_pb2.ResponseParameters(size=1),),
+            payload=messages_pb2.Payload(body=b'\x00'),
+            response_status=messages_pb2.EchoStatus(
+                code=code, message=details))
+        pipe.add(request)  # sends the initial request.
+    # Dropping out of with block closes the pipe
+    _validate_status_code_and_details(response_iterator, status, details)
 
 
 def _unimplemented_method(test_service_stub):
-  response_future = (
-      test_service_stub.UnimplementedCall.future(empty_pb2.Empty()))
-  _expect_status_code(response_future, grpc.StatusCode.UNIMPLEMENTED)
+    response_future = (
+        test_service_stub.UnimplementedCall.future(empty_pb2.Empty()))
+    _expect_status_code(response_future, grpc.StatusCode.UNIMPLEMENTED)
 
 
 def _unimplemented_service(unimplemented_service_stub):
-  response_future = (
-      unimplemented_service_stub.UnimplementedCall.future(empty_pb2.Empty()))
-  _expect_status_code(response_future, grpc.StatusCode.UNIMPLEMENTED)
+    response_future = (
+        unimplemented_service_stub.UnimplementedCall.future(empty_pb2.Empty()))
+    _expect_status_code(response_future, grpc.StatusCode.UNIMPLEMENTED)
 
 
 def _custom_metadata(stub):
-  initial_metadata_value = "test_initial_metadata_value"
-  trailing_metadata_value = "\x0a\x0b\x0a\x0b\x0a\x0b"
-  metadata = (
-      (_INITIAL_METADATA_KEY, initial_metadata_value),
-      (_TRAILING_METADATA_KEY, trailing_metadata_value))
+    initial_metadata_value = "test_initial_metadata_value"
+    trailing_metadata_value = "\x0a\x0b\x0a\x0b\x0a\x0b"
+    metadata = ((_INITIAL_METADATA_KEY, initial_metadata_value),
+                (_TRAILING_METADATA_KEY, trailing_metadata_value))
 
-  def _validate_metadata(response):
-    initial_metadata = dict(response.initial_metadata())
-    if initial_metadata[_INITIAL_METADATA_KEY] != initial_metadata_value:
-      raise ValueError(
-        'expected initial metadata %s, got %s' % (
-            initial_metadata_value, initial_metadata[_INITIAL_METADATA_KEY]))
-    trailing_metadata = dict(response.trailing_metadata())
-    if trailing_metadata[_TRAILING_METADATA_KEY] != trailing_metadata_value:
-      raise ValueError(
-        'expected trailing metadata %s, got %s' % (
-            trailing_metadata_value, initial_metadata[_TRAILING_METADATA_KEY]))
+    def _validate_metadata(response):
+        initial_metadata = dict(response.initial_metadata())
+        if initial_metadata[_INITIAL_METADATA_KEY] != initial_metadata_value:
+            raise ValueError('expected initial metadata %s, got %s' %
+                             (initial_metadata_value,
+                              initial_metadata[_INITIAL_METADATA_KEY]))
+        trailing_metadata = dict(response.trailing_metadata())
+        if trailing_metadata[_TRAILING_METADATA_KEY] != trailing_metadata_value:
+            raise ValueError('expected trailing metadata %s, got %s' %
+                             (trailing_metadata_value,
+                              initial_metadata[_TRAILING_METADATA_KEY]))
 
-  # Testing with UnaryCall
-  request = messages_pb2.SimpleRequest(
-      response_type=messages_pb2.COMPRESSABLE,
-      response_size=1,
-      payload=messages_pb2.Payload(body=b'\x00'))
-  response_future = stub.UnaryCall.future(request, metadata=metadata)
-  _validate_metadata(response_future)
-
-  # Testing with FullDuplexCall
-  with _Pipe() as pipe:
-    response_iterator = stub.FullDuplexCall(pipe, metadata=metadata)
-    request = messages_pb2.StreamingOutputCallRequest(
+    # Testing with UnaryCall
+    request = messages_pb2.SimpleRequest(
         response_type=messages_pb2.COMPRESSABLE,
-        response_parameters=(
-            messages_pb2.ResponseParameters(size=1),))
-    pipe.add(request)   # Sends the request
-    next(response_iterator)    # Causes server to send trailing metadata
-  # Dropping out of the with block closes the pipe
-  _validate_metadata(response_iterator)
+        response_size=1,
+        payload=messages_pb2.Payload(body=b'\x00'))
+    response_future = stub.UnaryCall.future(request, metadata=metadata)
+    _validate_metadata(response_future)
+
+    # Testing with FullDuplexCall
+    with _Pipe() as pipe:
+        response_iterator = stub.FullDuplexCall(pipe, metadata=metadata)
+        request = messages_pb2.StreamingOutputCallRequest(
+            response_type=messages_pb2.COMPRESSABLE,
+            response_parameters=(messages_pb2.ResponseParameters(size=1),))
+        pipe.add(request)  # Sends the request
+        next(response_iterator)  # Causes server to send trailing metadata
+    # Dropping out of the with block closes the pipe
+    _validate_metadata(response_iterator)
+
 
 def _compute_engine_creds(stub, args):
-  response = _large_unary_common_behavior(stub, True, True, None)
-  if args.default_service_account != response.username:
-    raise ValueError(
-        'expected username %s, got %s' % (
-            args.default_service_account, response.username))
+    response = _large_unary_common_behavior(stub, True, True, None)
+    if args.default_service_account != response.username:
+        raise ValueError('expected username %s, got %s' %
+                         (args.default_service_account, response.username))
 
 
 def _oauth2_auth_token(stub, args):
-  json_key_filename = os.environ[
-      oauth2client_client.GOOGLE_APPLICATION_CREDENTIALS]
-  wanted_email = json.load(open(json_key_filename, 'rb'))['client_email']
-  response = _large_unary_common_behavior(stub, True, True, None)
-  if wanted_email != response.username:
-    raise ValueError(
-        'expected username %s, got %s' % (wanted_email, response.username))
-  if args.oauth_scope.find(response.oauth_scope) == -1:
-    raise ValueError(
-        'expected to find oauth scope "{}" in received "{}"'.format(
-            response.oauth_scope, args.oauth_scope))
+    json_key_filename = os.environ[oauth2client_client.
+                                   GOOGLE_APPLICATION_CREDENTIALS]
+    wanted_email = json.load(open(json_key_filename, 'rb'))['client_email']
+    response = _large_unary_common_behavior(stub, True, True, None)
+    if wanted_email != response.username:
+        raise ValueError('expected username %s, got %s' %
+                         (wanted_email, response.username))
+    if args.oauth_scope.find(response.oauth_scope) == -1:
+        raise ValueError('expected to find oauth scope "{}" in received "{}"'.
+                         format(response.oauth_scope, args.oauth_scope))
 
 
 def _jwt_token_creds(stub, args):
-  json_key_filename = os.environ[
-      oauth2client_client.GOOGLE_APPLICATION_CREDENTIALS]
-  wanted_email = json.load(open(json_key_filename, 'rb'))['client_email']
-  response = _large_unary_common_behavior(stub, True, False, None)
-  if wanted_email != response.username:
-    raise ValueError(
-        'expected username %s, got %s' % (wanted_email, response.username))
+    json_key_filename = os.environ[oauth2client_client.
+                                   GOOGLE_APPLICATION_CREDENTIALS]
+    wanted_email = json.load(open(json_key_filename, 'rb'))['client_email']
+    response = _large_unary_common_behavior(stub, True, False, None)
+    if wanted_email != response.username:
+        raise ValueError('expected username %s, got %s' %
+                         (wanted_email, response.username))
 
 
 def _per_rpc_creds(stub, args):
-  json_key_filename = os.environ[
-      oauth2client_client.GOOGLE_APPLICATION_CREDENTIALS]
-  wanted_email = json.load(open(json_key_filename, 'rb'))['client_email']
-  credentials = oauth2client_client.GoogleCredentials.get_application_default()
-  scoped_credentials = credentials.create_scoped([args.oauth_scope])
-  # TODO(https://github.com/grpc/grpc/issues/6799): Eliminate this last
-  # remaining use of the Beta API.
-  call_credentials = implementations.google_call_credentials(
-      scoped_credentials)
-  response = _large_unary_common_behavior(stub, True, False, call_credentials)
-  if wanted_email != response.username:
-    raise ValueError(
-        'expected username %s, got %s' % (wanted_email, response.username))
+    json_key_filename = os.environ[oauth2client_client.
+                                   GOOGLE_APPLICATION_CREDENTIALS]
+    wanted_email = json.load(open(json_key_filename, 'rb'))['client_email']
+    credentials = oauth2client_client.GoogleCredentials.get_application_default()
+    scoped_credentials = credentials.create_scoped([args.oauth_scope])
+    # TODO(https://github.com/grpc/grpc/issues/6799): Eliminate this last
+    # remaining use of the Beta API.
+    call_credentials = implementations.google_call_credentials(
+        scoped_credentials)
+    response = _large_unary_common_behavior(stub, True, False, call_credentials)
+    if wanted_email != response.username:
+        raise ValueError('expected username %s, got %s' %
+                         (wanted_email, response.username))
 
 
 @enum.unique
 class TestCase(enum.Enum):
-  EMPTY_UNARY = 'empty_unary'
-  LARGE_UNARY = 'large_unary'
-  SERVER_STREAMING = 'server_streaming'
-  CLIENT_STREAMING = 'client_streaming'
-  PING_PONG = 'ping_pong'
-  CANCEL_AFTER_BEGIN = 'cancel_after_begin'
-  CANCEL_AFTER_FIRST_RESPONSE = 'cancel_after_first_response'
-  EMPTY_STREAM = 'empty_stream'
-  STATUS_CODE_AND_MESSAGE = 'status_code_and_message'
-  UNIMPLEMENTED_METHOD = 'unimplemented_method'
-  UNIMPLEMENTED_SERVICE = 'unimplemented_service'
-  CUSTOM_METADATA = "custom_metadata"
-  COMPUTE_ENGINE_CREDS = 'compute_engine_creds'
-  OAUTH2_AUTH_TOKEN = 'oauth2_auth_token'
-  JWT_TOKEN_CREDS = 'jwt_token_creds'
-  PER_RPC_CREDS = 'per_rpc_creds'
-  TIMEOUT_ON_SLEEPING_SERVER = 'timeout_on_sleeping_server'
+    EMPTY_UNARY = 'empty_unary'
+    LARGE_UNARY = 'large_unary'
+    SERVER_STREAMING = 'server_streaming'
+    CLIENT_STREAMING = 'client_streaming'
+    PING_PONG = 'ping_pong'
+    CANCEL_AFTER_BEGIN = 'cancel_after_begin'
+    CANCEL_AFTER_FIRST_RESPONSE = 'cancel_after_first_response'
+    EMPTY_STREAM = 'empty_stream'
+    STATUS_CODE_AND_MESSAGE = 'status_code_and_message'
+    UNIMPLEMENTED_METHOD = 'unimplemented_method'
+    UNIMPLEMENTED_SERVICE = 'unimplemented_service'
+    CUSTOM_METADATA = "custom_metadata"
+    COMPUTE_ENGINE_CREDS = 'compute_engine_creds'
+    OAUTH2_AUTH_TOKEN = 'oauth2_auth_token'
+    JWT_TOKEN_CREDS = 'jwt_token_creds'
+    PER_RPC_CREDS = 'per_rpc_creds'
+    TIMEOUT_ON_SLEEPING_SERVER = 'timeout_on_sleeping_server'
 
-  def test_interoperability(self, stub, args):
-    if self is TestCase.EMPTY_UNARY:
-      _empty_unary(stub)
-    elif self is TestCase.LARGE_UNARY:
-      _large_unary(stub)
-    elif self is TestCase.SERVER_STREAMING:
-      _server_streaming(stub)
-    elif self is TestCase.CLIENT_STREAMING:
-      _client_streaming(stub)
-    elif self is TestCase.PING_PONG:
-      _ping_pong(stub)
-    elif self is TestCase.CANCEL_AFTER_BEGIN:
-      _cancel_after_begin(stub)
-    elif self is TestCase.CANCEL_AFTER_FIRST_RESPONSE:
-      _cancel_after_first_response(stub)
-    elif self is TestCase.TIMEOUT_ON_SLEEPING_SERVER:
-      _timeout_on_sleeping_server(stub)
-    elif self is TestCase.EMPTY_STREAM:
-      _empty_stream(stub)
-    elif self is TestCase.STATUS_CODE_AND_MESSAGE:
-      _status_code_and_message(stub)
-    elif self is TestCase.UNIMPLEMENTED_METHOD:
-      _unimplemented_method(stub)
-    elif self is TestCase.UNIMPLEMENTED_SERVICE:
-      _unimplemented_service(stub)
-    elif self is TestCase.CUSTOM_METADATA:
-      _custom_metadata(stub)
-    elif self is TestCase.COMPUTE_ENGINE_CREDS:
-      _compute_engine_creds(stub, args)
-    elif self is TestCase.OAUTH2_AUTH_TOKEN:
-      _oauth2_auth_token(stub, args)
-    elif self is TestCase.JWT_TOKEN_CREDS:
-      _jwt_token_creds(stub, args)
-    elif self is TestCase.PER_RPC_CREDS:
-      _per_rpc_creds(stub, args)
-    else:
-      raise NotImplementedError('Test case "%s" not implemented!' % self.name)
+    def test_interoperability(self, stub, args):
+        if self is TestCase.EMPTY_UNARY:
+            _empty_unary(stub)
+        elif self is TestCase.LARGE_UNARY:
+            _large_unary(stub)
+        elif self is TestCase.SERVER_STREAMING:
+            _server_streaming(stub)
+        elif self is TestCase.CLIENT_STREAMING:
+            _client_streaming(stub)
+        elif self is TestCase.PING_PONG:
+            _ping_pong(stub)
+        elif self is TestCase.CANCEL_AFTER_BEGIN:
+            _cancel_after_begin(stub)
+        elif self is TestCase.CANCEL_AFTER_FIRST_RESPONSE:
+            _cancel_after_first_response(stub)
+        elif self is TestCase.TIMEOUT_ON_SLEEPING_SERVER:
+            _timeout_on_sleeping_server(stub)
+        elif self is TestCase.EMPTY_STREAM:
+            _empty_stream(stub)
+        elif self is TestCase.STATUS_CODE_AND_MESSAGE:
+            _status_code_and_message(stub)
+        elif self is TestCase.UNIMPLEMENTED_METHOD:
+            _unimplemented_method(stub)
+        elif self is TestCase.UNIMPLEMENTED_SERVICE:
+            _unimplemented_service(stub)
+        elif self is TestCase.CUSTOM_METADATA:
+            _custom_metadata(stub)
+        elif self is TestCase.COMPUTE_ENGINE_CREDS:
+            _compute_engine_creds(stub, args)
+        elif self is TestCase.OAUTH2_AUTH_TOKEN:
+            _oauth2_auth_token(stub, args)
+        elif self is TestCase.JWT_TOKEN_CREDS:
+            _jwt_token_creds(stub, args)
+        elif self is TestCase.PER_RPC_CREDS:
+            _per_rpc_creds(stub, args)
+        else:
+            raise NotImplementedError('Test case "%s" not implemented!' %
+                                      self.name)
diff --git a/src/python/grpcio_tests/tests/interop/resources.py b/src/python/grpcio_tests/tests/interop/resources.py
index c424385..2ec2eb9 100644
--- a/src/python/grpcio_tests/tests/interop/resources.py
+++ b/src/python/grpcio_tests/tests/interop/resources.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Constants and functions for data used in interoperability testing."""
 
 import argparse
@@ -40,22 +39,22 @@
 
 
 def test_root_certificates():
-  return pkg_resources.resource_string(
-      __name__, _ROOT_CERTIFICATES_RESOURCE_PATH)
+    return pkg_resources.resource_string(__name__,
+                                         _ROOT_CERTIFICATES_RESOURCE_PATH)
 
 
 def private_key():
-  return pkg_resources.resource_string(__name__, _PRIVATE_KEY_RESOURCE_PATH)
+    return pkg_resources.resource_string(__name__, _PRIVATE_KEY_RESOURCE_PATH)
 
 
 def certificate_chain():
-  return pkg_resources.resource_string(
-      __name__, _CERTIFICATE_CHAIN_RESOURCE_PATH)
+    return pkg_resources.resource_string(__name__,
+                                         _CERTIFICATE_CHAIN_RESOURCE_PATH)
 
 
 def parse_bool(value):
-  if value == 'true':
-    return True
-  if value == 'false':
-    return False
-  raise argparse.ArgumentTypeError('Only true/false allowed')
+    if value == 'true':
+        return True
+    if value == 'false':
+        return False
+    raise argparse.ArgumentTypeError('Only true/false allowed')
diff --git a/src/python/grpcio_tests/tests/interop/server.py b/src/python/grpcio_tests/tests/interop/server.py
index 1ae83bc..65f1604 100644
--- a/src/python/grpcio_tests/tests/interop/server.py
+++ b/src/python/grpcio_tests/tests/interop/server.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """The Python implementation of the GRPC interoperability test server."""
 
 import argparse
@@ -44,34 +43,36 @@
 
 
 def serve():
-  parser = argparse.ArgumentParser()
-  parser.add_argument(
-      '--port', help='the port on which to serve', type=int)
-  parser.add_argument(
-      '--use_tls', help='require a secure connection',
-      default=False, type=resources.parse_bool)
-  args = parser.parse_args()
+    parser = argparse.ArgumentParser()
+    parser.add_argument('--port', help='the port on which to serve', type=int)
+    parser.add_argument(
+        '--use_tls',
+        help='require a secure connection',
+        default=False,
+        type=resources.parse_bool)
+    args = parser.parse_args()
 
-  server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
-  test_pb2.add_TestServiceServicer_to_server(methods.TestService(), server)
-  if args.use_tls:
-    private_key = resources.private_key()
-    certificate_chain = resources.certificate_chain()
-    credentials = grpc.ssl_server_credentials(
-        ((private_key, certificate_chain),))
-    server.add_secure_port('[::]:{}'.format(args.port), credentials)
-  else:
-    server.add_insecure_port('[::]:{}'.format(args.port))
+    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
+    test_pb2.add_TestServiceServicer_to_server(methods.TestService(), server)
+    if args.use_tls:
+        private_key = resources.private_key()
+        certificate_chain = resources.certificate_chain()
+        credentials = grpc.ssl_server_credentials((
+            (private_key, certificate_chain),))
+        server.add_secure_port('[::]:{}'.format(args.port), credentials)
+    else:
+        server.add_insecure_port('[::]:{}'.format(args.port))
 
-  server.start()
-  logging.info('Server serving.')
-  try:
-    while True:
-      time.sleep(_ONE_DAY_IN_SECONDS)
-  except BaseException as e:
-    logging.info('Caught exception "%s"; stopping server...', e)
-    server.stop(None)
-    logging.info('Server stopped; exiting.')
+    server.start()
+    logging.info('Server serving.')
+    try:
+        while True:
+            time.sleep(_ONE_DAY_IN_SECONDS)
+    except BaseException as e:
+        logging.info('Caught exception "%s"; stopping server...', e)
+        server.stop(None)
+        logging.info('Server stopped; exiting.')
+
 
 if __name__ == '__main__':
-  serve()
+    serve()
diff --git a/src/python/grpcio_tests/tests/protoc_plugin/__init__.py b/src/python/grpcio_tests/tests/protoc_plugin/__init__.py
index 7086519..b893988 100644
--- a/src/python/grpcio_tests/tests/protoc_plugin/__init__.py
+++ b/src/python/grpcio_tests/tests/protoc_plugin/__init__.py
@@ -26,5 +26,3 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
diff --git a/src/python/grpcio_tests/tests/protoc_plugin/_python_plugin_test.py b/src/python/grpcio_tests/tests/protoc_plugin/_python_plugin_test.py
index 7ca2bcf..ae5da2c 100644
--- a/src/python/grpcio_tests/tests/protoc_plugin/_python_plugin_test.py
+++ b/src/python/grpcio_tests/tests/protoc_plugin/_python_plugin_test.py
@@ -58,436 +58,440 @@
 
 class _ServicerMethods(object):
 
-  def __init__(self):
-    self._condition = threading.Condition()
-    self._paused = False
-    self._fail = False
+    def __init__(self):
+        self._condition = threading.Condition()
+        self._paused = False
+        self._fail = False
 
-  @contextlib.contextmanager
-  def pause(self):  # pylint: disable=invalid-name
-    with self._condition:
-      self._paused = True
-    yield
-    with self._condition:
-      self._paused = False
-      self._condition.notify_all()
+    @contextlib.contextmanager
+    def pause(self):  # pylint: disable=invalid-name
+        with self._condition:
+            self._paused = True
+        yield
+        with self._condition:
+            self._paused = False
+            self._condition.notify_all()
 
-  @contextlib.contextmanager
-  def fail(self):  # pylint: disable=invalid-name
-    with self._condition:
-      self._fail = True
-    yield
-    with self._condition:
-      self._fail = False
+    @contextlib.contextmanager
+    def fail(self):  # pylint: disable=invalid-name
+        with self._condition:
+            self._fail = True
+        yield
+        with self._condition:
+            self._fail = False
 
-  def _control(self):  # pylint: disable=invalid-name
-    with self._condition:
-      if self._fail:
-        raise ValueError()
-      while self._paused:
-        self._condition.wait()
+    def _control(self):  # pylint: disable=invalid-name
+        with self._condition:
+            if self._fail:
+                raise ValueError()
+            while self._paused:
+                self._condition.wait()
 
-  def UnaryCall(self, request, unused_rpc_context):
-    response = response_pb2.SimpleResponse()
-    response.payload.payload_type = payload_pb2.COMPRESSABLE
-    response.payload.payload_compressable = 'a' * request.response_size
-    self._control()
-    return response
-
-  def StreamingOutputCall(self, request, unused_rpc_context):
-    for parameter in request.response_parameters:
-      response = response_pb2.StreamingOutputCallResponse()
-      response.payload.payload_type = payload_pb2.COMPRESSABLE
-      response.payload.payload_compressable = 'a' * parameter.size
-      self._control()
-      yield response
-
-  def StreamingInputCall(self, request_iter, unused_rpc_context):
-    response = response_pb2.StreamingInputCallResponse()
-    aggregated_payload_size = 0
-    for request in request_iter:
-      aggregated_payload_size += len(request.payload.payload_compressable)
-    response.aggregated_payload_size = aggregated_payload_size
-    self._control()
-    return response
-
-  def FullDuplexCall(self, request_iter, unused_rpc_context):
-    for request in request_iter:
-      for parameter in request.response_parameters:
-        response = response_pb2.StreamingOutputCallResponse()
+    def UnaryCall(self, request, unused_rpc_context):
+        response = response_pb2.SimpleResponse()
         response.payload.payload_type = payload_pb2.COMPRESSABLE
-        response.payload.payload_compressable = 'a' * parameter.size
+        response.payload.payload_compressable = 'a' * request.response_size
         self._control()
-        yield response
+        return response
 
-  def HalfDuplexCall(self, request_iter, unused_rpc_context):
-    responses = []
-    for request in request_iter:
-      for parameter in request.response_parameters:
-        response = response_pb2.StreamingOutputCallResponse()
-        response.payload.payload_type = payload_pb2.COMPRESSABLE
-        response.payload.payload_compressable = 'a' * parameter.size
+    def StreamingOutputCall(self, request, unused_rpc_context):
+        for parameter in request.response_parameters:
+            response = response_pb2.StreamingOutputCallResponse()
+            response.payload.payload_type = payload_pb2.COMPRESSABLE
+            response.payload.payload_compressable = 'a' * parameter.size
+            self._control()
+            yield response
+
+    def StreamingInputCall(self, request_iter, unused_rpc_context):
+        response = response_pb2.StreamingInputCallResponse()
+        aggregated_payload_size = 0
+        for request in request_iter:
+            aggregated_payload_size += len(request.payload.payload_compressable)
+        response.aggregated_payload_size = aggregated_payload_size
         self._control()
-        responses.append(response)
-    for response in responses:
-      yield response
+        return response
+
+    def FullDuplexCall(self, request_iter, unused_rpc_context):
+        for request in request_iter:
+            for parameter in request.response_parameters:
+                response = response_pb2.StreamingOutputCallResponse()
+                response.payload.payload_type = payload_pb2.COMPRESSABLE
+                response.payload.payload_compressable = 'a' * parameter.size
+                self._control()
+                yield response
+
+    def HalfDuplexCall(self, request_iter, unused_rpc_context):
+        responses = []
+        for request in request_iter:
+            for parameter in request.response_parameters:
+                response = response_pb2.StreamingOutputCallResponse()
+                response.payload.payload_type = payload_pb2.COMPRESSABLE
+                response.payload.payload_compressable = 'a' * parameter.size
+                self._control()
+                responses.append(response)
+        for response in responses:
+            yield response
 
 
 class _Service(
-    collections.namedtuple(
-      '_Service', ('servicer_methods', 'server', 'stub',))):
-  """A live and running service.
+        collections.namedtuple('_Service', (
+            'servicer_methods',
+            'server',
+            'stub',))):
+    """A live and running service.
 
   Attributes:
     servicer_methods: The _ServicerMethods servicing RPCs.
     server: The grpc.Server servicing RPCs.
     stub: A stub on which to invoke RPCs.
   """
-      
+
 
 def _CreateService():
-  """Provides a servicer backend and a stub.
+    """Provides a servicer backend and a stub.
 
   Returns:
     A _Service with which to test RPCs.
   """
-  servicer_methods = _ServicerMethods()
+    servicer_methods = _ServicerMethods()
 
-  class Servicer(getattr(service_pb2, SERVICER_IDENTIFIER)):
+    class Servicer(getattr(service_pb2, SERVICER_IDENTIFIER)):
 
-    def UnaryCall(self, request, context):
-      return servicer_methods.UnaryCall(request, context)
+        def UnaryCall(self, request, context):
+            return servicer_methods.UnaryCall(request, context)
 
-    def StreamingOutputCall(self, request, context):
-      return servicer_methods.StreamingOutputCall(request, context)
+        def StreamingOutputCall(self, request, context):
+            return servicer_methods.StreamingOutputCall(request, context)
 
-    def StreamingInputCall(self, request_iter, context):
-      return servicer_methods.StreamingInputCall(request_iter, context)
+        def StreamingInputCall(self, request_iter, context):
+            return servicer_methods.StreamingInputCall(request_iter, context)
 
-    def FullDuplexCall(self, request_iter, context):
-      return servicer_methods.FullDuplexCall(request_iter, context)
+        def FullDuplexCall(self, request_iter, context):
+            return servicer_methods.FullDuplexCall(request_iter, context)
 
-    def HalfDuplexCall(self, request_iter, context):
-      return servicer_methods.HalfDuplexCall(request_iter, context)
+        def HalfDuplexCall(self, request_iter, context):
+            return servicer_methods.HalfDuplexCall(request_iter, context)
 
-  server = grpc.server(
-      futures.ThreadPoolExecutor(max_workers=test_constants.POOL_SIZE))
-  getattr(service_pb2, ADD_SERVICER_TO_SERVER_IDENTIFIER)(Servicer(), server)
-  port = server.add_insecure_port('[::]:0')
-  server.start()
-  channel = grpc.insecure_channel('localhost:{}'.format(port))
-  stub = getattr(service_pb2, STUB_IDENTIFIER)(channel)
-  return _Service(servicer_methods, server, stub)
+    server = grpc.server(
+        futures.ThreadPoolExecutor(max_workers=test_constants.POOL_SIZE))
+    getattr(service_pb2, ADD_SERVICER_TO_SERVER_IDENTIFIER)(Servicer(), server)
+    port = server.add_insecure_port('[::]:0')
+    server.start()
+    channel = grpc.insecure_channel('localhost:{}'.format(port))
+    stub = getattr(service_pb2, STUB_IDENTIFIER)(channel)
+    return _Service(servicer_methods, server, stub)
 
 
 def _CreateIncompleteService():
-  """Provides a servicer backend that fails to implement methods and its stub.
+    """Provides a servicer backend that fails to implement methods and its stub.
 
   Returns:
     A _Service with which to test RPCs. The returned _Service's
       servicer_methods implements none of the methods required of it.
   """
 
-  class Servicer(getattr(service_pb2, SERVICER_IDENTIFIER)):
-    pass
+    class Servicer(getattr(service_pb2, SERVICER_IDENTIFIER)):
+        pass
 
-  server = grpc.server(
-      futures.ThreadPoolExecutor(max_workers=test_constants.POOL_SIZE))
-  getattr(service_pb2, ADD_SERVICER_TO_SERVER_IDENTIFIER)(Servicer(), server)
-  port = server.add_insecure_port('[::]:0')
-  server.start()
-  channel = grpc.insecure_channel('localhost:{}'.format(port))
-  stub = getattr(service_pb2, STUB_IDENTIFIER)(channel)
-  return _Service(None, server, stub)
+    server = grpc.server(
+        futures.ThreadPoolExecutor(max_workers=test_constants.POOL_SIZE))
+    getattr(service_pb2, ADD_SERVICER_TO_SERVER_IDENTIFIER)(Servicer(), server)
+    port = server.add_insecure_port('[::]:0')
+    server.start()
+    channel = grpc.insecure_channel('localhost:{}'.format(port))
+    stub = getattr(service_pb2, STUB_IDENTIFIER)(channel)
+    return _Service(None, server, stub)
 
 
 def _streaming_input_request_iterator():
-  for _ in range(3):
-    request = request_pb2.StreamingInputCallRequest()
-    request.payload.payload_type = payload_pb2.COMPRESSABLE
-    request.payload.payload_compressable = 'a'
-    yield request
+    for _ in range(3):
+        request = request_pb2.StreamingInputCallRequest()
+        request.payload.payload_type = payload_pb2.COMPRESSABLE
+        request.payload.payload_compressable = 'a'
+        yield request
 
 
 def _streaming_output_request():
-  request = request_pb2.StreamingOutputCallRequest()
-  sizes = [1, 2, 3]
-  request.response_parameters.add(size=sizes[0], interval_us=0)
-  request.response_parameters.add(size=sizes[1], interval_us=0)
-  request.response_parameters.add(size=sizes[2], interval_us=0)
-  return request
+    request = request_pb2.StreamingOutputCallRequest()
+    sizes = [1, 2, 3]
+    request.response_parameters.add(size=sizes[0], interval_us=0)
+    request.response_parameters.add(size=sizes[1], interval_us=0)
+    request.response_parameters.add(size=sizes[2], interval_us=0)
+    return request
 
 
 def _full_duplex_request_iterator():
-  request = request_pb2.StreamingOutputCallRequest()
-  request.response_parameters.add(size=1, interval_us=0)
-  yield request
-  request = request_pb2.StreamingOutputCallRequest()
-  request.response_parameters.add(size=2, interval_us=0)
-  request.response_parameters.add(size=3, interval_us=0)
-  yield request
+    request = request_pb2.StreamingOutputCallRequest()
+    request.response_parameters.add(size=1, interval_us=0)
+    yield request
+    request = request_pb2.StreamingOutputCallRequest()
+    request.response_parameters.add(size=2, interval_us=0)
+    request.response_parameters.add(size=3, interval_us=0)
+    yield request
 
 
 class PythonPluginTest(unittest.TestCase):
-  """Test case for the gRPC Python protoc-plugin.
+    """Test case for the gRPC Python protoc-plugin.
 
   While reading these tests, remember that the futures API
   (`stub.method.future()`) only gives futures for the *response-unary*
   methods and does not exist for response-streaming methods.
   """
 
-  def testImportAttributes(self):
-    # check that we can access the generated module and its members.
-    self.assertIsNotNone(
-        getattr(service_pb2, STUB_IDENTIFIER, None))
-    self.assertIsNotNone(
-        getattr(service_pb2, SERVICER_IDENTIFIER, None))
-    self.assertIsNotNone(
-        getattr(service_pb2, ADD_SERVICER_TO_SERVER_IDENTIFIER, None))
+    def testImportAttributes(self):
+        # check that we can access the generated module and its members.
+        self.assertIsNotNone(getattr(service_pb2, STUB_IDENTIFIER, None))
+        self.assertIsNotNone(getattr(service_pb2, SERVICER_IDENTIFIER, None))
+        self.assertIsNotNone(
+            getattr(service_pb2, ADD_SERVICER_TO_SERVER_IDENTIFIER, None))
 
-  def testUpDown(self):
-    service = _CreateService()
-    self.assertIsNotNone(service.servicer_methods)
-    self.assertIsNotNone(service.server)
-    self.assertIsNotNone(service.stub)
+    def testUpDown(self):
+        service = _CreateService()
+        self.assertIsNotNone(service.servicer_methods)
+        self.assertIsNotNone(service.server)
+        self.assertIsNotNone(service.stub)
 
-  def testIncompleteServicer(self):
-    service = _CreateIncompleteService()
-    request = request_pb2.SimpleRequest(response_size=13)
-    with self.assertRaises(grpc.RpcError) as exception_context:
-      service.stub.UnaryCall(request)
-    self.assertIs(
-        exception_context.exception.code(), grpc.StatusCode.UNIMPLEMENTED)
+    def testIncompleteServicer(self):
+        service = _CreateIncompleteService()
+        request = request_pb2.SimpleRequest(response_size=13)
+        with self.assertRaises(grpc.RpcError) as exception_context:
+            service.stub.UnaryCall(request)
+        self.assertIs(exception_context.exception.code(),
+                      grpc.StatusCode.UNIMPLEMENTED)
 
-  def testUnaryCall(self):
-    service = _CreateService()
-    request = request_pb2.SimpleRequest(response_size=13)
-    response = service.stub.UnaryCall(request)
-    expected_response = service.servicer_methods.UnaryCall(
-        request, 'not a real context!')
-    self.assertEqual(expected_response, response)
+    def testUnaryCall(self):
+        service = _CreateService()
+        request = request_pb2.SimpleRequest(response_size=13)
+        response = service.stub.UnaryCall(request)
+        expected_response = service.servicer_methods.UnaryCall(
+            request, 'not a real context!')
+        self.assertEqual(expected_response, response)
 
-  def testUnaryCallFuture(self):
-    service = _CreateService()
-    request = request_pb2.SimpleRequest(response_size=13)
-    # Check that the call does not block waiting for the server to respond.
-    with service.servicer_methods.pause():
-      response_future = service.stub.UnaryCall.future(request)
-    response = response_future.result()
-    expected_response = service.servicer_methods.UnaryCall(
-        request, 'not a real RpcContext!')
-    self.assertEqual(expected_response, response)
+    def testUnaryCallFuture(self):
+        service = _CreateService()
+        request = request_pb2.SimpleRequest(response_size=13)
+        # Check that the call does not block waiting for the server to respond.
+        with service.servicer_methods.pause():
+            response_future = service.stub.UnaryCall.future(request)
+        response = response_future.result()
+        expected_response = service.servicer_methods.UnaryCall(
+            request, 'not a real RpcContext!')
+        self.assertEqual(expected_response, response)
 
-  def testUnaryCallFutureExpired(self):
-    service = _CreateService()
-    request = request_pb2.SimpleRequest(response_size=13)
-    with service.servicer_methods.pause():
-      response_future = service.stub.UnaryCall.future(
-          request, timeout=test_constants.SHORT_TIMEOUT)
-      with self.assertRaises(grpc.RpcError) as exception_context:
-        response_future.result()
-    self.assertIs(
-        exception_context.exception.code(), grpc.StatusCode.DEADLINE_EXCEEDED)
-    self.assertIs(response_future.code(), grpc.StatusCode.DEADLINE_EXCEEDED)
+    def testUnaryCallFutureExpired(self):
+        service = _CreateService()
+        request = request_pb2.SimpleRequest(response_size=13)
+        with service.servicer_methods.pause():
+            response_future = service.stub.UnaryCall.future(
+                request, timeout=test_constants.SHORT_TIMEOUT)
+            with self.assertRaises(grpc.RpcError) as exception_context:
+                response_future.result()
+        self.assertIs(exception_context.exception.code(),
+                      grpc.StatusCode.DEADLINE_EXCEEDED)
+        self.assertIs(response_future.code(), grpc.StatusCode.DEADLINE_EXCEEDED)
 
-  def testUnaryCallFutureCancelled(self):
-    service = _CreateService()
-    request = request_pb2.SimpleRequest(response_size=13)
-    with service.servicer_methods.pause():
-      response_future = service.stub.UnaryCall.future(request)
-      response_future.cancel()
-    self.assertTrue(response_future.cancelled())
-    self.assertIs(response_future.code(), grpc.StatusCode.CANCELLED)
+    def testUnaryCallFutureCancelled(self):
+        service = _CreateService()
+        request = request_pb2.SimpleRequest(response_size=13)
+        with service.servicer_methods.pause():
+            response_future = service.stub.UnaryCall.future(request)
+            response_future.cancel()
+        self.assertTrue(response_future.cancelled())
+        self.assertIs(response_future.code(), grpc.StatusCode.CANCELLED)
 
-  def testUnaryCallFutureFailed(self):
-    service = _CreateService()
-    request = request_pb2.SimpleRequest(response_size=13)
-    with service.servicer_methods.fail():
-      response_future = service.stub.UnaryCall.future(request)
-      self.assertIsNotNone(response_future.exception())
-    self.assertIs(response_future.code(), grpc.StatusCode.UNKNOWN)
+    def testUnaryCallFutureFailed(self):
+        service = _CreateService()
+        request = request_pb2.SimpleRequest(response_size=13)
+        with service.servicer_methods.fail():
+            response_future = service.stub.UnaryCall.future(request)
+            self.assertIsNotNone(response_future.exception())
+        self.assertIs(response_future.code(), grpc.StatusCode.UNKNOWN)
 
-  def testStreamingOutputCall(self):
-    service = _CreateService()
-    request = _streaming_output_request()
-    responses = service.stub.StreamingOutputCall(request)
-    expected_responses = service.servicer_methods.StreamingOutputCall(
-        request, 'not a real RpcContext!')
-    for expected_response, response in moves.zip_longest(
-        expected_responses, responses):
-      self.assertEqual(expected_response, response)
+    def testStreamingOutputCall(self):
+        service = _CreateService()
+        request = _streaming_output_request()
+        responses = service.stub.StreamingOutputCall(request)
+        expected_responses = service.servicer_methods.StreamingOutputCall(
+            request, 'not a real RpcContext!')
+        for expected_response, response in moves.zip_longest(expected_responses,
+                                                             responses):
+            self.assertEqual(expected_response, response)
 
-  def testStreamingOutputCallExpired(self):
-    service = _CreateService()
-    request = _streaming_output_request()
-    with service.servicer_methods.pause():
-      responses = service.stub.StreamingOutputCall(
-          request, timeout=test_constants.SHORT_TIMEOUT)
-      with self.assertRaises(grpc.RpcError) as exception_context:
-        list(responses)
-    self.assertIs(
-        exception_context.exception.code(), grpc.StatusCode.DEADLINE_EXCEEDED)
+    def testStreamingOutputCallExpired(self):
+        service = _CreateService()
+        request = _streaming_output_request()
+        with service.servicer_methods.pause():
+            responses = service.stub.StreamingOutputCall(
+                request, timeout=test_constants.SHORT_TIMEOUT)
+            with self.assertRaises(grpc.RpcError) as exception_context:
+                list(responses)
+        self.assertIs(exception_context.exception.code(),
+                      grpc.StatusCode.DEADLINE_EXCEEDED)
 
-  def testStreamingOutputCallCancelled(self):
-    service = _CreateService()
-    request = _streaming_output_request()
-    responses = service.stub.StreamingOutputCall(request)
-    next(responses)
-    responses.cancel()
-    with self.assertRaises(grpc.RpcError) as exception_context:
-      next(responses)
-    self.assertIs(responses.code(), grpc.StatusCode.CANCELLED)
-
-  def testStreamingOutputCallFailed(self):
-    service = _CreateService()
-    request = _streaming_output_request()
-    with service.servicer_methods.fail():
-      responses = service.stub.StreamingOutputCall(request)
-      self.assertIsNotNone(responses)
-      with self.assertRaises(grpc.RpcError) as exception_context:
+    def testStreamingOutputCallCancelled(self):
+        service = _CreateService()
+        request = _streaming_output_request()
+        responses = service.stub.StreamingOutputCall(request)
         next(responses)
-    self.assertIs(exception_context.exception.code(), grpc.StatusCode.UNKNOWN)
+        responses.cancel()
+        with self.assertRaises(grpc.RpcError) as exception_context:
+            next(responses)
+        self.assertIs(responses.code(), grpc.StatusCode.CANCELLED)
 
-  def testStreamingInputCall(self):
-    service = _CreateService()
-    response = service.stub.StreamingInputCall(
-        _streaming_input_request_iterator())
-    expected_response = service.servicer_methods.StreamingInputCall(
-        _streaming_input_request_iterator(),
-        'not a real RpcContext!')
-    self.assertEqual(expected_response, response)
+    def testStreamingOutputCallFailed(self):
+        service = _CreateService()
+        request = _streaming_output_request()
+        with service.servicer_methods.fail():
+            responses = service.stub.StreamingOutputCall(request)
+            self.assertIsNotNone(responses)
+            with self.assertRaises(grpc.RpcError) as exception_context:
+                next(responses)
+        self.assertIs(exception_context.exception.code(),
+                      grpc.StatusCode.UNKNOWN)
 
-  def testStreamingInputCallFuture(self):
-    service = _CreateService()
-    with service.servicer_methods.pause():
-      response_future = service.stub.StreamingInputCall.future(
-          _streaming_input_request_iterator())
-    response = response_future.result()
-    expected_response = service.servicer_methods.StreamingInputCall(
-        _streaming_input_request_iterator(),
-        'not a real RpcContext!')
-    self.assertEqual(expected_response, response)
+    def testStreamingInputCall(self):
+        service = _CreateService()
+        response = service.stub.StreamingInputCall(
+            _streaming_input_request_iterator())
+        expected_response = service.servicer_methods.StreamingInputCall(
+            _streaming_input_request_iterator(), 'not a real RpcContext!')
+        self.assertEqual(expected_response, response)
 
-  def testStreamingInputCallFutureExpired(self):
-    service = _CreateService()
-    with service.servicer_methods.pause():
-      response_future = service.stub.StreamingInputCall.future(
-          _streaming_input_request_iterator(),
-          timeout=test_constants.SHORT_TIMEOUT)
-      with self.assertRaises(grpc.RpcError) as exception_context:
-        response_future.result()
-    self.assertIsInstance(response_future.exception(), grpc.RpcError)
-    self.assertIs(
-        response_future.exception().code(), grpc.StatusCode.DEADLINE_EXCEEDED)
-    self.assertIs(
-        exception_context.exception.code(), grpc.StatusCode.DEADLINE_EXCEEDED)
+    def testStreamingInputCallFuture(self):
+        service = _CreateService()
+        with service.servicer_methods.pause():
+            response_future = service.stub.StreamingInputCall.future(
+                _streaming_input_request_iterator())
+        response = response_future.result()
+        expected_response = service.servicer_methods.StreamingInputCall(
+            _streaming_input_request_iterator(), 'not a real RpcContext!')
+        self.assertEqual(expected_response, response)
 
-  def testStreamingInputCallFutureCancelled(self):
-    service = _CreateService()
-    with service.servicer_methods.pause():
-      response_future = service.stub.StreamingInputCall.future(
-          _streaming_input_request_iterator())
-      response_future.cancel()
-    self.assertTrue(response_future.cancelled())
-    with self.assertRaises(grpc.FutureCancelledError):
-      response_future.result()
+    def testStreamingInputCallFutureExpired(self):
+        service = _CreateService()
+        with service.servicer_methods.pause():
+            response_future = service.stub.StreamingInputCall.future(
+                _streaming_input_request_iterator(),
+                timeout=test_constants.SHORT_TIMEOUT)
+            with self.assertRaises(grpc.RpcError) as exception_context:
+                response_future.result()
+        self.assertIsInstance(response_future.exception(), grpc.RpcError)
+        self.assertIs(response_future.exception().code(),
+                      grpc.StatusCode.DEADLINE_EXCEEDED)
+        self.assertIs(exception_context.exception.code(),
+                      grpc.StatusCode.DEADLINE_EXCEEDED)
 
-  def testStreamingInputCallFutureFailed(self):
-    service = _CreateService()
-    with service.servicer_methods.fail():
-      response_future = service.stub.StreamingInputCall.future(
-          _streaming_input_request_iterator())
-      self.assertIsNotNone(response_future.exception())
-      self.assertIs(response_future.code(), grpc.StatusCode.UNKNOWN)
+    def testStreamingInputCallFutureCancelled(self):
+        service = _CreateService()
+        with service.servicer_methods.pause():
+            response_future = service.stub.StreamingInputCall.future(
+                _streaming_input_request_iterator())
+            response_future.cancel()
+        self.assertTrue(response_future.cancelled())
+        with self.assertRaises(grpc.FutureCancelledError):
+            response_future.result()
 
-  def testFullDuplexCall(self):
-    service = _CreateService()
-    responses = service.stub.FullDuplexCall(
-        _full_duplex_request_iterator())
-    expected_responses = service.servicer_methods.FullDuplexCall(
-        _full_duplex_request_iterator(),
-        'not a real RpcContext!')
-    for expected_response, response in moves.zip_longest(
-        expected_responses, responses):
-      self.assertEqual(expected_response, response)
+    def testStreamingInputCallFutureFailed(self):
+        service = _CreateService()
+        with service.servicer_methods.fail():
+            response_future = service.stub.StreamingInputCall.future(
+                _streaming_input_request_iterator())
+            self.assertIsNotNone(response_future.exception())
+            self.assertIs(response_future.code(), grpc.StatusCode.UNKNOWN)
 
-  def testFullDuplexCallExpired(self):
-    request_iterator = _full_duplex_request_iterator()
-    service = _CreateService()
-    with service.servicer_methods.pause():
-      responses = service.stub.FullDuplexCall(
-          request_iterator, timeout=test_constants.SHORT_TIMEOUT)
-      with self.assertRaises(grpc.RpcError) as exception_context:
-        list(responses)
-    self.assertIs(
-        exception_context.exception.code(), grpc.StatusCode.DEADLINE_EXCEEDED)
+    def testFullDuplexCall(self):
+        service = _CreateService()
+        responses = service.stub.FullDuplexCall(_full_duplex_request_iterator())
+        expected_responses = service.servicer_methods.FullDuplexCall(
+            _full_duplex_request_iterator(), 'not a real RpcContext!')
+        for expected_response, response in moves.zip_longest(expected_responses,
+                                                             responses):
+            self.assertEqual(expected_response, response)
 
-  def testFullDuplexCallCancelled(self):
-    service = _CreateService()
-    request_iterator = _full_duplex_request_iterator()
-    responses = service.stub.FullDuplexCall(request_iterator)
-    next(responses)
-    responses.cancel()
-    with self.assertRaises(grpc.RpcError) as exception_context:
-      next(responses)
-    self.assertIs(
-        exception_context.exception.code(), grpc.StatusCode.CANCELLED)
+    def testFullDuplexCallExpired(self):
+        request_iterator = _full_duplex_request_iterator()
+        service = _CreateService()
+        with service.servicer_methods.pause():
+            responses = service.stub.FullDuplexCall(
+                request_iterator, timeout=test_constants.SHORT_TIMEOUT)
+            with self.assertRaises(grpc.RpcError) as exception_context:
+                list(responses)
+        self.assertIs(exception_context.exception.code(),
+                      grpc.StatusCode.DEADLINE_EXCEEDED)
 
-  def testFullDuplexCallFailed(self):
-    request_iterator = _full_duplex_request_iterator()
-    service = _CreateService()
-    with service.servicer_methods.fail():
-      responses = service.stub.FullDuplexCall(request_iterator)
-      with self.assertRaises(grpc.RpcError) as exception_context:
+    def testFullDuplexCallCancelled(self):
+        service = _CreateService()
+        request_iterator = _full_duplex_request_iterator()
+        responses = service.stub.FullDuplexCall(request_iterator)
         next(responses)
-    self.assertIs(exception_context.exception.code(), grpc.StatusCode.UNKNOWN)
+        responses.cancel()
+        with self.assertRaises(grpc.RpcError) as exception_context:
+            next(responses)
+        self.assertIs(exception_context.exception.code(),
+                      grpc.StatusCode.CANCELLED)
 
-  def testHalfDuplexCall(self):
-    service = _CreateService()
-    def half_duplex_request_iterator():
-      request = request_pb2.StreamingOutputCallRequest()
-      request.response_parameters.add(size=1, interval_us=0)
-      yield request
-      request = request_pb2.StreamingOutputCallRequest()
-      request.response_parameters.add(size=2, interval_us=0)
-      request.response_parameters.add(size=3, interval_us=0)
-      yield request
-    responses = service.stub.HalfDuplexCall(half_duplex_request_iterator())
-    expected_responses = service.servicer_methods.HalfDuplexCall(
-        half_duplex_request_iterator(), 'not a real RpcContext!')
-    for expected_response, response in moves.zip_longest(
-        expected_responses, responses):
-      self.assertEqual(expected_response, response)
+    def testFullDuplexCallFailed(self):
+        request_iterator = _full_duplex_request_iterator()
+        service = _CreateService()
+        with service.servicer_methods.fail():
+            responses = service.stub.FullDuplexCall(request_iterator)
+            with self.assertRaises(grpc.RpcError) as exception_context:
+                next(responses)
+        self.assertIs(exception_context.exception.code(),
+                      grpc.StatusCode.UNKNOWN)
 
-  def testHalfDuplexCallWedged(self):
-    condition = threading.Condition()
-    wait_cell = [False]
-    @contextlib.contextmanager
-    def wait():  # pylint: disable=invalid-name
-      # Where's Python 3's 'nonlocal' statement when you need it?
-      with condition:
-        wait_cell[0] = True
-      yield
-      with condition:
-        wait_cell[0] = False
-        condition.notify_all()
-    def half_duplex_request_iterator():
-      request = request_pb2.StreamingOutputCallRequest()
-      request.response_parameters.add(size=1, interval_us=0)
-      yield request
-      with condition:
-        while wait_cell[0]:
-          condition.wait()
-    service = _CreateService()
-    with wait():
-      responses = service.stub.HalfDuplexCall(
-          half_duplex_request_iterator(), timeout=test_constants.SHORT_TIMEOUT)
-      # half-duplex waits for the client to send all info
-      with self.assertRaises(grpc.RpcError) as exception_context:
-        next(responses)
-    self.assertIs(
-        exception_context.exception.code(), grpc.StatusCode.DEADLINE_EXCEEDED)
+    def testHalfDuplexCall(self):
+        service = _CreateService()
+
+        def half_duplex_request_iterator():
+            request = request_pb2.StreamingOutputCallRequest()
+            request.response_parameters.add(size=1, interval_us=0)
+            yield request
+            request = request_pb2.StreamingOutputCallRequest()
+            request.response_parameters.add(size=2, interval_us=0)
+            request.response_parameters.add(size=3, interval_us=0)
+            yield request
+
+        responses = service.stub.HalfDuplexCall(half_duplex_request_iterator())
+        expected_responses = service.servicer_methods.HalfDuplexCall(
+            half_duplex_request_iterator(), 'not a real RpcContext!')
+        for expected_response, response in moves.zip_longest(expected_responses,
+                                                             responses):
+            self.assertEqual(expected_response, response)
+
+    def testHalfDuplexCallWedged(self):
+        condition = threading.Condition()
+        wait_cell = [False]
+
+        @contextlib.contextmanager
+        def wait():  # pylint: disable=invalid-name
+            # Where's Python 3's 'nonlocal' statement when you need it?
+            with condition:
+                wait_cell[0] = True
+            yield
+            with condition:
+                wait_cell[0] = False
+                condition.notify_all()
+
+        def half_duplex_request_iterator():
+            request = request_pb2.StreamingOutputCallRequest()
+            request.response_parameters.add(size=1, interval_us=0)
+            yield request
+            with condition:
+                while wait_cell[0]:
+                    condition.wait()
+
+        service = _CreateService()
+        with wait():
+            responses = service.stub.HalfDuplexCall(
+                half_duplex_request_iterator(),
+                timeout=test_constants.SHORT_TIMEOUT)
+            # half-duplex waits for the client to send all info
+            with self.assertRaises(grpc.RpcError) as exception_context:
+                next(responses)
+        self.assertIs(exception_context.exception.code(),
+                      grpc.StatusCode.DEADLINE_EXCEEDED)
 
 
 if __name__ == '__main__':
-  unittest.main(verbosity=2)
+    unittest.main(verbosity=2)
diff --git a/src/python/grpcio_tests/tests/protoc_plugin/_split_definitions_test.py b/src/python/grpcio_tests/tests/protoc_plugin/_split_definitions_test.py
index f8ae05b..bcc01f3 100644
--- a/src/python/grpcio_tests/tests/protoc_plugin/_split_definitions_test.py
+++ b/src/python/grpcio_tests/tests/protoc_plugin/_split_definitions_test.py
@@ -49,256 +49,264 @@
 
 _MESSAGES_IMPORT = b'import "messages.proto";'
 
+
 @contextlib.contextmanager
 def _system_path(path):
-  old_system_path = sys.path[:]
-  sys.path = sys.path[0:1] + path + sys.path[1:]
-  yield
-  sys.path = old_system_path
+    old_system_path = sys.path[:]
+    sys.path = sys.path[0:1] + path + sys.path[1:]
+    yield
+    sys.path = old_system_path
 
 
 class DummySplitServicer(object):
 
-  def __init__(self, request_class, response_class):
-    self.request_class = request_class
-    self.response_class = response_class
+    def __init__(self, request_class, response_class):
+        self.request_class = request_class
+        self.response_class = response_class
 
-  def Call(self, request, context):
-    return self.response_class()
+    def Call(self, request, context):
+        return self.response_class()
 
 
 class SeparateTestMixin(object):
 
-  def testImportAttributes(self):
-    with _system_path([self.python_out_directory]):
-      pb2 = importlib.import_module(self.pb2_import)
-    pb2.Request
-    pb2.Response
-    if self.should_find_services_in_pb2:
-      pb2.TestServiceServicer
-    else:
-      with self.assertRaises(AttributeError):
-        pb2.TestServiceServicer
+    def testImportAttributes(self):
+        with _system_path([self.python_out_directory]):
+            pb2 = importlib.import_module(self.pb2_import)
+        pb2.Request
+        pb2.Response
+        if self.should_find_services_in_pb2:
+            pb2.TestServiceServicer
+        else:
+            with self.assertRaises(AttributeError):
+                pb2.TestServiceServicer
 
-    with _system_path([self.grpc_python_out_directory]):
-      pb2_grpc = importlib.import_module(self.pb2_grpc_import)
-    pb2_grpc.TestServiceServicer
-    with self.assertRaises(AttributeError):
-      pb2_grpc.Request
-    with self.assertRaises(AttributeError):
-      pb2_grpc.Response
+        with _system_path([self.grpc_python_out_directory]):
+            pb2_grpc = importlib.import_module(self.pb2_grpc_import)
+        pb2_grpc.TestServiceServicer
+        with self.assertRaises(AttributeError):
+            pb2_grpc.Request
+        with self.assertRaises(AttributeError):
+            pb2_grpc.Response
 
-  def testCall(self):
-    with _system_path([self.python_out_directory]):
-      pb2 = importlib.import_module(self.pb2_import)
-    with _system_path([self.grpc_python_out_directory]):
-      pb2_grpc = importlib.import_module(self.pb2_grpc_import)
-    server = grpc.server(
-        futures.ThreadPoolExecutor(max_workers=test_constants.POOL_SIZE))
-    pb2_grpc.add_TestServiceServicer_to_server(
-        DummySplitServicer(
-            pb2.Request, pb2.Response), server)
-    port = server.add_insecure_port('[::]:0')
-    server.start()
-    channel = grpc.insecure_channel('localhost:{}'.format(port))
-    stub = pb2_grpc.TestServiceStub(channel)
-    request = pb2.Request()
-    expected_response = pb2.Response()
-    response = stub.Call(request)
-    self.assertEqual(expected_response, response)
+    def testCall(self):
+        with _system_path([self.python_out_directory]):
+            pb2 = importlib.import_module(self.pb2_import)
+        with _system_path([self.grpc_python_out_directory]):
+            pb2_grpc = importlib.import_module(self.pb2_grpc_import)
+        server = grpc.server(
+            futures.ThreadPoolExecutor(max_workers=test_constants.POOL_SIZE))
+        pb2_grpc.add_TestServiceServicer_to_server(
+            DummySplitServicer(pb2.Request, pb2.Response), server)
+        port = server.add_insecure_port('[::]:0')
+        server.start()
+        channel = grpc.insecure_channel('localhost:{}'.format(port))
+        stub = pb2_grpc.TestServiceStub(channel)
+        request = pb2.Request()
+        expected_response = pb2.Response()
+        response = stub.Call(request)
+        self.assertEqual(expected_response, response)
 
 
 class CommonTestMixin(object):
 
-  def testImportAttributes(self):
-    with _system_path([self.python_out_directory]):
-      pb2 = importlib.import_module(self.pb2_import)
-    pb2.Request
-    pb2.Response
-    if self.should_find_services_in_pb2:
-      pb2.TestServiceServicer
-    else:
-      with self.assertRaises(AttributeError):
-        pb2.TestServiceServicer
+    def testImportAttributes(self):
+        with _system_path([self.python_out_directory]):
+            pb2 = importlib.import_module(self.pb2_import)
+        pb2.Request
+        pb2.Response
+        if self.should_find_services_in_pb2:
+            pb2.TestServiceServicer
+        else:
+            with self.assertRaises(AttributeError):
+                pb2.TestServiceServicer
 
-    with _system_path([self.grpc_python_out_directory]):
-      pb2_grpc = importlib.import_module(self.pb2_grpc_import)
-    pb2_grpc.TestServiceServicer
-    with self.assertRaises(AttributeError):
-      pb2_grpc.Request
-    with self.assertRaises(AttributeError):
-      pb2_grpc.Response
+        with _system_path([self.grpc_python_out_directory]):
+            pb2_grpc = importlib.import_module(self.pb2_grpc_import)
+        pb2_grpc.TestServiceServicer
+        with self.assertRaises(AttributeError):
+            pb2_grpc.Request
+        with self.assertRaises(AttributeError):
+            pb2_grpc.Response
 
-  def testCall(self):
-    with _system_path([self.python_out_directory]):
-      pb2 = importlib.import_module(self.pb2_import)
-    with _system_path([self.grpc_python_out_directory]):
-      pb2_grpc = importlib.import_module(self.pb2_grpc_import)
-    server = grpc.server(
-        futures.ThreadPoolExecutor(max_workers=test_constants.POOL_SIZE))
-    pb2_grpc.add_TestServiceServicer_to_server(
-        DummySplitServicer(
-            pb2.Request, pb2.Response), server)
-    port = server.add_insecure_port('[::]:0')
-    server.start()
-    channel = grpc.insecure_channel('localhost:{}'.format(port))
-    stub = pb2_grpc.TestServiceStub(channel)
-    request = pb2.Request()
-    expected_response = pb2.Response()
-    response = stub.Call(request)
-    self.assertEqual(expected_response, response)
+    def testCall(self):
+        with _system_path([self.python_out_directory]):
+            pb2 = importlib.import_module(self.pb2_import)
+        with _system_path([self.grpc_python_out_directory]):
+            pb2_grpc = importlib.import_module(self.pb2_grpc_import)
+        server = grpc.server(
+            futures.ThreadPoolExecutor(max_workers=test_constants.POOL_SIZE))
+        pb2_grpc.add_TestServiceServicer_to_server(
+            DummySplitServicer(pb2.Request, pb2.Response), server)
+        port = server.add_insecure_port('[::]:0')
+        server.start()
+        channel = grpc.insecure_channel('localhost:{}'.format(port))
+        stub = pb2_grpc.TestServiceStub(channel)
+        request = pb2.Request()
+        expected_response = pb2.Response()
+        response = stub.Call(request)
+        self.assertEqual(expected_response, response)
 
 
 class SameSeparateTest(unittest.TestCase, SeparateTestMixin):
 
-  def setUp(self):
-    same_proto_contents = pkgutil.get_data(
-        'tests.protoc_plugin.protos.invocation_testing', 'same.proto')
-    self.directory = tempfile.mkdtemp(suffix='same_separate', dir='.')
-    self.proto_directory = os.path.join(self.directory, 'proto_path')
-    self.python_out_directory = os.path.join(self.directory, 'python_out')
-    self.grpc_python_out_directory = os.path.join(self.directory, 'grpc_python_out')
-    os.makedirs(self.proto_directory)
-    os.makedirs(self.python_out_directory)
-    os.makedirs(self.grpc_python_out_directory)
-    same_proto_file = os.path.join(self.proto_directory, 'same_separate.proto')
-    open(same_proto_file, 'wb').write(same_proto_contents)
-    protoc_result = protoc.main([
-        '',
-        '--proto_path={}'.format(self.proto_directory),
-        '--python_out={}'.format(self.python_out_directory),
-        '--grpc_python_out=grpc_2_0:{}'.format(self.grpc_python_out_directory),
-        same_proto_file,
-    ])
-    if protoc_result != 0:
-      raise Exception("unexpected protoc error")
-    open(os.path.join(self.grpc_python_out_directory, '__init__.py'), 'w').write('')
-    open(os.path.join(self.python_out_directory, '__init__.py'), 'w').write('')
-    self.pb2_import = 'same_separate_pb2'
-    self.pb2_grpc_import = 'same_separate_pb2_grpc'
-    self.should_find_services_in_pb2 = False
+    def setUp(self):
+        same_proto_contents = pkgutil.get_data(
+            'tests.protoc_plugin.protos.invocation_testing', 'same.proto')
+        self.directory = tempfile.mkdtemp(suffix='same_separate', dir='.')
+        self.proto_directory = os.path.join(self.directory, 'proto_path')
+        self.python_out_directory = os.path.join(self.directory, 'python_out')
+        self.grpc_python_out_directory = os.path.join(self.directory,
+                                                      'grpc_python_out')
+        os.makedirs(self.proto_directory)
+        os.makedirs(self.python_out_directory)
+        os.makedirs(self.grpc_python_out_directory)
+        same_proto_file = os.path.join(self.proto_directory,
+                                       'same_separate.proto')
+        open(same_proto_file, 'wb').write(same_proto_contents)
+        protoc_result = protoc.main([
+            '',
+            '--proto_path={}'.format(self.proto_directory),
+            '--python_out={}'.format(self.python_out_directory),
+            '--grpc_python_out=grpc_2_0:{}'.format(
+                self.grpc_python_out_directory),
+            same_proto_file,
+        ])
+        if protoc_result != 0:
+            raise Exception("unexpected protoc error")
+        open(os.path.join(self.grpc_python_out_directory, '__init__.py'),
+             'w').write('')
+        open(os.path.join(self.python_out_directory, '__init__.py'),
+             'w').write('')
+        self.pb2_import = 'same_separate_pb2'
+        self.pb2_grpc_import = 'same_separate_pb2_grpc'
+        self.should_find_services_in_pb2 = False
 
-  def tearDown(self):
-    shutil.rmtree(self.directory)
+    def tearDown(self):
+        shutil.rmtree(self.directory)
 
 
 class SameCommonTest(unittest.TestCase, CommonTestMixin):
 
-  def setUp(self):
-    same_proto_contents = pkgutil.get_data(
-        'tests.protoc_plugin.protos.invocation_testing', 'same.proto')
-    self.directory = tempfile.mkdtemp(suffix='same_common', dir='.')
-    self.proto_directory = os.path.join(self.directory, 'proto_path')
-    self.python_out_directory = os.path.join(self.directory, 'python_out')
-    self.grpc_python_out_directory = self.python_out_directory
-    os.makedirs(self.proto_directory)
-    os.makedirs(self.python_out_directory)
-    same_proto_file = os.path.join(self.proto_directory, 'same_common.proto')
-    open(same_proto_file, 'wb').write(same_proto_contents)
-    protoc_result = protoc.main([
-        '',
-        '--proto_path={}'.format(self.proto_directory),
-        '--python_out={}'.format(self.python_out_directory),
-        '--grpc_python_out={}'.format(self.grpc_python_out_directory),
-        same_proto_file,
-    ])
-    if protoc_result != 0:
-      raise Exception("unexpected protoc error")
-    open(os.path.join(self.python_out_directory, '__init__.py'), 'w').write('')
-    self.pb2_import = 'same_common_pb2'
-    self.pb2_grpc_import = 'same_common_pb2_grpc'
-    self.should_find_services_in_pb2 = True
+    def setUp(self):
+        same_proto_contents = pkgutil.get_data(
+            'tests.protoc_plugin.protos.invocation_testing', 'same.proto')
+        self.directory = tempfile.mkdtemp(suffix='same_common', dir='.')
+        self.proto_directory = os.path.join(self.directory, 'proto_path')
+        self.python_out_directory = os.path.join(self.directory, 'python_out')
+        self.grpc_python_out_directory = self.python_out_directory
+        os.makedirs(self.proto_directory)
+        os.makedirs(self.python_out_directory)
+        same_proto_file = os.path.join(self.proto_directory,
+                                       'same_common.proto')
+        open(same_proto_file, 'wb').write(same_proto_contents)
+        protoc_result = protoc.main([
+            '',
+            '--proto_path={}'.format(self.proto_directory),
+            '--python_out={}'.format(self.python_out_directory),
+            '--grpc_python_out={}'.format(self.grpc_python_out_directory),
+            same_proto_file,
+        ])
+        if protoc_result != 0:
+            raise Exception("unexpected protoc error")
+        open(os.path.join(self.python_out_directory, '__init__.py'),
+             'w').write('')
+        self.pb2_import = 'same_common_pb2'
+        self.pb2_grpc_import = 'same_common_pb2_grpc'
+        self.should_find_services_in_pb2 = True
 
-  def tearDown(self):
-    shutil.rmtree(self.directory)
+    def tearDown(self):
+        shutil.rmtree(self.directory)
 
 
 class SplitCommonTest(unittest.TestCase, CommonTestMixin):
 
-  def setUp(self):
-    services_proto_contents = pkgutil.get_data(
-        'tests.protoc_plugin.protos.invocation_testing.split_services',
-        'services.proto')
-    messages_proto_contents = pkgutil.get_data(
-        'tests.protoc_plugin.protos.invocation_testing.split_messages',
-        'messages.proto')
-    self.directory = tempfile.mkdtemp(suffix='split_common', dir='.')
-    self.proto_directory = os.path.join(self.directory, 'proto_path')
-    self.python_out_directory = os.path.join(self.directory, 'python_out')
-    self.grpc_python_out_directory = self.python_out_directory
-    os.makedirs(self.proto_directory)
-    os.makedirs(self.python_out_directory)
-    services_proto_file = os.path.join(self.proto_directory,
-                                       'split_common_services.proto')
-    messages_proto_file = os.path.join(self.proto_directory,
-                                       'split_common_messages.proto')
-    open(services_proto_file, 'wb').write(services_proto_contents.replace(
-        _MESSAGES_IMPORT,
-        b'import "split_common_messages.proto";'
-    ))
-    open(messages_proto_file, 'wb').write(messages_proto_contents)
-    protoc_result = protoc.main([
-        '',
-        '--proto_path={}'.format(self.proto_directory),
-        '--python_out={}'.format(self.python_out_directory),
-        '--grpc_python_out={}'.format(self.grpc_python_out_directory),
-        services_proto_file,
-        messages_proto_file,
-    ])
-    if protoc_result != 0:
-      raise Exception("unexpected protoc error")
-    open(os.path.join(self.python_out_directory, '__init__.py'), 'w').write('')
-    self.pb2_import = 'split_common_messages_pb2'
-    self.pb2_grpc_import = 'split_common_services_pb2_grpc'
-    self.should_find_services_in_pb2 = False
+    def setUp(self):
+        services_proto_contents = pkgutil.get_data(
+            'tests.protoc_plugin.protos.invocation_testing.split_services',
+            'services.proto')
+        messages_proto_contents = pkgutil.get_data(
+            'tests.protoc_plugin.protos.invocation_testing.split_messages',
+            'messages.proto')
+        self.directory = tempfile.mkdtemp(suffix='split_common', dir='.')
+        self.proto_directory = os.path.join(self.directory, 'proto_path')
+        self.python_out_directory = os.path.join(self.directory, 'python_out')
+        self.grpc_python_out_directory = self.python_out_directory
+        os.makedirs(self.proto_directory)
+        os.makedirs(self.python_out_directory)
+        services_proto_file = os.path.join(self.proto_directory,
+                                           'split_common_services.proto')
+        messages_proto_file = os.path.join(self.proto_directory,
+                                           'split_common_messages.proto')
+        open(services_proto_file, 'wb').write(
+            services_proto_contents.replace(
+                _MESSAGES_IMPORT, b'import "split_common_messages.proto";'))
+        open(messages_proto_file, 'wb').write(messages_proto_contents)
+        protoc_result = protoc.main([
+            '',
+            '--proto_path={}'.format(self.proto_directory),
+            '--python_out={}'.format(self.python_out_directory),
+            '--grpc_python_out={}'.format(self.grpc_python_out_directory),
+            services_proto_file,
+            messages_proto_file,
+        ])
+        if protoc_result != 0:
+            raise Exception("unexpected protoc error")
+        open(os.path.join(self.python_out_directory, '__init__.py'),
+             'w').write('')
+        self.pb2_import = 'split_common_messages_pb2'
+        self.pb2_grpc_import = 'split_common_services_pb2_grpc'
+        self.should_find_services_in_pb2 = False
 
-  def tearDown(self):
-    shutil.rmtree(self.directory)
+    def tearDown(self):
+        shutil.rmtree(self.directory)
 
 
 class SplitSeparateTest(unittest.TestCase, SeparateTestMixin):
 
-  def setUp(self):
-    services_proto_contents = pkgutil.get_data(
-        'tests.protoc_plugin.protos.invocation_testing.split_services',
-        'services.proto')
-    messages_proto_contents = pkgutil.get_data(
-        'tests.protoc_plugin.protos.invocation_testing.split_messages',
-        'messages.proto')
-    self.directory = tempfile.mkdtemp(suffix='split_separate', dir='.')
-    self.proto_directory = os.path.join(self.directory, 'proto_path')
-    self.python_out_directory = os.path.join(self.directory, 'python_out')
-    self.grpc_python_out_directory = os.path.join(self.directory, 'grpc_python_out')
-    os.makedirs(self.proto_directory)
-    os.makedirs(self.python_out_directory)
-    os.makedirs(self.grpc_python_out_directory)
-    services_proto_file = os.path.join(self.proto_directory,
-                                       'split_separate_services.proto')
-    messages_proto_file = os.path.join(self.proto_directory,
-                                       'split_separate_messages.proto')
-    open(services_proto_file, 'wb').write(services_proto_contents.replace(
-        _MESSAGES_IMPORT,
-        b'import "split_separate_messages.proto";'
-    ))
-    open(messages_proto_file, 'wb').write(messages_proto_contents)
-    protoc_result = protoc.main([
-        '',
-        '--proto_path={}'.format(self.proto_directory),
-        '--python_out={}'.format(self.python_out_directory),
-        '--grpc_python_out=grpc_2_0:{}'.format(self.grpc_python_out_directory),
-        services_proto_file,
-        messages_proto_file,
-    ])
-    if protoc_result != 0:
-      raise Exception("unexpected protoc error")
-    open(os.path.join(self.python_out_directory, '__init__.py'), 'w').write('')
-    self.pb2_import = 'split_separate_messages_pb2'
-    self.pb2_grpc_import = 'split_separate_services_pb2_grpc'
-    self.should_find_services_in_pb2 = False
+    def setUp(self):
+        services_proto_contents = pkgutil.get_data(
+            'tests.protoc_plugin.protos.invocation_testing.split_services',
+            'services.proto')
+        messages_proto_contents = pkgutil.get_data(
+            'tests.protoc_plugin.protos.invocation_testing.split_messages',
+            'messages.proto')
+        self.directory = tempfile.mkdtemp(suffix='split_separate', dir='.')
+        self.proto_directory = os.path.join(self.directory, 'proto_path')
+        self.python_out_directory = os.path.join(self.directory, 'python_out')
+        self.grpc_python_out_directory = os.path.join(self.directory,
+                                                      'grpc_python_out')
+        os.makedirs(self.proto_directory)
+        os.makedirs(self.python_out_directory)
+        os.makedirs(self.grpc_python_out_directory)
+        services_proto_file = os.path.join(self.proto_directory,
+                                           'split_separate_services.proto')
+        messages_proto_file = os.path.join(self.proto_directory,
+                                           'split_separate_messages.proto')
+        open(services_proto_file, 'wb').write(
+            services_proto_contents.replace(
+                _MESSAGES_IMPORT, b'import "split_separate_messages.proto";'))
+        open(messages_proto_file, 'wb').write(messages_proto_contents)
+        protoc_result = protoc.main([
+            '',
+            '--proto_path={}'.format(self.proto_directory),
+            '--python_out={}'.format(self.python_out_directory),
+            '--grpc_python_out=grpc_2_0:{}'.format(
+                self.grpc_python_out_directory),
+            services_proto_file,
+            messages_proto_file,
+        ])
+        if protoc_result != 0:
+            raise Exception("unexpected protoc error")
+        open(os.path.join(self.python_out_directory, '__init__.py'),
+             'w').write('')
+        self.pb2_import = 'split_separate_messages_pb2'
+        self.pb2_grpc_import = 'split_separate_services_pb2_grpc'
+        self.should_find_services_in_pb2 = False
 
-  def tearDown(self):
-    shutil.rmtree(self.directory)
+    def tearDown(self):
+        shutil.rmtree(self.directory)
 
 
 if __name__ == '__main__':
-  unittest.main(verbosity=2)
+    unittest.main(verbosity=2)
diff --git a/src/python/grpcio_tests/tests/protoc_plugin/beta_python_plugin_test.py b/src/python/grpcio_tests/tests/protoc_plugin/beta_python_plugin_test.py
index 1eba9c9..f64f4e9 100644
--- a/src/python/grpcio_tests/tests/protoc_plugin/beta_python_plugin_test.py
+++ b/src/python/grpcio_tests/tests/protoc_plugin/beta_python_plugin_test.py
@@ -64,84 +64,84 @@
 
 class _ServicerMethods(object):
 
-  def __init__(self):
-    self._condition = threading.Condition()
-    self._paused = False
-    self._fail = False
+    def __init__(self):
+        self._condition = threading.Condition()
+        self._paused = False
+        self._fail = False
 
-  @contextlib.contextmanager
-  def pause(self):  # pylint: disable=invalid-name
-    with self._condition:
-      self._paused = True
-    yield
-    with self._condition:
-      self._paused = False
-      self._condition.notify_all()
+    @contextlib.contextmanager
+    def pause(self):  # pylint: disable=invalid-name
+        with self._condition:
+            self._paused = True
+        yield
+        with self._condition:
+            self._paused = False
+            self._condition.notify_all()
 
-  @contextlib.contextmanager
-  def fail(self):  # pylint: disable=invalid-name
-    with self._condition:
-      self._fail = True
-    yield
-    with self._condition:
-      self._fail = False
+    @contextlib.contextmanager
+    def fail(self):  # pylint: disable=invalid-name
+        with self._condition:
+            self._fail = True
+        yield
+        with self._condition:
+            self._fail = False
 
-  def _control(self):  # pylint: disable=invalid-name
-    with self._condition:
-      if self._fail:
-        raise ValueError()
-      while self._paused:
-        self._condition.wait()
+    def _control(self):  # pylint: disable=invalid-name
+        with self._condition:
+            if self._fail:
+                raise ValueError()
+            while self._paused:
+                self._condition.wait()
 
-  def UnaryCall(self, request, unused_rpc_context):
-    response = response_pb2.SimpleResponse()
-    response.payload.payload_type = payload_pb2.COMPRESSABLE
-    response.payload.payload_compressable = 'a' * request.response_size
-    self._control()
-    return response
-
-  def StreamingOutputCall(self, request, unused_rpc_context):
-    for parameter in request.response_parameters:
-      response = response_pb2.StreamingOutputCallResponse()
-      response.payload.payload_type = payload_pb2.COMPRESSABLE
-      response.payload.payload_compressable = 'a' * parameter.size
-      self._control()
-      yield response
-
-  def StreamingInputCall(self, request_iter, unused_rpc_context):
-    response = response_pb2.StreamingInputCallResponse()
-    aggregated_payload_size = 0
-    for request in request_iter:
-      aggregated_payload_size += len(request.payload.payload_compressable)
-    response.aggregated_payload_size = aggregated_payload_size
-    self._control()
-    return response
-
-  def FullDuplexCall(self, request_iter, unused_rpc_context):
-    for request in request_iter:
-      for parameter in request.response_parameters:
-        response = response_pb2.StreamingOutputCallResponse()
+    def UnaryCall(self, request, unused_rpc_context):
+        response = response_pb2.SimpleResponse()
         response.payload.payload_type = payload_pb2.COMPRESSABLE
-        response.payload.payload_compressable = 'a' * parameter.size
+        response.payload.payload_compressable = 'a' * request.response_size
         self._control()
-        yield response
+        return response
 
-  def HalfDuplexCall(self, request_iter, unused_rpc_context):
-    responses = []
-    for request in request_iter:
-      for parameter in request.response_parameters:
-        response = response_pb2.StreamingOutputCallResponse()
-        response.payload.payload_type = payload_pb2.COMPRESSABLE
-        response.payload.payload_compressable = 'a' * parameter.size
+    def StreamingOutputCall(self, request, unused_rpc_context):
+        for parameter in request.response_parameters:
+            response = response_pb2.StreamingOutputCallResponse()
+            response.payload.payload_type = payload_pb2.COMPRESSABLE
+            response.payload.payload_compressable = 'a' * parameter.size
+            self._control()
+            yield response
+
+    def StreamingInputCall(self, request_iter, unused_rpc_context):
+        response = response_pb2.StreamingInputCallResponse()
+        aggregated_payload_size = 0
+        for request in request_iter:
+            aggregated_payload_size += len(request.payload.payload_compressable)
+        response.aggregated_payload_size = aggregated_payload_size
         self._control()
-        responses.append(response)
-    for response in responses:
-      yield response
+        return response
+
+    def FullDuplexCall(self, request_iter, unused_rpc_context):
+        for request in request_iter:
+            for parameter in request.response_parameters:
+                response = response_pb2.StreamingOutputCallResponse()
+                response.payload.payload_type = payload_pb2.COMPRESSABLE
+                response.payload.payload_compressable = 'a' * parameter.size
+                self._control()
+                yield response
+
+    def HalfDuplexCall(self, request_iter, unused_rpc_context):
+        responses = []
+        for request in request_iter:
+            for parameter in request.response_parameters:
+                response = response_pb2.StreamingOutputCallResponse()
+                response.payload.payload_type = payload_pb2.COMPRESSABLE
+                response.payload.payload_compressable = 'a' * parameter.size
+                self._control()
+                responses.append(response)
+        for response in responses:
+            yield response
 
 
 @contextlib.contextmanager
 def _CreateService():
-  """Provides a servicer backend and a stub.
+    """Provides a servicer backend and a stub.
 
   The servicer is just the implementation of the actual servicer passed to the
   face player of the python RPC implementation; the two are detached.
@@ -151,38 +151,38 @@
       the service bound to the stub and and stub is the stub on which to invoke
       RPCs.
   """
-  servicer_methods = _ServicerMethods()
+    servicer_methods = _ServicerMethods()
 
-  class Servicer(getattr(service_pb2, SERVICER_IDENTIFIER)):
+    class Servicer(getattr(service_pb2, SERVICER_IDENTIFIER)):
 
-    def UnaryCall(self, request, context):
-      return servicer_methods.UnaryCall(request, context)
+        def UnaryCall(self, request, context):
+            return servicer_methods.UnaryCall(request, context)
 
-    def StreamingOutputCall(self, request, context):
-      return servicer_methods.StreamingOutputCall(request, context)
+        def StreamingOutputCall(self, request, context):
+            return servicer_methods.StreamingOutputCall(request, context)
 
-    def StreamingInputCall(self, request_iter, context):
-      return servicer_methods.StreamingInputCall(request_iter, context)
+        def StreamingInputCall(self, request_iter, context):
+            return servicer_methods.StreamingInputCall(request_iter, context)
 
-    def FullDuplexCall(self, request_iter, context):
-      return servicer_methods.FullDuplexCall(request_iter, context)
+        def FullDuplexCall(self, request_iter, context):
+            return servicer_methods.FullDuplexCall(request_iter, context)
 
-    def HalfDuplexCall(self, request_iter, context):
-      return servicer_methods.HalfDuplexCall(request_iter, context)
+        def HalfDuplexCall(self, request_iter, context):
+            return servicer_methods.HalfDuplexCall(request_iter, context)
 
-  servicer = Servicer()
-  server = getattr(service_pb2, SERVER_FACTORY_IDENTIFIER)(servicer)
-  port = server.add_insecure_port('[::]:0')
-  server.start()
-  channel = implementations.insecure_channel('localhost', port)
-  stub = getattr(service_pb2, STUB_FACTORY_IDENTIFIER)(channel)
-  yield (servicer_methods, stub)
-  server.stop(0)
+    servicer = Servicer()
+    server = getattr(service_pb2, SERVER_FACTORY_IDENTIFIER)(servicer)
+    port = server.add_insecure_port('[::]:0')
+    server.start()
+    channel = implementations.insecure_channel('localhost', port)
+    stub = getattr(service_pb2, STUB_FACTORY_IDENTIFIER)(channel)
+    yield (servicer_methods, stub)
+    server.stop(0)
 
 
 @contextlib.contextmanager
 def _CreateIncompleteService():
-  """Provides a servicer backend that fails to implement methods and its stub.
+    """Provides a servicer backend that fails to implement methods and its stub.
 
   The servicer is just the implementation of the actual servicer passed to the
   face player of the python RPC implementation; the two are detached.
@@ -194,297 +194,297 @@
       RPCs.
   """
 
-  class Servicer(getattr(service_pb2, SERVICER_IDENTIFIER)):
-    pass
+    class Servicer(getattr(service_pb2, SERVICER_IDENTIFIER)):
+        pass
 
-  servicer = Servicer()
-  server = getattr(service_pb2, SERVER_FACTORY_IDENTIFIER)(servicer)
-  port = server.add_insecure_port('[::]:0')
-  server.start()
-  channel = implementations.insecure_channel('localhost', port)
-  stub = getattr(service_pb2, STUB_FACTORY_IDENTIFIER)(channel)
-  yield None, stub
-  server.stop(0)
+    servicer = Servicer()
+    server = getattr(service_pb2, SERVER_FACTORY_IDENTIFIER)(servicer)
+    port = server.add_insecure_port('[::]:0')
+    server.start()
+    channel = implementations.insecure_channel('localhost', port)
+    stub = getattr(service_pb2, STUB_FACTORY_IDENTIFIER)(channel)
+    yield None, stub
+    server.stop(0)
 
 
 def _streaming_input_request_iterator():
-  for _ in range(3):
-    request = request_pb2.StreamingInputCallRequest()
-    request.payload.payload_type = payload_pb2.COMPRESSABLE
-    request.payload.payload_compressable = 'a'
-    yield request
+    for _ in range(3):
+        request = request_pb2.StreamingInputCallRequest()
+        request.payload.payload_type = payload_pb2.COMPRESSABLE
+        request.payload.payload_compressable = 'a'
+        yield request
 
 
 def _streaming_output_request():
-  request = request_pb2.StreamingOutputCallRequest()
-  sizes = [1, 2, 3]
-  request.response_parameters.add(size=sizes[0], interval_us=0)
-  request.response_parameters.add(size=sizes[1], interval_us=0)
-  request.response_parameters.add(size=sizes[2], interval_us=0)
-  return request
+    request = request_pb2.StreamingOutputCallRequest()
+    sizes = [1, 2, 3]
+    request.response_parameters.add(size=sizes[0], interval_us=0)
+    request.response_parameters.add(size=sizes[1], interval_us=0)
+    request.response_parameters.add(size=sizes[2], interval_us=0)
+    return request
 
 
 def _full_duplex_request_iterator():
-  request = request_pb2.StreamingOutputCallRequest()
-  request.response_parameters.add(size=1, interval_us=0)
-  yield request
-  request = request_pb2.StreamingOutputCallRequest()
-  request.response_parameters.add(size=2, interval_us=0)
-  request.response_parameters.add(size=3, interval_us=0)
-  yield request
+    request = request_pb2.StreamingOutputCallRequest()
+    request.response_parameters.add(size=1, interval_us=0)
+    yield request
+    request = request_pb2.StreamingOutputCallRequest()
+    request.response_parameters.add(size=2, interval_us=0)
+    request.response_parameters.add(size=3, interval_us=0)
+    yield request
 
 
 class PythonPluginTest(unittest.TestCase):
-  """Test case for the gRPC Python protoc-plugin.
+    """Test case for the gRPC Python protoc-plugin.
 
   While reading these tests, remember that the futures API
   (`stub.method.future()`) only gives futures for the *response-unary*
   methods and does not exist for response-streaming methods.
   """
 
-  def testImportAttributes(self):
-    # check that we can access the generated module and its members.
-    self.assertIsNotNone(
-        getattr(service_pb2, SERVICER_IDENTIFIER, None))
-    self.assertIsNotNone(
-        getattr(service_pb2, STUB_IDENTIFIER, None))
-    self.assertIsNotNone(
-        getattr(service_pb2, SERVER_FACTORY_IDENTIFIER, None))
-    self.assertIsNotNone(
-        getattr(service_pb2, STUB_FACTORY_IDENTIFIER, None))
+    def testImportAttributes(self):
+        # check that we can access the generated module and its members.
+        self.assertIsNotNone(getattr(service_pb2, SERVICER_IDENTIFIER, None))
+        self.assertIsNotNone(getattr(service_pb2, STUB_IDENTIFIER, None))
+        self.assertIsNotNone(
+            getattr(service_pb2, SERVER_FACTORY_IDENTIFIER, None))
+        self.assertIsNotNone(
+            getattr(service_pb2, STUB_FACTORY_IDENTIFIER, None))
 
-  def testUpDown(self):
-    with _CreateService():
-      request_pb2.SimpleRequest(response_size=13)
+    def testUpDown(self):
+        with _CreateService():
+            request_pb2.SimpleRequest(response_size=13)
 
-  def testIncompleteServicer(self):
-    with _CreateIncompleteService() as (_, stub):
-      request = request_pb2.SimpleRequest(response_size=13)
-      try:
-        stub.UnaryCall(request, test_constants.LONG_TIMEOUT)
-      except face.AbortionError as error:
-        self.assertEqual(interfaces.StatusCode.UNIMPLEMENTED, error.code)
+    def testIncompleteServicer(self):
+        with _CreateIncompleteService() as (_, stub):
+            request = request_pb2.SimpleRequest(response_size=13)
+            try:
+                stub.UnaryCall(request, test_constants.LONG_TIMEOUT)
+            except face.AbortionError as error:
+                self.assertEqual(interfaces.StatusCode.UNIMPLEMENTED,
+                                 error.code)
 
-  def testUnaryCall(self):
-    with _CreateService() as (methods, stub):
-      request = request_pb2.SimpleRequest(response_size=13)
-      response = stub.UnaryCall(request, test_constants.LONG_TIMEOUT)
-    expected_response = methods.UnaryCall(request, 'not a real context!')
-    self.assertEqual(expected_response, response)
-
-  def testUnaryCallFuture(self):
-    with _CreateService() as (methods, stub):
-      request = request_pb2.SimpleRequest(response_size=13)
-      # Check that the call does not block waiting for the server to respond.
-      with methods.pause():
-        response_future = stub.UnaryCall.future(
-            request, test_constants.LONG_TIMEOUT)
-      response = response_future.result()
-    expected_response = methods.UnaryCall(request, 'not a real RpcContext!')
-    self.assertEqual(expected_response, response)
-
-  def testUnaryCallFutureExpired(self):
-    with _CreateService() as (methods, stub):
-      request = request_pb2.SimpleRequest(response_size=13)
-      with methods.pause():
-        response_future = stub.UnaryCall.future(
-            request, test_constants.SHORT_TIMEOUT)
-        with self.assertRaises(face.ExpirationError):
-          response_future.result()
-
-  def testUnaryCallFutureCancelled(self):
-    with _CreateService() as (methods, stub):
-      request = request_pb2.SimpleRequest(response_size=13)
-      with methods.pause():
-        response_future = stub.UnaryCall.future(request, 1)
-        response_future.cancel()
-        self.assertTrue(response_future.cancelled())
-
-  def testUnaryCallFutureFailed(self):
-    with _CreateService() as (methods, stub):
-      request = request_pb2.SimpleRequest(response_size=13)
-      with methods.fail():
-        response_future = stub.UnaryCall.future(
-            request, test_constants.LONG_TIMEOUT)
-        self.assertIsNotNone(response_future.exception())
-
-  def testStreamingOutputCall(self):
-    with _CreateService() as (methods, stub):
-      request = _streaming_output_request()
-      responses = stub.StreamingOutputCall(
-          request, test_constants.LONG_TIMEOUT)
-      expected_responses = methods.StreamingOutputCall(
-          request, 'not a real RpcContext!')
-      for expected_response, response in moves.zip_longest(
-          expected_responses, responses):
+    def testUnaryCall(self):
+        with _CreateService() as (methods, stub):
+            request = request_pb2.SimpleRequest(response_size=13)
+            response = stub.UnaryCall(request, test_constants.LONG_TIMEOUT)
+        expected_response = methods.UnaryCall(request, 'not a real context!')
         self.assertEqual(expected_response, response)
 
-  def testStreamingOutputCallExpired(self):
-    with _CreateService() as (methods, stub):
-      request = _streaming_output_request()
-      with methods.pause():
-        responses = stub.StreamingOutputCall(
-            request, test_constants.SHORT_TIMEOUT)
-        with self.assertRaises(face.ExpirationError):
-          list(responses)
-
-  def testStreamingOutputCallCancelled(self):
-    with _CreateService() as (methods, stub):
-      request = _streaming_output_request()
-      responses = stub.StreamingOutputCall(
-          request, test_constants.LONG_TIMEOUT)
-      next(responses)
-      responses.cancel()
-      with self.assertRaises(face.CancellationError):
-        next(responses)
-
-  def testStreamingOutputCallFailed(self):
-    with _CreateService() as (methods, stub):
-      request = _streaming_output_request()
-      with methods.fail():
-        responses = stub.StreamingOutputCall(request, 1)
-        self.assertIsNotNone(responses)
-        with self.assertRaises(face.RemoteError):
-          next(responses)
-
-  def testStreamingInputCall(self):
-    with _CreateService() as (methods, stub):
-      response = stub.StreamingInputCall(
-          _streaming_input_request_iterator(),
-          test_constants.LONG_TIMEOUT)
-    expected_response = methods.StreamingInputCall(
-        _streaming_input_request_iterator(),
-        'not a real RpcContext!')
-    self.assertEqual(expected_response, response)
-
-  def testStreamingInputCallFuture(self):
-    with _CreateService() as (methods, stub):
-      with methods.pause():
-        response_future = stub.StreamingInputCall.future(
-            _streaming_input_request_iterator(),
-            test_constants.LONG_TIMEOUT)
-      response = response_future.result()
-    expected_response = methods.StreamingInputCall(
-        _streaming_input_request_iterator(),
-        'not a real RpcContext!')
-    self.assertEqual(expected_response, response)
-
-  def testStreamingInputCallFutureExpired(self):
-    with _CreateService() as (methods, stub):
-      with methods.pause():
-        response_future = stub.StreamingInputCall.future(
-            _streaming_input_request_iterator(),
-            test_constants.SHORT_TIMEOUT)
-        with self.assertRaises(face.ExpirationError):
-          response_future.result()
-        self.assertIsInstance(
-            response_future.exception(), face.ExpirationError)
-
-  def testStreamingInputCallFutureCancelled(self):
-    with _CreateService() as (methods, stub):
-      with methods.pause():
-        response_future = stub.StreamingInputCall.future(
-            _streaming_input_request_iterator(),
-            test_constants.LONG_TIMEOUT)
-        response_future.cancel()
-        self.assertTrue(response_future.cancelled())
-      with self.assertRaises(future.CancelledError):
-        response_future.result()
-
-  def testStreamingInputCallFutureFailed(self):
-    with _CreateService() as (methods, stub):
-      with methods.fail():
-        response_future = stub.StreamingInputCall.future(
-            _streaming_input_request_iterator(),
-            test_constants.LONG_TIMEOUT)
-        self.assertIsNotNone(response_future.exception())
-
-  def testFullDuplexCall(self):
-    with _CreateService() as (methods, stub):
-      responses = stub.FullDuplexCall(
-          _full_duplex_request_iterator(),
-          test_constants.LONG_TIMEOUT)
-      expected_responses = methods.FullDuplexCall(
-          _full_duplex_request_iterator(),
-          'not a real RpcContext!')
-      for expected_response, response in moves.zip_longest(
-          expected_responses, responses):
+    def testUnaryCallFuture(self):
+        with _CreateService() as (methods, stub):
+            request = request_pb2.SimpleRequest(response_size=13)
+            # Check that the call does not block waiting for the server to respond.
+            with methods.pause():
+                response_future = stub.UnaryCall.future(
+                    request, test_constants.LONG_TIMEOUT)
+            response = response_future.result()
+        expected_response = methods.UnaryCall(request, 'not a real RpcContext!')
         self.assertEqual(expected_response, response)
 
-  def testFullDuplexCallExpired(self):
-    request_iterator = _full_duplex_request_iterator()
-    with _CreateService() as (methods, stub):
-      with methods.pause():
-        responses = stub.FullDuplexCall(
-            request_iterator, test_constants.SHORT_TIMEOUT)
-        with self.assertRaises(face.ExpirationError):
-          list(responses)
+    def testUnaryCallFutureExpired(self):
+        with _CreateService() as (methods, stub):
+            request = request_pb2.SimpleRequest(response_size=13)
+            with methods.pause():
+                response_future = stub.UnaryCall.future(
+                    request, test_constants.SHORT_TIMEOUT)
+                with self.assertRaises(face.ExpirationError):
+                    response_future.result()
 
-  def testFullDuplexCallCancelled(self):
-    with _CreateService() as (methods, stub):
-      request_iterator = _full_duplex_request_iterator()
-      responses = stub.FullDuplexCall(
-          request_iterator, test_constants.LONG_TIMEOUT)
-      next(responses)
-      responses.cancel()
-      with self.assertRaises(face.CancellationError):
-        next(responses)
+    def testUnaryCallFutureCancelled(self):
+        with _CreateService() as (methods, stub):
+            request = request_pb2.SimpleRequest(response_size=13)
+            with methods.pause():
+                response_future = stub.UnaryCall.future(request, 1)
+                response_future.cancel()
+                self.assertTrue(response_future.cancelled())
 
-  def testFullDuplexCallFailed(self):
-    request_iterator = _full_duplex_request_iterator()
-    with _CreateService() as (methods, stub):
-      with methods.fail():
-        responses = stub.FullDuplexCall(
-            request_iterator, test_constants.LONG_TIMEOUT)
-        self.assertIsNotNone(responses)
-        with self.assertRaises(face.RemoteError):
-          next(responses)
+    def testUnaryCallFutureFailed(self):
+        with _CreateService() as (methods, stub):
+            request = request_pb2.SimpleRequest(response_size=13)
+            with methods.fail():
+                response_future = stub.UnaryCall.future(
+                    request, test_constants.LONG_TIMEOUT)
+                self.assertIsNotNone(response_future.exception())
 
-  def testHalfDuplexCall(self):
-    with _CreateService() as (methods, stub):
-      def half_duplex_request_iterator():
-        request = request_pb2.StreamingOutputCallRequest()
-        request.response_parameters.add(size=1, interval_us=0)
-        yield request
-        request = request_pb2.StreamingOutputCallRequest()
-        request.response_parameters.add(size=2, interval_us=0)
-        request.response_parameters.add(size=3, interval_us=0)
-        yield request
-      responses = stub.HalfDuplexCall(
-          half_duplex_request_iterator(), test_constants.LONG_TIMEOUT)
-      expected_responses = methods.HalfDuplexCall(
-          half_duplex_request_iterator(), 'not a real RpcContext!')
-      for check in moves.zip_longest(expected_responses, responses):
-        expected_response, response = check
+    def testStreamingOutputCall(self):
+        with _CreateService() as (methods, stub):
+            request = _streaming_output_request()
+            responses = stub.StreamingOutputCall(request,
+                                                 test_constants.LONG_TIMEOUT)
+            expected_responses = methods.StreamingOutputCall(
+                request, 'not a real RpcContext!')
+            for expected_response, response in moves.zip_longest(
+                    expected_responses, responses):
+                self.assertEqual(expected_response, response)
+
+    def testStreamingOutputCallExpired(self):
+        with _CreateService() as (methods, stub):
+            request = _streaming_output_request()
+            with methods.pause():
+                responses = stub.StreamingOutputCall(
+                    request, test_constants.SHORT_TIMEOUT)
+                with self.assertRaises(face.ExpirationError):
+                    list(responses)
+
+    def testStreamingOutputCallCancelled(self):
+        with _CreateService() as (methods, stub):
+            request = _streaming_output_request()
+            responses = stub.StreamingOutputCall(request,
+                                                 test_constants.LONG_TIMEOUT)
+            next(responses)
+            responses.cancel()
+            with self.assertRaises(face.CancellationError):
+                next(responses)
+
+    def testStreamingOutputCallFailed(self):
+        with _CreateService() as (methods, stub):
+            request = _streaming_output_request()
+            with methods.fail():
+                responses = stub.StreamingOutputCall(request, 1)
+                self.assertIsNotNone(responses)
+                with self.assertRaises(face.RemoteError):
+                    next(responses)
+
+    def testStreamingInputCall(self):
+        with _CreateService() as (methods, stub):
+            response = stub.StreamingInputCall(
+                _streaming_input_request_iterator(),
+                test_constants.LONG_TIMEOUT)
+        expected_response = methods.StreamingInputCall(
+            _streaming_input_request_iterator(), 'not a real RpcContext!')
         self.assertEqual(expected_response, response)
 
-  def testHalfDuplexCallWedged(self):
-    condition = threading.Condition()
-    wait_cell = [False]
-    @contextlib.contextmanager
-    def wait():  # pylint: disable=invalid-name
-      # Where's Python 3's 'nonlocal' statement when you need it?
-      with condition:
-        wait_cell[0] = True
-      yield
-      with condition:
-        wait_cell[0] = False
-        condition.notify_all()
-    def half_duplex_request_iterator():
-      request = request_pb2.StreamingOutputCallRequest()
-      request.response_parameters.add(size=1, interval_us=0)
-      yield request
-      with condition:
-        while wait_cell[0]:
-          condition.wait()
-    with _CreateService() as (methods, stub):
-      with wait():
-        responses = stub.HalfDuplexCall(
-            half_duplex_request_iterator(), test_constants.SHORT_TIMEOUT)
-        # half-duplex waits for the client to send all info
-        with self.assertRaises(face.ExpirationError):
-          next(responses)
+    def testStreamingInputCallFuture(self):
+        with _CreateService() as (methods, stub):
+            with methods.pause():
+                response_future = stub.StreamingInputCall.future(
+                    _streaming_input_request_iterator(),
+                    test_constants.LONG_TIMEOUT)
+            response = response_future.result()
+        expected_response = methods.StreamingInputCall(
+            _streaming_input_request_iterator(), 'not a real RpcContext!')
+        self.assertEqual(expected_response, response)
+
+    def testStreamingInputCallFutureExpired(self):
+        with _CreateService() as (methods, stub):
+            with methods.pause():
+                response_future = stub.StreamingInputCall.future(
+                    _streaming_input_request_iterator(),
+                    test_constants.SHORT_TIMEOUT)
+                with self.assertRaises(face.ExpirationError):
+                    response_future.result()
+                self.assertIsInstance(response_future.exception(),
+                                      face.ExpirationError)
+
+    def testStreamingInputCallFutureCancelled(self):
+        with _CreateService() as (methods, stub):
+            with methods.pause():
+                response_future = stub.StreamingInputCall.future(
+                    _streaming_input_request_iterator(),
+                    test_constants.LONG_TIMEOUT)
+                response_future.cancel()
+                self.assertTrue(response_future.cancelled())
+            with self.assertRaises(future.CancelledError):
+                response_future.result()
+
+    def testStreamingInputCallFutureFailed(self):
+        with _CreateService() as (methods, stub):
+            with methods.fail():
+                response_future = stub.StreamingInputCall.future(
+                    _streaming_input_request_iterator(),
+                    test_constants.LONG_TIMEOUT)
+                self.assertIsNotNone(response_future.exception())
+
+    def testFullDuplexCall(self):
+        with _CreateService() as (methods, stub):
+            responses = stub.FullDuplexCall(_full_duplex_request_iterator(),
+                                            test_constants.LONG_TIMEOUT)
+            expected_responses = methods.FullDuplexCall(
+                _full_duplex_request_iterator(), 'not a real RpcContext!')
+            for expected_response, response in moves.zip_longest(
+                    expected_responses, responses):
+                self.assertEqual(expected_response, response)
+
+    def testFullDuplexCallExpired(self):
+        request_iterator = _full_duplex_request_iterator()
+        with _CreateService() as (methods, stub):
+            with methods.pause():
+                responses = stub.FullDuplexCall(request_iterator,
+                                                test_constants.SHORT_TIMEOUT)
+                with self.assertRaises(face.ExpirationError):
+                    list(responses)
+
+    def testFullDuplexCallCancelled(self):
+        with _CreateService() as (methods, stub):
+            request_iterator = _full_duplex_request_iterator()
+            responses = stub.FullDuplexCall(request_iterator,
+                                            test_constants.LONG_TIMEOUT)
+            next(responses)
+            responses.cancel()
+            with self.assertRaises(face.CancellationError):
+                next(responses)
+
+    def testFullDuplexCallFailed(self):
+        request_iterator = _full_duplex_request_iterator()
+        with _CreateService() as (methods, stub):
+            with methods.fail():
+                responses = stub.FullDuplexCall(request_iterator,
+                                                test_constants.LONG_TIMEOUT)
+                self.assertIsNotNone(responses)
+                with self.assertRaises(face.RemoteError):
+                    next(responses)
+
+    def testHalfDuplexCall(self):
+        with _CreateService() as (methods, stub):
+
+            def half_duplex_request_iterator():
+                request = request_pb2.StreamingOutputCallRequest()
+                request.response_parameters.add(size=1, interval_us=0)
+                yield request
+                request = request_pb2.StreamingOutputCallRequest()
+                request.response_parameters.add(size=2, interval_us=0)
+                request.response_parameters.add(size=3, interval_us=0)
+                yield request
+
+            responses = stub.HalfDuplexCall(half_duplex_request_iterator(),
+                                            test_constants.LONG_TIMEOUT)
+            expected_responses = methods.HalfDuplexCall(
+                half_duplex_request_iterator(), 'not a real RpcContext!')
+            for check in moves.zip_longest(expected_responses, responses):
+                expected_response, response = check
+                self.assertEqual(expected_response, response)
+
+    def testHalfDuplexCallWedged(self):
+        condition = threading.Condition()
+        wait_cell = [False]
+
+        @contextlib.contextmanager
+        def wait():  # pylint: disable=invalid-name
+            # Where's Python 3's 'nonlocal' statement when you need it?
+            with condition:
+                wait_cell[0] = True
+            yield
+            with condition:
+                wait_cell[0] = False
+                condition.notify_all()
+
+        def half_duplex_request_iterator():
+            request = request_pb2.StreamingOutputCallRequest()
+            request.response_parameters.add(size=1, interval_us=0)
+            yield request
+            with condition:
+                while wait_cell[0]:
+                    condition.wait()
+
+        with _CreateService() as (methods, stub):
+            with wait():
+                responses = stub.HalfDuplexCall(half_duplex_request_iterator(),
+                                                test_constants.SHORT_TIMEOUT)
+                # half-duplex waits for the client to send all info
+                with self.assertRaises(face.ExpirationError):
+                    next(responses)
 
 
 if __name__ == '__main__':
-  unittest.main(verbosity=2)
+    unittest.main(verbosity=2)
diff --git a/src/python/grpcio_tests/tests/protoc_plugin/protos/__init__.py b/src/python/grpcio_tests/tests/protoc_plugin/protos/__init__.py
index 7086519..b893988 100644
--- a/src/python/grpcio_tests/tests/protoc_plugin/protos/__init__.py
+++ b/src/python/grpcio_tests/tests/protoc_plugin/protos/__init__.py
@@ -26,5 +26,3 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
diff --git a/src/python/grpcio_tests/tests/protoc_plugin/protos/invocation_testing/__init__.py b/src/python/grpcio_tests/tests/protoc_plugin/protos/invocation_testing/__init__.py
index 2f88fa0..100a624 100644
--- a/src/python/grpcio_tests/tests/protoc_plugin/protos/invocation_testing/__init__.py
+++ b/src/python/grpcio_tests/tests/protoc_plugin/protos/invocation_testing/__init__.py
@@ -26,5 +26,3 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
diff --git a/src/python/grpcio_tests/tests/protoc_plugin/protos/invocation_testing/split_messages/__init__.py b/src/python/grpcio_tests/tests/protoc_plugin/protos/invocation_testing/split_messages/__init__.py
index 2f88fa0..100a624 100644
--- a/src/python/grpcio_tests/tests/protoc_plugin/protos/invocation_testing/split_messages/__init__.py
+++ b/src/python/grpcio_tests/tests/protoc_plugin/protos/invocation_testing/split_messages/__init__.py
@@ -26,5 +26,3 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
diff --git a/src/python/grpcio_tests/tests/protoc_plugin/protos/invocation_testing/split_services/__init__.py b/src/python/grpcio_tests/tests/protoc_plugin/protos/invocation_testing/split_services/__init__.py
index 2f88fa0..100a624 100644
--- a/src/python/grpcio_tests/tests/protoc_plugin/protos/invocation_testing/split_services/__init__.py
+++ b/src/python/grpcio_tests/tests/protoc_plugin/protos/invocation_testing/split_services/__init__.py
@@ -26,5 +26,3 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
diff --git a/src/python/grpcio_tests/tests/protoc_plugin/protos/payload/__init__.py b/src/python/grpcio_tests/tests/protoc_plugin/protos/payload/__init__.py
index 7086519..b893988 100644
--- a/src/python/grpcio_tests/tests/protoc_plugin/protos/payload/__init__.py
+++ b/src/python/grpcio_tests/tests/protoc_plugin/protos/payload/__init__.py
@@ -26,5 +26,3 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
diff --git a/src/python/grpcio_tests/tests/protoc_plugin/protos/requests/__init__.py b/src/python/grpcio_tests/tests/protoc_plugin/protos/requests/__init__.py
index 7086519..b893988 100644
--- a/src/python/grpcio_tests/tests/protoc_plugin/protos/requests/__init__.py
+++ b/src/python/grpcio_tests/tests/protoc_plugin/protos/requests/__init__.py
@@ -26,5 +26,3 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
diff --git a/src/python/grpcio_tests/tests/protoc_plugin/protos/requests/r/__init__.py b/src/python/grpcio_tests/tests/protoc_plugin/protos/requests/r/__init__.py
index 7086519..b893988 100644
--- a/src/python/grpcio_tests/tests/protoc_plugin/protos/requests/r/__init__.py
+++ b/src/python/grpcio_tests/tests/protoc_plugin/protos/requests/r/__init__.py
@@ -26,5 +26,3 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
diff --git a/src/python/grpcio_tests/tests/protoc_plugin/protos/responses/__init__.py b/src/python/grpcio_tests/tests/protoc_plugin/protos/responses/__init__.py
index 7086519..b893988 100644
--- a/src/python/grpcio_tests/tests/protoc_plugin/protos/responses/__init__.py
+++ b/src/python/grpcio_tests/tests/protoc_plugin/protos/responses/__init__.py
@@ -26,5 +26,3 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
diff --git a/src/python/grpcio_tests/tests/protoc_plugin/protos/service/__init__.py b/src/python/grpcio_tests/tests/protoc_plugin/protos/service/__init__.py
index 7086519..b893988 100644
--- a/src/python/grpcio_tests/tests/protoc_plugin/protos/service/__init__.py
+++ b/src/python/grpcio_tests/tests/protoc_plugin/protos/service/__init__.py
@@ -26,5 +26,3 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
diff --git a/src/python/grpcio_tests/tests/qps/benchmark_client.py b/src/python/grpcio_tests/tests/qps/benchmark_client.py
index 650e475..2e8afc8 100644
--- a/src/python/grpcio_tests/tests/qps/benchmark_client.py
+++ b/src/python/grpcio_tests/tests/qps/benchmark_client.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Defines test client behaviors (UNARY/STREAMING) (SYNC/ASYNC)."""
 
 import abc
@@ -47,165 +46,168 @@
 
 class GenericStub(object):
 
-  def __init__(self, channel):
-    self.UnaryCall = channel.unary_unary(
-        '/grpc.testing.BenchmarkService/UnaryCall')
-    self.StreamingCall = channel.stream_stream(
-        '/grpc.testing.BenchmarkService/StreamingCall')
+    def __init__(self, channel):
+        self.UnaryCall = channel.unary_unary(
+            '/grpc.testing.BenchmarkService/UnaryCall')
+        self.StreamingCall = channel.stream_stream(
+            '/grpc.testing.BenchmarkService/StreamingCall')
 
 
 class BenchmarkClient:
-  """Benchmark client interface that exposes a non-blocking send_request()."""
+    """Benchmark client interface that exposes a non-blocking send_request()."""
 
-  __metaclass__ = abc.ABCMeta
+    __metaclass__ = abc.ABCMeta
 
-  def __init__(self, server, config, hist):
-    # Create the stub
-    if config.HasField('security_params'):
-      creds = grpc.ssl_channel_credentials(resources.test_root_certificates())
-      channel = test_common.test_secure_channel(
-        server, creds, config.security_params.server_host_override)
-    else:
-      channel = grpc.insecure_channel(server)
+    def __init__(self, server, config, hist):
+        # Create the stub
+        if config.HasField('security_params'):
+            creds = grpc.ssl_channel_credentials(
+                resources.test_root_certificates())
+            channel = test_common.test_secure_channel(
+                server, creds, config.security_params.server_host_override)
+        else:
+            channel = grpc.insecure_channel(server)
 
-    # waits for the channel to be ready before we start sending messages
-    grpc.channel_ready_future(channel).result()
+        # waits for the channel to be ready before we start sending messages
+        grpc.channel_ready_future(channel).result()
 
-    if config.payload_config.WhichOneof('payload') == 'simple_params':
-      self._generic = False
-      self._stub = services_pb2.BenchmarkServiceStub(channel)
-      payload = messages_pb2.Payload(
-          body='\0' * config.payload_config.simple_params.req_size)
-      self._request = messages_pb2.SimpleRequest(
-          payload=payload,
-          response_size=config.payload_config.simple_params.resp_size)
-    else:
-      self._generic = True
-      self._stub = GenericStub(channel)
-      self._request = '\0' * config.payload_config.bytebuf_params.req_size
+        if config.payload_config.WhichOneof('payload') == 'simple_params':
+            self._generic = False
+            self._stub = services_pb2.BenchmarkServiceStub(channel)
+            payload = messages_pb2.Payload(
+                body='\0' * config.payload_config.simple_params.req_size)
+            self._request = messages_pb2.SimpleRequest(
+                payload=payload,
+                response_size=config.payload_config.simple_params.resp_size)
+        else:
+            self._generic = True
+            self._stub = GenericStub(channel)
+            self._request = '\0' * config.payload_config.bytebuf_params.req_size
 
-    self._hist = hist
-    self._response_callbacks = []
+        self._hist = hist
+        self._response_callbacks = []
 
-  def add_response_callback(self, callback):
-    """callback will be invoked as callback(client, query_time)"""
-    self._response_callbacks.append(callback)
+    def add_response_callback(self, callback):
+        """callback will be invoked as callback(client, query_time)"""
+        self._response_callbacks.append(callback)
 
-  @abc.abstractmethod
-  def send_request(self):
-    """Non-blocking wrapper for a client's request operation."""
-    raise NotImplementedError()
+    @abc.abstractmethod
+    def send_request(self):
+        """Non-blocking wrapper for a client's request operation."""
+        raise NotImplementedError()
 
-  def start(self):
-    pass
+    def start(self):
+        pass
 
-  def stop(self):
-    pass
+    def stop(self):
+        pass
 
-  def _handle_response(self, client, query_time):
-    self._hist.add(query_time * 1e9)  # Report times in nanoseconds
-    for callback in self._response_callbacks:
-      callback(client, query_time)
+    def _handle_response(self, client, query_time):
+        self._hist.add(query_time * 1e9)  # Report times in nanoseconds
+        for callback in self._response_callbacks:
+            callback(client, query_time)
 
 
 class UnarySyncBenchmarkClient(BenchmarkClient):
 
-  def __init__(self, server, config, hist):
-    super(UnarySyncBenchmarkClient, self).__init__(server, config, hist)
-    self._pool = futures.ThreadPoolExecutor(
-        max_workers=config.outstanding_rpcs_per_channel)
+    def __init__(self, server, config, hist):
+        super(UnarySyncBenchmarkClient, self).__init__(server, config, hist)
+        self._pool = futures.ThreadPoolExecutor(
+            max_workers=config.outstanding_rpcs_per_channel)
 
-  def send_request(self):
-    # Send requests in seperate threads to support multiple outstanding rpcs
-    # (See src/proto/grpc/testing/control.proto)
-    self._pool.submit(self._dispatch_request)
+    def send_request(self):
+        # Send requests in seperate threads to support multiple outstanding rpcs
+        # (See src/proto/grpc/testing/control.proto)
+        self._pool.submit(self._dispatch_request)
 
-  def stop(self):
-    self._pool.shutdown(wait=True)
-    self._stub = None
+    def stop(self):
+        self._pool.shutdown(wait=True)
+        self._stub = None
 
-  def _dispatch_request(self):
-    start_time = time.time()
-    self._stub.UnaryCall(self._request, _TIMEOUT)
-    end_time = time.time()
-    self._handle_response(self, end_time - start_time)
+    def _dispatch_request(self):
+        start_time = time.time()
+        self._stub.UnaryCall(self._request, _TIMEOUT)
+        end_time = time.time()
+        self._handle_response(self, end_time - start_time)
 
 
 class UnaryAsyncBenchmarkClient(BenchmarkClient):
 
-  def send_request(self):
-    # Use the Future callback api to support multiple outstanding rpcs
-    start_time = time.time()
-    response_future = self._stub.UnaryCall.future(self._request, _TIMEOUT)
-    response_future.add_done_callback(
-        lambda resp: self._response_received(start_time, resp))
+    def send_request(self):
+        # Use the Future callback api to support multiple outstanding rpcs
+        start_time = time.time()
+        response_future = self._stub.UnaryCall.future(self._request, _TIMEOUT)
+        response_future.add_done_callback(
+            lambda resp: self._response_received(start_time, resp))
 
-  def _response_received(self, start_time, resp):
-    resp.result()
-    end_time = time.time()
-    self._handle_response(self, end_time - start_time)
+    def _response_received(self, start_time, resp):
+        resp.result()
+        end_time = time.time()
+        self._handle_response(self, end_time - start_time)
 
-  def stop(self):
-    self._stub = None
+    def stop(self):
+        self._stub = None
 
 
 class _SyncStream(object):
 
-  def __init__(self, stub, generic, request, handle_response):
-    self._stub = stub
-    self._generic = generic
-    self._request = request
-    self._handle_response = handle_response
-    self._is_streaming = False
-    self._request_queue = queue.Queue()
-    self._send_time_queue = queue.Queue()
+    def __init__(self, stub, generic, request, handle_response):
+        self._stub = stub
+        self._generic = generic
+        self._request = request
+        self._handle_response = handle_response
+        self._is_streaming = False
+        self._request_queue = queue.Queue()
+        self._send_time_queue = queue.Queue()
 
-  def send_request(self):
-    self._send_time_queue.put(time.time())
-    self._request_queue.put(self._request)
+    def send_request(self):
+        self._send_time_queue.put(time.time())
+        self._request_queue.put(self._request)
 
-  def start(self):
-    self._is_streaming = True
-    response_stream = self._stub.StreamingCall(
-        self._request_generator(), _TIMEOUT)
-    for _ in response_stream:
-      self._handle_response(
-          self, time.time() - self._send_time_queue.get_nowait())
+    def start(self):
+        self._is_streaming = True
+        response_stream = self._stub.StreamingCall(self._request_generator(),
+                                                   _TIMEOUT)
+        for _ in response_stream:
+            self._handle_response(
+                self, time.time() - self._send_time_queue.get_nowait())
 
-  def stop(self):
-    self._is_streaming = False
+    def stop(self):
+        self._is_streaming = False
 
-  def _request_generator(self):
-    while self._is_streaming:
-      try:
-        request = self._request_queue.get(block=True, timeout=1.0)
-        yield request
-      except queue.Empty:
-        pass
+    def _request_generator(self):
+        while self._is_streaming:
+            try:
+                request = self._request_queue.get(block=True, timeout=1.0)
+                yield request
+            except queue.Empty:
+                pass
 
 
 class StreamingSyncBenchmarkClient(BenchmarkClient):
 
-  def __init__(self, server, config, hist):
-    super(StreamingSyncBenchmarkClient, self).__init__(server, config, hist)
-    self._pool = futures.ThreadPoolExecutor(
-        max_workers=config.outstanding_rpcs_per_channel)
-    self._streams = [_SyncStream(self._stub, self._generic, 
-                                 self._request, self._handle_response)
-                     for _ in xrange(config.outstanding_rpcs_per_channel)]
-    self._curr_stream = 0
+    def __init__(self, server, config, hist):
+        super(StreamingSyncBenchmarkClient, self).__init__(server, config, hist)
+        self._pool = futures.ThreadPoolExecutor(
+            max_workers=config.outstanding_rpcs_per_channel)
+        self._streams = [
+            _SyncStream(self._stub, self._generic, self._request,
+                        self._handle_response)
+            for _ in xrange(config.outstanding_rpcs_per_channel)
+        ]
+        self._curr_stream = 0
 
-  def send_request(self):
-    # Use a round_robin scheduler to determine what stream to send on
-    self._streams[self._curr_stream].send_request()
-    self._curr_stream = (self._curr_stream + 1) % len(self._streams)
+    def send_request(self):
+        # Use a round_robin scheduler to determine what stream to send on
+        self._streams[self._curr_stream].send_request()
+        self._curr_stream = (self._curr_stream + 1) % len(self._streams)
 
-  def start(self):
-    for stream in self._streams:
-      self._pool.submit(stream.start)
+    def start(self):
+        for stream in self._streams:
+            self._pool.submit(stream.start)
 
-  def stop(self):
-    for stream in self._streams:
-      stream.stop()
-    self._pool.shutdown(wait=True)
-    self._stub = None
+    def stop(self):
+        for stream in self._streams:
+            stream.stop()
+        self._pool.shutdown(wait=True)
+        self._stub = None
diff --git a/src/python/grpcio_tests/tests/qps/benchmark_server.py b/src/python/grpcio_tests/tests/qps/benchmark_server.py
index 2b76b81..423d03b 100644
--- a/src/python/grpcio_tests/tests/qps/benchmark_server.py
+++ b/src/python/grpcio_tests/tests/qps/benchmark_server.py
@@ -32,27 +32,27 @@
 
 
 class BenchmarkServer(services_pb2.BenchmarkServiceServicer):
-  """Synchronous Server implementation for the Benchmark service."""
+    """Synchronous Server implementation for the Benchmark service."""
 
-  def UnaryCall(self, request, context):
-    payload = messages_pb2.Payload(body='\0' * request.response_size)
-    return messages_pb2.SimpleResponse(payload=payload)
+    def UnaryCall(self, request, context):
+        payload = messages_pb2.Payload(body='\0' * request.response_size)
+        return messages_pb2.SimpleResponse(payload=payload)
 
-  def StreamingCall(self, request_iterator, context):
-    for request in request_iterator:
-      payload = messages_pb2.Payload(body='\0' * request.response_size)
-      yield messages_pb2.SimpleResponse(payload=payload)
+    def StreamingCall(self, request_iterator, context):
+        for request in request_iterator:
+            payload = messages_pb2.Payload(body='\0' * request.response_size)
+            yield messages_pb2.SimpleResponse(payload=payload)
 
 
 class GenericBenchmarkServer(services_pb2.BenchmarkServiceServicer):
-  """Generic Server implementation for the Benchmark service."""
+    """Generic Server implementation for the Benchmark service."""
 
-  def __init__(self, resp_size):
-    self._response = '\0' * resp_size
+    def __init__(self, resp_size):
+        self._response = '\0' * resp_size
 
-  def UnaryCall(self, request, context):
-    return self._response
+    def UnaryCall(self, request, context):
+        return self._response
 
-  def StreamingCall(self, request_iterator, context):
-    for request in request_iterator:
-      yield self._response
+    def StreamingCall(self, request_iterator, context):
+        for request in request_iterator:
+            yield self._response
diff --git a/src/python/grpcio_tests/tests/qps/client_runner.py b/src/python/grpcio_tests/tests/qps/client_runner.py
index 1fd5868..0370923 100644
--- a/src/python/grpcio_tests/tests/qps/client_runner.py
+++ b/src/python/grpcio_tests/tests/qps/client_runner.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Defines behavior for WHEN clients send requests.
 
 Each client exposes a non-blocking send_request() method that the
@@ -39,68 +38,68 @@
 
 
 class ClientRunner:
-  """Abstract interface for sending requests from clients."""
+    """Abstract interface for sending requests from clients."""
 
-  __metaclass__ = abc.ABCMeta
+    __metaclass__ = abc.ABCMeta
 
-  def __init__(self, client):
-    self._client = client
+    def __init__(self, client):
+        self._client = client
 
-  @abc.abstractmethod
-  def start(self):
-    raise NotImplementedError()
+    @abc.abstractmethod
+    def start(self):
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def stop(self):
-    raise NotImplementedError()
+    @abc.abstractmethod
+    def stop(self):
+        raise NotImplementedError()
 
 
 class OpenLoopClientRunner(ClientRunner):
 
-  def __init__(self, client, interval_generator):
-    super(OpenLoopClientRunner, self).__init__(client)
-    self._is_running = False
-    self._interval_generator = interval_generator
-    self._dispatch_thread = threading.Thread(
-        target=self._dispatch_requests, args=())
+    def __init__(self, client, interval_generator):
+        super(OpenLoopClientRunner, self).__init__(client)
+        self._is_running = False
+        self._interval_generator = interval_generator
+        self._dispatch_thread = threading.Thread(
+            target=self._dispatch_requests, args=())
 
-  def start(self):
-    self._is_running = True
-    self._client.start()
-    self._dispatch_thread.start()
-   
-  def stop(self):
-    self._is_running = False
-    self._client.stop()
-    self._dispatch_thread.join()
-    self._client = None
+    def start(self):
+        self._is_running = True
+        self._client.start()
+        self._dispatch_thread.start()
 
-  def _dispatch_requests(self):
-    while self._is_running:
-      self._client.send_request()
-      time.sleep(next(self._interval_generator))
+    def stop(self):
+        self._is_running = False
+        self._client.stop()
+        self._dispatch_thread.join()
+        self._client = None
+
+    def _dispatch_requests(self):
+        while self._is_running:
+            self._client.send_request()
+            time.sleep(next(self._interval_generator))
 
 
 class ClosedLoopClientRunner(ClientRunner):
 
-  def __init__(self, client, request_count):
-    super(ClosedLoopClientRunner, self).__init__(client)
-    self._is_running = False
-    self._request_count = request_count
-    # Send a new request on each response for closed loop
-    self._client.add_response_callback(self._send_request)
+    def __init__(self, client, request_count):
+        super(ClosedLoopClientRunner, self).__init__(client)
+        self._is_running = False
+        self._request_count = request_count
+        # Send a new request on each response for closed loop
+        self._client.add_response_callback(self._send_request)
 
-  def start(self):
-    self._is_running = True
-    self._client.start()
-    for _ in xrange(self._request_count):
-      self._client.send_request()
+    def start(self):
+        self._is_running = True
+        self._client.start()
+        for _ in xrange(self._request_count):
+            self._client.send_request()
 
-  def stop(self):
-    self._is_running = False
-    self._client.stop()
-    self._client = None
+    def stop(self):
+        self._is_running = False
+        self._client.stop()
+        self._client = None
 
-  def _send_request(self, client, response_time):
-    if self._is_running:
-      client.send_request()
+    def _send_request(self, client, response_time):
+        if self._is_running:
+            client.send_request()
diff --git a/src/python/grpcio_tests/tests/qps/histogram.py b/src/python/grpcio_tests/tests/qps/histogram.py
index 9a7b5eb..61040b6 100644
--- a/src/python/grpcio_tests/tests/qps/histogram.py
+++ b/src/python/grpcio_tests/tests/qps/histogram.py
@@ -34,52 +34,52 @@
 
 
 class Histogram(object):
-  """Histogram class used for recording performance testing data.
+    """Histogram class used for recording performance testing data.
 
   This class is thread safe.
   """
 
-  def __init__(self, resolution, max_possible):
-    self._lock = threading.Lock()
-    self._resolution = resolution
-    self._max_possible = max_possible
-    self._sum = 0
-    self._sum_of_squares = 0
-    self.multiplier = 1.0 + self._resolution
-    self._count = 0
-    self._min = self._max_possible
-    self._max = 0
-    self._buckets = [0] * (self._bucket_for(self._max_possible) + 1)
+    def __init__(self, resolution, max_possible):
+        self._lock = threading.Lock()
+        self._resolution = resolution
+        self._max_possible = max_possible
+        self._sum = 0
+        self._sum_of_squares = 0
+        self.multiplier = 1.0 + self._resolution
+        self._count = 0
+        self._min = self._max_possible
+        self._max = 0
+        self._buckets = [0] * (self._bucket_for(self._max_possible) + 1)
 
-  def reset(self):
-    with self._lock:
-      self._sum = 0
-      self._sum_of_squares = 0
-      self._count = 0
-      self._min = self._max_possible
-      self._max = 0
-      self._buckets = [0] * (self._bucket_for(self._max_possible) + 1)
+    def reset(self):
+        with self._lock:
+            self._sum = 0
+            self._sum_of_squares = 0
+            self._count = 0
+            self._min = self._max_possible
+            self._max = 0
+            self._buckets = [0] * (self._bucket_for(self._max_possible) + 1)
 
-  def add(self, val):
-    with self._lock:
-      self._sum += val
-      self._sum_of_squares += val * val
-      self._count += 1
-      self._min = min(self._min, val)
-      self._max = max(self._max, val)
-      self._buckets[self._bucket_for(val)] += 1
+    def add(self, val):
+        with self._lock:
+            self._sum += val
+            self._sum_of_squares += val * val
+            self._count += 1
+            self._min = min(self._min, val)
+            self._max = max(self._max, val)
+            self._buckets[self._bucket_for(val)] += 1
 
-  def get_data(self):
-    with self._lock:
-      data = stats_pb2.HistogramData()
-      data.bucket.extend(self._buckets)
-      data.min_seen = self._min
-      data.max_seen = self._max
-      data.sum = self._sum
-      data.sum_of_squares = self._sum_of_squares
-      data.count = self._count
-      return data
+    def get_data(self):
+        with self._lock:
+            data = stats_pb2.HistogramData()
+            data.bucket.extend(self._buckets)
+            data.min_seen = self._min
+            data.max_seen = self._max
+            data.sum = self._sum
+            data.sum_of_squares = self._sum_of_squares
+            data.count = self._count
+            return data
 
-  def _bucket_for(self, val):
-    val = min(val, self._max_possible)
-    return int(math.log(val, self.multiplier))
+    def _bucket_for(self, val):
+        val = min(val, self._max_possible)
+        return int(math.log(val, self.multiplier))
diff --git a/src/python/grpcio_tests/tests/qps/qps_worker.py b/src/python/grpcio_tests/tests/qps/qps_worker.py
index 2371ff0..025dfb9 100644
--- a/src/python/grpcio_tests/tests/qps/qps_worker.py
+++ b/src/python/grpcio_tests/tests/qps/qps_worker.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """The entry point for the qps worker."""
 
 import argparse
@@ -40,22 +39,23 @@
 
 
 def run_worker_server(port):
-  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))
-  servicer = worker_server.WorkerServer()
-  services_pb2.add_WorkerServiceServicer_to_server(servicer, server)
-  server.add_insecure_port('[::]:{}'.format(port))
-  server.start()
-  servicer.wait_for_quit()
-  server.stop(0)
+    server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))
+    servicer = worker_server.WorkerServer()
+    services_pb2.add_WorkerServiceServicer_to_server(servicer, server)
+    server.add_insecure_port('[::]:{}'.format(port))
+    server.start()
+    servicer.wait_for_quit()
+    server.stop(0)
 
 
 if __name__ == '__main__':
-  parser = argparse.ArgumentParser(
-      description='gRPC Python performance testing worker')
-  parser.add_argument('--driver_port',
-                      type=int,
-                      dest='port',
-                      help='The port the worker should listen on')
-  args = parser.parse_args()
+    parser = argparse.ArgumentParser(
+        description='gRPC Python performance testing worker')
+    parser.add_argument(
+        '--driver_port',
+        type=int,
+        dest='port',
+        help='The port the worker should listen on')
+    args = parser.parse_args()
 
-  run_worker_server(args.port)
+    run_worker_server(args.port)
diff --git a/src/python/grpcio_tests/tests/qps/worker_server.py b/src/python/grpcio_tests/tests/qps/worker_server.py
index 46d5429..ca1a777 100644
--- a/src/python/grpcio_tests/tests/qps/worker_server.py
+++ b/src/python/grpcio_tests/tests/qps/worker_server.py
@@ -46,149 +46,156 @@
 
 
 class WorkerServer(services_pb2.WorkerServiceServicer):
-  """Python Worker Server implementation."""
+    """Python Worker Server implementation."""
 
-  def __init__(self):
-    self._quit_event = threading.Event()
+    def __init__(self):
+        self._quit_event = threading.Event()
 
-  def RunServer(self, request_iterator, context):
-    config = next(request_iterator).setup
-    server, port = self._create_server(config)
-    cores = multiprocessing.cpu_count()
-    server.start()
-    start_time = time.time()
-    yield self._get_server_status(start_time, start_time, port, cores)
-
-    for request in request_iterator:
-      end_time = time.time()
-      status = self._get_server_status(start_time, end_time, port, cores)
-      if request.mark.reset:
-        start_time = end_time
-      yield status
-    server.stop(None)
-
-  def _get_server_status(self, start_time, end_time, port, cores):
-    end_time = time.time()
-    elapsed_time = end_time - start_time
-    stats = stats_pb2.ServerStats(time_elapsed=elapsed_time,
-                                  time_user=elapsed_time,
-                                  time_system=elapsed_time)
-    return control_pb2.ServerStatus(stats=stats, port=port, cores=cores)
-
-  def _create_server(self, config):
-    if config.async_server_threads == 0:
-      # This is the default concurrent.futures thread pool size, but
-      # None doesn't seem to work
-      server_threads = multiprocessing.cpu_count() * 5
-    else:
-      server_threads = config.async_server_threads
-    server = grpc.server(futures.ThreadPoolExecutor(
-        max_workers=server_threads))
-    if config.server_type == control_pb2.ASYNC_SERVER:
-      servicer = benchmark_server.BenchmarkServer()
-      services_pb2.add_BenchmarkServiceServicer_to_server(servicer, server)
-    elif config.server_type == control_pb2.ASYNC_GENERIC_SERVER:
-      resp_size = config.payload_config.bytebuf_params.resp_size
-      servicer = benchmark_server.GenericBenchmarkServer(resp_size)
-      method_implementations = {
-          'StreamingCall':
-          grpc.stream_stream_rpc_method_handler(servicer.StreamingCall),
-          'UnaryCall':
-          grpc.unary_unary_rpc_method_handler(servicer.UnaryCall),
-      }
-      handler = grpc.method_handlers_generic_handler(
-          'grpc.testing.BenchmarkService', method_implementations)
-      server.add_generic_rpc_handlers((handler,))
-    else:
-      raise Exception('Unsupported server type {}'.format(config.server_type))
-
-    if config.HasField('security_params'):  # Use SSL
-      server_creds = grpc.ssl_server_credentials(
-          ((resources.private_key(), resources.certificate_chain()),))
-      port = server.add_secure_port('[::]:{}'.format(config.port), server_creds)
-    else:
-      port = server.add_insecure_port('[::]:{}'.format(config.port))
-
-    return (server, port)
-
-  def RunClient(self, request_iterator, context):
-    config = next(request_iterator).setup
-    client_runners = []
-    qps_data = histogram.Histogram(config.histogram_params.resolution,
-                                   config.histogram_params.max_possible)
-    start_time = time.time()
-
-    # Create a client for each channel
-    for i in xrange(config.client_channels):
-      server = config.server_targets[i % len(config.server_targets)]
-      runner = self._create_client_runner(server, config, qps_data)
-      client_runners.append(runner)
-      runner.start()
-
-    end_time = time.time()
-    yield self._get_client_status(start_time, end_time, qps_data)
-
-    # Respond to stat requests
-    for request in request_iterator:
-      end_time = time.time()
-      status = self._get_client_status(start_time, end_time, qps_data)
-      if request.mark.reset:
-        qps_data.reset()
+    def RunServer(self, request_iterator, context):
+        config = next(request_iterator).setup
+        server, port = self._create_server(config)
+        cores = multiprocessing.cpu_count()
+        server.start()
         start_time = time.time()
-      yield status
+        yield self._get_server_status(start_time, start_time, port, cores)
 
-    # Cleanup the clients
-    for runner in client_runners:
-      runner.stop()
+        for request in request_iterator:
+            end_time = time.time()
+            status = self._get_server_status(start_time, end_time, port, cores)
+            if request.mark.reset:
+                start_time = end_time
+            yield status
+        server.stop(None)
 
-  def _get_client_status(self, start_time, end_time, qps_data):
-    latencies = qps_data.get_data()
-    end_time = time.time()
-    elapsed_time = end_time - start_time
-    stats = stats_pb2.ClientStats(latencies=latencies,
-                                  time_elapsed=elapsed_time,
-                                  time_user=elapsed_time,
-                                  time_system=elapsed_time)
-    return control_pb2.ClientStatus(stats=stats)
+    def _get_server_status(self, start_time, end_time, port, cores):
+        end_time = time.time()
+        elapsed_time = end_time - start_time
+        stats = stats_pb2.ServerStats(
+            time_elapsed=elapsed_time,
+            time_user=elapsed_time,
+            time_system=elapsed_time)
+        return control_pb2.ServerStatus(stats=stats, port=port, cores=cores)
 
-  def _create_client_runner(self, server, config, qps_data):
-    if config.client_type == control_pb2.SYNC_CLIENT:
-      if config.rpc_type == control_pb2.UNARY:
-        client = benchmark_client.UnarySyncBenchmarkClient(
-            server, config, qps_data)
-      elif config.rpc_type == control_pb2.STREAMING:
-        client = benchmark_client.StreamingSyncBenchmarkClient(
-            server, config, qps_data)
-    elif config.client_type == control_pb2.ASYNC_CLIENT:
-      if config.rpc_type == control_pb2.UNARY:
-        client = benchmark_client.UnaryAsyncBenchmarkClient(
-            server, config, qps_data)
-      else:
-        raise Exception('Async streaming client not supported')
-    else:
-      raise Exception('Unsupported client type {}'.format(config.client_type))
+    def _create_server(self, config):
+        if config.async_server_threads == 0:
+            # This is the default concurrent.futures thread pool size, but
+            # None doesn't seem to work
+            server_threads = multiprocessing.cpu_count() * 5
+        else:
+            server_threads = config.async_server_threads
+        server = grpc.server(
+            futures.ThreadPoolExecutor(max_workers=server_threads))
+        if config.server_type == control_pb2.ASYNC_SERVER:
+            servicer = benchmark_server.BenchmarkServer()
+            services_pb2.add_BenchmarkServiceServicer_to_server(servicer,
+                                                                server)
+        elif config.server_type == control_pb2.ASYNC_GENERIC_SERVER:
+            resp_size = config.payload_config.bytebuf_params.resp_size
+            servicer = benchmark_server.GenericBenchmarkServer(resp_size)
+            method_implementations = {
+                'StreamingCall':
+                grpc.stream_stream_rpc_method_handler(servicer.StreamingCall),
+                'UnaryCall':
+                grpc.unary_unary_rpc_method_handler(servicer.UnaryCall),
+            }
+            handler = grpc.method_handlers_generic_handler(
+                'grpc.testing.BenchmarkService', method_implementations)
+            server.add_generic_rpc_handlers((handler,))
+        else:
+            raise Exception(
+                'Unsupported server type {}'.format(config.server_type))
 
-    # In multi-channel tests, we split the load across all channels
-    load_factor = float(config.client_channels)
-    if config.load_params.WhichOneof('load') == 'closed_loop':
-      runner = client_runner.ClosedLoopClientRunner(
-          client, config.outstanding_rpcs_per_channel)
-    else:  # Open loop Poisson
-      alpha = config.load_params.poisson.offered_load / load_factor
-      def poisson():
-        while True:
-          yield random.expovariate(alpha)
+        if config.HasField('security_params'):  # Use SSL
+            server_creds = grpc.ssl_server_credentials((
+                (resources.private_key(), resources.certificate_chain()),))
+            port = server.add_secure_port('[::]:{}'.format(config.port),
+                                          server_creds)
+        else:
+            port = server.add_insecure_port('[::]:{}'.format(config.port))
 
-      runner = client_runner.OpenLoopClientRunner(client, poisson())
+        return (server, port)
 
-    return runner
+    def RunClient(self, request_iterator, context):
+        config = next(request_iterator).setup
+        client_runners = []
+        qps_data = histogram.Histogram(config.histogram_params.resolution,
+                                       config.histogram_params.max_possible)
+        start_time = time.time()
 
-  def CoreCount(self, request, context):
-    return control_pb2.CoreResponse(cores=multiprocessing.cpu_count())
+        # Create a client for each channel
+        for i in xrange(config.client_channels):
+            server = config.server_targets[i % len(config.server_targets)]
+            runner = self._create_client_runner(server, config, qps_data)
+            client_runners.append(runner)
+            runner.start()
 
-  def QuitWorker(self, request, context):
-    self._quit_event.set()
-    return control_pb2.Void()
+        end_time = time.time()
+        yield self._get_client_status(start_time, end_time, qps_data)
 
-  def wait_for_quit(self):
-    self._quit_event.wait()
+        # Respond to stat requests
+        for request in request_iterator:
+            end_time = time.time()
+            status = self._get_client_status(start_time, end_time, qps_data)
+            if request.mark.reset:
+                qps_data.reset()
+                start_time = time.time()
+            yield status
+
+        # Cleanup the clients
+        for runner in client_runners:
+            runner.stop()
+
+    def _get_client_status(self, start_time, end_time, qps_data):
+        latencies = qps_data.get_data()
+        end_time = time.time()
+        elapsed_time = end_time - start_time
+        stats = stats_pb2.ClientStats(
+            latencies=latencies,
+            time_elapsed=elapsed_time,
+            time_user=elapsed_time,
+            time_system=elapsed_time)
+        return control_pb2.ClientStatus(stats=stats)
+
+    def _create_client_runner(self, server, config, qps_data):
+        if config.client_type == control_pb2.SYNC_CLIENT:
+            if config.rpc_type == control_pb2.UNARY:
+                client = benchmark_client.UnarySyncBenchmarkClient(
+                    server, config, qps_data)
+            elif config.rpc_type == control_pb2.STREAMING:
+                client = benchmark_client.StreamingSyncBenchmarkClient(
+                    server, config, qps_data)
+        elif config.client_type == control_pb2.ASYNC_CLIENT:
+            if config.rpc_type == control_pb2.UNARY:
+                client = benchmark_client.UnaryAsyncBenchmarkClient(
+                    server, config, qps_data)
+            else:
+                raise Exception('Async streaming client not supported')
+        else:
+            raise Exception(
+                'Unsupported client type {}'.format(config.client_type))
+
+        # In multi-channel tests, we split the load across all channels
+        load_factor = float(config.client_channels)
+        if config.load_params.WhichOneof('load') == 'closed_loop':
+            runner = client_runner.ClosedLoopClientRunner(
+                client, config.outstanding_rpcs_per_channel)
+        else:  # Open loop Poisson
+            alpha = config.load_params.poisson.offered_load / load_factor
+
+            def poisson():
+                while True:
+                    yield random.expovariate(alpha)
+
+            runner = client_runner.OpenLoopClientRunner(client, poisson())
+
+        return runner
+
+    def CoreCount(self, request, context):
+        return control_pb2.CoreResponse(cores=multiprocessing.cpu_count())
+
+    def QuitWorker(self, request, context):
+        self._quit_event.set()
+        return control_pb2.Void()
+
+    def wait_for_quit(self):
+        self._quit_event.wait()
diff --git a/src/python/grpcio_tests/tests/reflection/_reflection_servicer_test.py b/src/python/grpcio_tests/tests/reflection/_reflection_servicer_test.py
index 43d6c97..76e89ca 100644
--- a/src/python/grpcio_tests/tests/reflection/_reflection_servicer_test.py
+++ b/src/python/grpcio_tests/tests/reflection/_reflection_servicer_test.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Tests of grpc_reflection.v1alpha.reflection."""
 
 import unittest
@@ -45,141 +44,112 @@
 
 _EMPTY_PROTO_FILE_NAME = 'src/proto/grpc/testing/empty.proto'
 _EMPTY_PROTO_SYMBOL_NAME = 'grpc.testing.Empty'
-_SERVICE_NAMES = (
-    'Angstrom', 'Bohr', 'Curie', 'Dyson', 'Einstein', 'Feynman', 'Galilei')
+_SERVICE_NAMES = ('Angstrom', 'Bohr', 'Curie', 'Dyson', 'Einstein', 'Feynman',
+                  'Galilei')
+
 
 def _file_descriptor_to_proto(descriptor):
-  proto = descriptor_pb2.FileDescriptorProto()
-  descriptor.CopyToProto(proto)
-  return proto.SerializeToString()
+    proto = descriptor_pb2.FileDescriptorProto()
+    descriptor.CopyToProto(proto)
+    return proto.SerializeToString()
+
 
 class ReflectionServicerTest(unittest.TestCase):
 
-  def setUp(self):
-    servicer = reflection.ReflectionServicer(service_names=_SERVICE_NAMES)
-    server_pool = logging_pool.pool(test_constants.THREAD_CONCURRENCY)
-    self._server = grpc.server(server_pool)
-    port = self._server.add_insecure_port('[::]:0')
-    reflection_pb2.add_ServerReflectionServicer_to_server(servicer, self._server)
-    self._server.start()
+    def setUp(self):
+        servicer = reflection.ReflectionServicer(service_names=_SERVICE_NAMES)
+        server_pool = logging_pool.pool(test_constants.THREAD_CONCURRENCY)
+        self._server = grpc.server(server_pool)
+        port = self._server.add_insecure_port('[::]:0')
+        reflection_pb2.add_ServerReflectionServicer_to_server(servicer,
+                                                              self._server)
+        self._server.start()
 
-    channel = grpc.insecure_channel('localhost:%d' % port)
-    self._stub = reflection_pb2.ServerReflectionStub(channel)
+        channel = grpc.insecure_channel('localhost:%d' % port)
+        self._stub = reflection_pb2.ServerReflectionStub(channel)
 
-  def testFileByName(self):
-    requests = (
-      reflection_pb2.ServerReflectionRequest(
-        file_by_filename=_EMPTY_PROTO_FILE_NAME
-      ),
-      reflection_pb2.ServerReflectionRequest(
-        file_by_filename='i-donut-exist'
-      ),
-    )
-    responses = tuple(self._stub.ServerReflectionInfo(iter(requests)))
-    expected_responses = (
-      reflection_pb2.ServerReflectionResponse(
-        valid_host='',
-        file_descriptor_response=reflection_pb2.FileDescriptorResponse(
-          file_descriptor_proto=(
-            _file_descriptor_to_proto(empty_pb2.DESCRIPTOR),
-          )
-        )
-      ),
-      reflection_pb2.ServerReflectionResponse(
-        valid_host='',
-        error_response=reflection_pb2.ErrorResponse(
-          error_code=grpc.StatusCode.NOT_FOUND.value[0],
-          error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(),
-        )
-      ),
-    )
-    self.assertSequenceEqual(expected_responses, responses)
+    def testFileByName(self):
+        requests = (
+            reflection_pb2.ServerReflectionRequest(
+                file_by_filename=_EMPTY_PROTO_FILE_NAME),
+            reflection_pb2.ServerReflectionRequest(
+                file_by_filename='i-donut-exist'),)
+        responses = tuple(self._stub.ServerReflectionInfo(iter(requests)))
+        expected_responses = (
+            reflection_pb2.ServerReflectionResponse(
+                valid_host='',
+                file_descriptor_response=reflection_pb2.FileDescriptorResponse(
+                    file_descriptor_proto=(
+                        _file_descriptor_to_proto(empty_pb2.DESCRIPTOR),))),
+            reflection_pb2.ServerReflectionResponse(
+                valid_host='',
+                error_response=reflection_pb2.ErrorResponse(
+                    error_code=grpc.StatusCode.NOT_FOUND.value[0],
+                    error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(),
+                )),)
+        self.assertSequenceEqual(expected_responses, responses)
 
-  def testFileBySymbol(self):
-    requests = (
-      reflection_pb2.ServerReflectionRequest(
-        file_containing_symbol=_EMPTY_PROTO_SYMBOL_NAME
-      ),
-      reflection_pb2.ServerReflectionRequest(
-        file_containing_symbol='i.donut.exist.co.uk.org.net.me.name.foo'
-      ),
-    )
-    responses = tuple(self._stub.ServerReflectionInfo(iter(requests)))
-    expected_responses = (
-      reflection_pb2.ServerReflectionResponse(
-        valid_host='',
-        file_descriptor_response=reflection_pb2.FileDescriptorResponse(
-          file_descriptor_proto=(
-            _file_descriptor_to_proto(empty_pb2.DESCRIPTOR),
-          )
-        )
-      ),
-      reflection_pb2.ServerReflectionResponse(
-        valid_host='',
-        error_response=reflection_pb2.ErrorResponse(
-          error_code=grpc.StatusCode.NOT_FOUND.value[0],
-          error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(),
-        )
-      ),
-    )
-    self.assertSequenceEqual(expected_responses, responses)
+    def testFileBySymbol(self):
+        requests = (
+            reflection_pb2.ServerReflectionRequest(
+                file_containing_symbol=_EMPTY_PROTO_SYMBOL_NAME),
+            reflection_pb2.ServerReflectionRequest(
+                file_containing_symbol='i.donut.exist.co.uk.org.net.me.name.foo'
+            ),)
+        responses = tuple(self._stub.ServerReflectionInfo(iter(requests)))
+        expected_responses = (
+            reflection_pb2.ServerReflectionResponse(
+                valid_host='',
+                file_descriptor_response=reflection_pb2.FileDescriptorResponse(
+                    file_descriptor_proto=(
+                        _file_descriptor_to_proto(empty_pb2.DESCRIPTOR),))),
+            reflection_pb2.ServerReflectionResponse(
+                valid_host='',
+                error_response=reflection_pb2.ErrorResponse(
+                    error_code=grpc.StatusCode.NOT_FOUND.value[0],
+                    error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(),
+                )),)
+        self.assertSequenceEqual(expected_responses, responses)
 
-  @unittest.skip('TODO(atash): implement file-containing-extension reflection '
-                 '(see https://github.com/google/protobuf/issues/2248)')
-  def testFileContainingExtension(self):
-    requests = (
-      reflection_pb2.ServerReflectionRequest(
-        file_containing_extension=reflection_pb2.ExtensionRequest(
-          containing_type='grpc.testing.proto2.Empty',
-          extension_number=125,
-        ),
-      ),
-      reflection_pb2.ServerReflectionRequest(
-        file_containing_extension=reflection_pb2.ExtensionRequest(
-          containing_type='i.donut.exist.co.uk.org.net.me.name.foo',
-          extension_number=55,
-        ),
-      ),
-    )
-    responses = tuple(self._stub.ServerReflectionInfo(iter(requests)))
-    expected_responses = (
-      reflection_pb2.ServerReflectionResponse(
-        valid_host='',
-        file_descriptor_response=reflection_pb2.FileDescriptorResponse(
-          file_descriptor_proto=(
-            _file_descriptor_to_proto(empty_extensions_pb2.DESCRIPTOR),
-          )
-        )
-      ),
-      reflection_pb2.ServerReflectionResponse(
-        valid_host='',
-        error_response=reflection_pb2.ErrorResponse(
-          error_code=grpc.StatusCode.NOT_FOUND.value[0],
-          error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(),
-        )
-      ),
-    )
-    self.assertSequenceEqual(expected_responses, responses)
+    @unittest.skip(
+        'TODO(atash): implement file-containing-extension reflection '
+        '(see https://github.com/google/protobuf/issues/2248)')
+    def testFileContainingExtension(self):
+        requests = (
+            reflection_pb2.ServerReflectionRequest(
+                file_containing_extension=reflection_pb2.ExtensionRequest(
+                    containing_type='grpc.testing.proto2.Empty',
+                    extension_number=125,),),
+            reflection_pb2.ServerReflectionRequest(
+                file_containing_extension=reflection_pb2.ExtensionRequest(
+                    containing_type='i.donut.exist.co.uk.org.net.me.name.foo',
+                    extension_number=55,),),)
+        responses = tuple(self._stub.ServerReflectionInfo(iter(requests)))
+        expected_responses = (
+            reflection_pb2.ServerReflectionResponse(
+                valid_host='',
+                file_descriptor_response=reflection_pb2.FileDescriptorResponse(
+                    file_descriptor_proto=(_file_descriptor_to_proto(
+                        empty_extensions_pb2.DESCRIPTOR),))),
+            reflection_pb2.ServerReflectionResponse(
+                valid_host='',
+                error_response=reflection_pb2.ErrorResponse(
+                    error_code=grpc.StatusCode.NOT_FOUND.value[0],
+                    error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(),
+                )),)
+        self.assertSequenceEqual(expected_responses, responses)
 
-  def testListServices(self):
-    requests = (
-      reflection_pb2.ServerReflectionRequest(
-        list_services='',
-      ),
-    )
-    responses = tuple(self._stub.ServerReflectionInfo(iter(requests)))
-    expected_responses = (
-      reflection_pb2.ServerReflectionResponse(
-        valid_host='',
-        list_services_response=reflection_pb2.ListServiceResponse(
-          service=tuple(
-            reflection_pb2.ServiceResponse(name=name)
-            for name in _SERVICE_NAMES
-          )
-        )
-      ),
-    )
-    self.assertSequenceEqual(expected_responses, responses)
+    def testListServices(self):
+        requests = (reflection_pb2.ServerReflectionRequest(list_services='',),)
+        responses = tuple(self._stub.ServerReflectionInfo(iter(requests)))
+        expected_responses = (reflection_pb2.ServerReflectionResponse(
+            valid_host='',
+            list_services_response=reflection_pb2.ListServiceResponse(
+                service=tuple(
+                    reflection_pb2.ServiceResponse(name=name)
+                    for name in _SERVICE_NAMES))),)
+        self.assertSequenceEqual(expected_responses, responses)
+
 
 if __name__ == '__main__':
-  unittest.main(verbosity=2)
+    unittest.main(verbosity=2)
diff --git a/src/python/grpcio_tests/tests/stress/client.py b/src/python/grpcio_tests/tests/stress/client.py
index b811672..61f9e1c 100644
--- a/src/python/grpcio_tests/tests/stress/client.py
+++ b/src/python/grpcio_tests/tests/stress/client.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Entry point for running stress tests."""
 
 import argparse
@@ -46,118 +45,132 @@
 
 
 def _args():
-  parser = argparse.ArgumentParser(description='gRPC Python stress test client')
-  parser.add_argument(
-      '--server_addresses',
-      help='comma seperated list of hostname:port to run servers on',
-      default='localhost:8080', type=str)
-  parser.add_argument(
-      '--test_cases',
-      help='comma seperated list of testcase:weighting of tests to run',
-      default='large_unary:100',
-      type=str)
-  parser.add_argument(
-      '--test_duration_secs',
-      help='number of seconds to run the stress test',
-      default=-1, type=int)
-  parser.add_argument(
-      '--num_channels_per_server',
-      help='number of channels per server',
-      default=1, type=int)
-  parser.add_argument(
-      '--num_stubs_per_channel',
-      help='number of stubs to create per channel',
-      default=1, type=int)
-  parser.add_argument(
-      '--metrics_port',
-      help='the port to listen for metrics requests on',
-      default=8081, type=int)
-  parser.add_argument(
-      '--use_test_ca',
-      help='Whether to use our fake CA. Requires --use_tls=true',
-      default=False, type=bool)
-  parser.add_argument(
-      '--use_tls',
-      help='Whether to use TLS', default=False, type=bool)
-  parser.add_argument(
-      '--server_host_override', default="foo.test.google.fr",
-      help='the server host to which to claim to connect', type=str)
-  return parser.parse_args()
+    parser = argparse.ArgumentParser(
+        description='gRPC Python stress test client')
+    parser.add_argument(
+        '--server_addresses',
+        help='comma seperated list of hostname:port to run servers on',
+        default='localhost:8080',
+        type=str)
+    parser.add_argument(
+        '--test_cases',
+        help='comma seperated list of testcase:weighting of tests to run',
+        default='large_unary:100',
+        type=str)
+    parser.add_argument(
+        '--test_duration_secs',
+        help='number of seconds to run the stress test',
+        default=-1,
+        type=int)
+    parser.add_argument(
+        '--num_channels_per_server',
+        help='number of channels per server',
+        default=1,
+        type=int)
+    parser.add_argument(
+        '--num_stubs_per_channel',
+        help='number of stubs to create per channel',
+        default=1,
+        type=int)
+    parser.add_argument(
+        '--metrics_port',
+        help='the port to listen for metrics requests on',
+        default=8081,
+        type=int)
+    parser.add_argument(
+        '--use_test_ca',
+        help='Whether to use our fake CA. Requires --use_tls=true',
+        default=False,
+        type=bool)
+    parser.add_argument(
+        '--use_tls', help='Whether to use TLS', default=False, type=bool)
+    parser.add_argument(
+        '--server_host_override',
+        default="foo.test.google.fr",
+        help='the server host to which to claim to connect',
+        type=str)
+    return parser.parse_args()
 
 
 def _test_case_from_arg(test_case_arg):
-  for test_case in methods.TestCase:
-    if test_case_arg == test_case.value:
-      return test_case
-  else:
-    raise ValueError('No test case {}!'.format(test_case_arg))
+    for test_case in methods.TestCase:
+        if test_case_arg == test_case.value:
+            return test_case
+    else:
+        raise ValueError('No test case {}!'.format(test_case_arg))
 
 
 def _parse_weighted_test_cases(test_case_args):
-  weighted_test_cases = {}
-  for test_case_arg in test_case_args.split(','):
-    name, weight = test_case_arg.split(':', 1)
-    test_case = _test_case_from_arg(name)
-    weighted_test_cases[test_case] = int(weight)
-  return weighted_test_cases
+    weighted_test_cases = {}
+    for test_case_arg in test_case_args.split(','):
+        name, weight = test_case_arg.split(':', 1)
+        test_case = _test_case_from_arg(name)
+        weighted_test_cases[test_case] = int(weight)
+    return weighted_test_cases
+
 
 def _get_channel(target, args):
-  if args.use_tls:
-    if args.use_test_ca:
-      root_certificates = resources.test_root_certificates()
+    if args.use_tls:
+        if args.use_test_ca:
+            root_certificates = resources.test_root_certificates()
+        else:
+            root_certificates = None  # will load default roots.
+        channel_credentials = grpc.ssl_channel_credentials(
+            root_certificates=root_certificates)
+        options = ((
+            'grpc.ssl_target_name_override',
+            args.server_host_override,),)
+        channel = grpc.secure_channel(
+            target, channel_credentials, options=options)
     else:
-      root_certificates = None  # will load default roots.
-    channel_credentials = grpc.ssl_channel_credentials(
-        root_certificates=root_certificates)
-    options = (('grpc.ssl_target_name_override', args.server_host_override,),)
-    channel = grpc.secure_channel(target, channel_credentials, options=options)
-  else:
-    channel = grpc.insecure_channel(target)
+        channel = grpc.insecure_channel(target)
 
-  # waits for the channel to be ready before we start sending messages
-  grpc.channel_ready_future(channel).result()
-  return channel
+    # waits for the channel to be ready before we start sending messages
+    grpc.channel_ready_future(channel).result()
+    return channel
+
 
 def run_test(args):
-  test_cases = _parse_weighted_test_cases(args.test_cases)
-  test_server_targets = args.server_addresses.split(',')
-  # Propagate any client exceptions with a queue
-  exception_queue = queue.Queue()
-  stop_event = threading.Event()
-  hist = histogram.Histogram(1, 1)
-  runners = []
+    test_cases = _parse_weighted_test_cases(args.test_cases)
+    test_server_targets = args.server_addresses.split(',')
+    # Propagate any client exceptions with a queue
+    exception_queue = queue.Queue()
+    stop_event = threading.Event()
+    hist = histogram.Histogram(1, 1)
+    runners = []
 
-  server = grpc.server(futures.ThreadPoolExecutor(max_workers=25))
-  metrics_pb2.add_MetricsServiceServicer_to_server(
-      metrics_server.MetricsServer(hist), server)
-  server.add_insecure_port('[::]:{}'.format(args.metrics_port))
-  server.start()
+    server = grpc.server(futures.ThreadPoolExecutor(max_workers=25))
+    metrics_pb2.add_MetricsServiceServicer_to_server(
+        metrics_server.MetricsServer(hist), server)
+    server.add_insecure_port('[::]:{}'.format(args.metrics_port))
+    server.start()
 
-  for test_server_target in test_server_targets:
-    for _ in xrange(args.num_channels_per_server):
-      channel = _get_channel(test_server_target, args)
-      for _ in xrange(args.num_stubs_per_channel):
-        stub = test_pb2.TestServiceStub(channel)
-        runner = test_runner.TestRunner(stub, test_cases, hist,
-                                        exception_queue, stop_event)
-        runners.append(runner)
+    for test_server_target in test_server_targets:
+        for _ in xrange(args.num_channels_per_server):
+            channel = _get_channel(test_server_target, args)
+            for _ in xrange(args.num_stubs_per_channel):
+                stub = test_pb2.TestServiceStub(channel)
+                runner = test_runner.TestRunner(stub, test_cases, hist,
+                                                exception_queue, stop_event)
+                runners.append(runner)
 
-  for runner in runners:
-    runner.start()
-  try:
-    timeout_secs = args.test_duration_secs
-    if timeout_secs < 0:
-      timeout_secs = None
-    raise exception_queue.get(block=True, timeout=timeout_secs)
-  except queue.Empty:
-    # No exceptions thrown, success
-    pass
-  finally:
-    stop_event.set()
     for runner in runners:
-      runner.join()
-    runner = None
-    server.stop(None)
+        runner.start()
+    try:
+        timeout_secs = args.test_duration_secs
+        if timeout_secs < 0:
+            timeout_secs = None
+        raise exception_queue.get(block=True, timeout=timeout_secs)
+    except queue.Empty:
+        # No exceptions thrown, success
+        pass
+    finally:
+        stop_event.set()
+        for runner in runners:
+            runner.join()
+        runner = None
+        server.stop(None)
+
 
 if __name__ == '__main__':
-  run_test(_args())
+    run_test(_args())
diff --git a/src/python/grpcio_tests/tests/stress/metrics_server.py b/src/python/grpcio_tests/tests/stress/metrics_server.py
index 33dd1d6..3a4cbc2 100644
--- a/src/python/grpcio_tests/tests/stress/metrics_server.py
+++ b/src/python/grpcio_tests/tests/stress/metrics_server.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """MetricsService for publishing stress test qps data."""
 
 import time
@@ -38,23 +37,23 @@
 
 class MetricsServer(metrics_pb2.MetricsServiceServicer):
 
-  def __init__(self, histogram):
-    self._start_time = time.time()
-    self._histogram = histogram
+    def __init__(self, histogram):
+        self._start_time = time.time()
+        self._histogram = histogram
 
-  def _get_qps(self):
-    count = self._histogram.get_data().count
-    delta = time.time() - self._start_time
-    self._histogram.reset()
-    self._start_time = time.time()
-    return int(count/delta)
+    def _get_qps(self):
+        count = self._histogram.get_data().count
+        delta = time.time() - self._start_time
+        self._histogram.reset()
+        self._start_time = time.time()
+        return int(count / delta)
 
-  def GetAllGauges(self, request, context):
-    qps = self._get_qps()
-    return [metrics_pb2.GaugeResponse(name=GAUGE_NAME, long_value=qps)]
+    def GetAllGauges(self, request, context):
+        qps = self._get_qps()
+        return [metrics_pb2.GaugeResponse(name=GAUGE_NAME, long_value=qps)]
 
-  def GetGauge(self, request, context):
-    if request.name != GAUGE_NAME:
-      raise Exception('Gauge {} does not exist'.format(request.name))
-    qps = self._get_qps()
-    return metrics_pb2.GaugeResponse(name=GAUGE_NAME, long_value=qps)
+    def GetGauge(self, request, context):
+        if request.name != GAUGE_NAME:
+            raise Exception('Gauge {} does not exist'.format(request.name))
+        qps = self._get_qps()
+        return metrics_pb2.GaugeResponse(name=GAUGE_NAME, long_value=qps)
diff --git a/src/python/grpcio_tests/tests/stress/test_runner.py b/src/python/grpcio_tests/tests/stress/test_runner.py
index 88f1372..258abe9 100644
--- a/src/python/grpcio_tests/tests/stress/test_runner.py
+++ b/src/python/grpcio_tests/tests/stress/test_runner.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Thread that sends random weighted requests on a TestService stub."""
 
 import random
@@ -36,38 +35,38 @@
 
 
 def _weighted_test_case_generator(weighted_cases):
-  weight_sum = sum(weighted_cases.itervalues())
+    weight_sum = sum(weighted_cases.itervalues())
 
-  while True:
-    val = random.uniform(0, weight_sum)
-    partial_sum = 0
-    for case in weighted_cases:
-      partial_sum += weighted_cases[case]
-      if val <= partial_sum:
-        yield case
-        break
+    while True:
+        val = random.uniform(0, weight_sum)
+        partial_sum = 0
+        for case in weighted_cases:
+            partial_sum += weighted_cases[case]
+            if val <= partial_sum:
+                yield case
+                break
 
 
 class TestRunner(threading.Thread):
 
-  def __init__(self, stub, test_cases, hist, exception_queue, stop_event):
-    super(TestRunner, self).__init__()
-    self._exception_queue = exception_queue
-    self._stop_event = stop_event
-    self._stub = stub
-    self._test_cases = _weighted_test_case_generator(test_cases)
-    self._histogram = hist
+    def __init__(self, stub, test_cases, hist, exception_queue, stop_event):
+        super(TestRunner, self).__init__()
+        self._exception_queue = exception_queue
+        self._stop_event = stop_event
+        self._stub = stub
+        self._test_cases = _weighted_test_case_generator(test_cases)
+        self._histogram = hist
 
-  def run(self):
-    while not self._stop_event.is_set():
-      try:
-        test_case = next(self._test_cases)
-        start_time = time.time()
-        test_case.test_interoperability(self._stub, None)
-        end_time = time.time()
-        self._histogram.add((end_time - start_time)*1e9)
-      except Exception as e:
-        traceback.print_exc()
-        self._exception_queue.put(
-            Exception("An exception occured during test {}"
-                      .format(test_case), e))
+    def run(self):
+        while not self._stop_event.is_set():
+            try:
+                test_case = next(self._test_cases)
+                start_time = time.time()
+                test_case.test_interoperability(self._stub, None)
+                end_time = time.time()
+                self._histogram.add((end_time - start_time) * 1e9)
+            except Exception as e:
+                traceback.print_exc()
+                self._exception_queue.put(
+                    Exception("An exception occured during test {}"
+                              .format(test_case), e))
diff --git a/src/python/grpcio_tests/tests/unit/__init__.py b/src/python/grpcio_tests/tests/unit/__init__.py
index 7086519..b893988 100644
--- a/src/python/grpcio_tests/tests/unit/__init__.py
+++ b/src/python/grpcio_tests/tests/unit/__init__.py
@@ -26,5 +26,3 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
diff --git a/src/python/grpcio_tests/tests/unit/_api_test.py b/src/python/grpcio_tests/tests/unit/_api_test.py
index 51dc425..5435c55 100644
--- a/src/python/grpcio_tests/tests/unit/_api_test.py
+++ b/src/python/grpcio_tests/tests/unit/_api_test.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Test of gRPC Python's application-layer API."""
 
 import unittest
@@ -40,73 +39,71 @@
 
 class AllTest(unittest.TestCase):
 
-  def testAll(self):
-    expected_grpc_code_elements = (
-        'FutureTimeoutError',
-        'FutureCancelledError',
-        'Future',
-        'ChannelConnectivity',
-        'StatusCode',
-        'RpcError',
-        'RpcContext',
-        'Call',
-        'ChannelCredentials',
-        'CallCredentials',
-        'AuthMetadataContext',
-        'AuthMetadataPluginCallback',
-        'AuthMetadataPlugin',
-        'ServerCredentials',
-        'UnaryUnaryMultiCallable',
-        'UnaryStreamMultiCallable',
-        'StreamUnaryMultiCallable',
-        'StreamStreamMultiCallable',
-        'Channel',
-        'ServicerContext',
-        'RpcMethodHandler',
-        'HandlerCallDetails',
-        'GenericRpcHandler',
-        'ServiceRpcHandler',
-        'Server',
-        'unary_unary_rpc_method_handler',
-        'unary_stream_rpc_method_handler',
-        'stream_unary_rpc_method_handler',
-        'stream_stream_rpc_method_handler',
-        'method_handlers_generic_handler',
-        'ssl_channel_credentials',
-        'metadata_call_credentials',
-        'access_token_call_credentials',
-        'composite_call_credentials',
-        'composite_channel_credentials',
-        'ssl_server_credentials',
-        'channel_ready_future',
-        'insecure_channel',
-        'secure_channel',
-        'server',
-    )
+    def testAll(self):
+        expected_grpc_code_elements = (
+            'FutureTimeoutError',
+            'FutureCancelledError',
+            'Future',
+            'ChannelConnectivity',
+            'StatusCode',
+            'RpcError',
+            'RpcContext',
+            'Call',
+            'ChannelCredentials',
+            'CallCredentials',
+            'AuthMetadataContext',
+            'AuthMetadataPluginCallback',
+            'AuthMetadataPlugin',
+            'ServerCredentials',
+            'UnaryUnaryMultiCallable',
+            'UnaryStreamMultiCallable',
+            'StreamUnaryMultiCallable',
+            'StreamStreamMultiCallable',
+            'Channel',
+            'ServicerContext',
+            'RpcMethodHandler',
+            'HandlerCallDetails',
+            'GenericRpcHandler',
+            'ServiceRpcHandler',
+            'Server',
+            'unary_unary_rpc_method_handler',
+            'unary_stream_rpc_method_handler',
+            'stream_unary_rpc_method_handler',
+            'stream_stream_rpc_method_handler',
+            'method_handlers_generic_handler',
+            'ssl_channel_credentials',
+            'metadata_call_credentials',
+            'access_token_call_credentials',
+            'composite_call_credentials',
+            'composite_channel_credentials',
+            'ssl_server_credentials',
+            'channel_ready_future',
+            'insecure_channel',
+            'secure_channel',
+            'server',)
 
-    six.assertCountEqual(
-        self, expected_grpc_code_elements,
-        _from_grpc_import_star.GRPC_ELEMENTS)
+        six.assertCountEqual(self, expected_grpc_code_elements,
+                             _from_grpc_import_star.GRPC_ELEMENTS)
 
 
 class ChannelConnectivityTest(unittest.TestCase):
 
-  def testChannelConnectivity(self):
-    self.assertSequenceEqual(
-        (grpc.ChannelConnectivity.IDLE,
-         grpc.ChannelConnectivity.CONNECTING,
-         grpc.ChannelConnectivity.READY,
-         grpc.ChannelConnectivity.TRANSIENT_FAILURE,
-         grpc.ChannelConnectivity.SHUTDOWN,),
-        tuple(grpc.ChannelConnectivity))
+    def testChannelConnectivity(self):
+        self.assertSequenceEqual((
+            grpc.ChannelConnectivity.IDLE,
+            grpc.ChannelConnectivity.CONNECTING,
+            grpc.ChannelConnectivity.READY,
+            grpc.ChannelConnectivity.TRANSIENT_FAILURE,
+            grpc.ChannelConnectivity.SHUTDOWN,),
+                                 tuple(grpc.ChannelConnectivity))
 
 
 class ChannelTest(unittest.TestCase):
 
-  def test_secure_channel(self):
-    channel_credentials = grpc.ssl_channel_credentials()
-    channel = grpc.secure_channel('google.com:443', channel_credentials)
+    def test_secure_channel(self):
+        channel_credentials = grpc.ssl_channel_credentials()
+        channel = grpc.secure_channel('google.com:443', channel_credentials)
 
 
 if __name__ == '__main__':
-  unittest.main(verbosity=2)
+    unittest.main(verbosity=2)
diff --git a/src/python/grpcio_tests/tests/unit/_auth_test.py b/src/python/grpcio_tests/tests/unit/_auth_test.py
index c31f7b0..52bd1cb 100644
--- a/src/python/grpcio_tests/tests/unit/_auth_test.py
+++ b/src/python/grpcio_tests/tests/unit/_auth_test.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Tests of standard AuthMetadataPlugins."""
 
 import collections
@@ -38,59 +37,59 @@
 
 class MockGoogleCreds(object):
 
-  def get_access_token(self):
-    token = collections.namedtuple('MockAccessTokenInfo',
-                                   ('access_token', 'expires_in'))
-    token.access_token = 'token'
-    return token
+    def get_access_token(self):
+        token = collections.namedtuple('MockAccessTokenInfo',
+                                       ('access_token', 'expires_in'))
+        token.access_token = 'token'
+        return token
 
 
 class MockExceptionGoogleCreds(object):
 
-  def get_access_token(self):
-    raise Exception()
+    def get_access_token(self):
+        raise Exception()
 
 
 class GoogleCallCredentialsTest(unittest.TestCase):
 
-  def test_google_call_credentials_success(self):
-    callback_event = threading.Event()
+    def test_google_call_credentials_success(self):
+        callback_event = threading.Event()
 
-    def mock_callback(metadata, error):
-      self.assertEqual(metadata, (('authorization', 'Bearer token'),))
-      self.assertIsNone(error)
-      callback_event.set()
+        def mock_callback(metadata, error):
+            self.assertEqual(metadata, (('authorization', 'Bearer token'),))
+            self.assertIsNone(error)
+            callback_event.set()
 
-    call_creds = _auth.GoogleCallCredentials(MockGoogleCreds())
-    call_creds(None, mock_callback)
-    self.assertTrue(callback_event.wait(1.0))
+        call_creds = _auth.GoogleCallCredentials(MockGoogleCreds())
+        call_creds(None, mock_callback)
+        self.assertTrue(callback_event.wait(1.0))
 
-  def test_google_call_credentials_error(self):
-    callback_event = threading.Event()
+    def test_google_call_credentials_error(self):
+        callback_event = threading.Event()
 
-    def mock_callback(metadata, error):
-      self.assertIsNotNone(error)
-      callback_event.set()
+        def mock_callback(metadata, error):
+            self.assertIsNotNone(error)
+            callback_event.set()
 
-    call_creds = _auth.GoogleCallCredentials(MockExceptionGoogleCreds())
-    call_creds(None, mock_callback)
-    self.assertTrue(callback_event.wait(1.0))
+        call_creds = _auth.GoogleCallCredentials(MockExceptionGoogleCreds())
+        call_creds(None, mock_callback)
+        self.assertTrue(callback_event.wait(1.0))
 
 
 class AccessTokenCallCredentialsTest(unittest.TestCase):
 
-  def test_google_call_credentials_success(self):
-    callback_event = threading.Event()
+    def test_google_call_credentials_success(self):
+        callback_event = threading.Event()
 
-    def mock_callback(metadata, error):
-      self.assertEqual(metadata, (('authorization', 'Bearer token'),))
-      self.assertIsNone(error)
-      callback_event.set()
+        def mock_callback(metadata, error):
+            self.assertEqual(metadata, (('authorization', 'Bearer token'),))
+            self.assertIsNone(error)
+            callback_event.set()
 
-    call_creds = _auth.AccessTokenCallCredentials('token')
-    call_creds(None, mock_callback)
-    self.assertTrue(callback_event.wait(1.0))
+        call_creds = _auth.AccessTokenCallCredentials('token')
+        call_creds(None, mock_callback)
+        self.assertTrue(callback_event.wait(1.0))
 
 
 if __name__ == '__main__':
-  unittest.main(verbosity=2)
+    unittest.main(verbosity=2)
diff --git a/src/python/grpcio_tests/tests/unit/_channel_args_test.py b/src/python/grpcio_tests/tests/unit/_channel_args_test.py
index b46497a..845db77 100644
--- a/src/python/grpcio_tests/tests/unit/_channel_args_test.py
+++ b/src/python/grpcio_tests/tests/unit/_channel_args_test.py
@@ -26,17 +26,17 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Tests of Channel Args on client/server side."""
 
 import unittest
 
 import grpc
 
+
 class TestPointerWrapper(object):
 
-  def __int__(self):
-    return 123456
+    def __int__(self):
+        return 123456
 
 
 TEST_CHANNEL_ARGS = (
@@ -44,17 +44,17 @@
     ('arg2', 'str_val'),
     ('arg3', 1),
     (b'arg4', 'str_val'),
-    ('arg6', TestPointerWrapper()),
-)
+    ('arg6', TestPointerWrapper()),)
 
 
 class ChannelArgsTest(unittest.TestCase):
 
-  def test_client(self):
-    grpc.insecure_channel('localhost:8080', options=TEST_CHANNEL_ARGS)
+    def test_client(self):
+        grpc.insecure_channel('localhost:8080', options=TEST_CHANNEL_ARGS)
 
-  def test_server(self):
-    grpc.server(None, options=TEST_CHANNEL_ARGS)
+    def test_server(self):
+        grpc.server(None, options=TEST_CHANNEL_ARGS)
+
 
 if __name__ == '__main__':
-  unittest.main(verbosity=2)
+    unittest.main(verbosity=2)
diff --git a/src/python/grpcio_tests/tests/unit/_channel_connectivity_test.py b/src/python/grpcio_tests/tests/unit/_channel_connectivity_test.py
index 3d9dd17..d676931 100644
--- a/src/python/grpcio_tests/tests/unit/_channel_connectivity_test.py
+++ b/src/python/grpcio_tests/tests/unit/_channel_connectivity_test.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Tests of grpc._channel.Channel connectivity."""
 
 import threading
@@ -39,125 +38,123 @@
 
 
 def _ready_in_connectivities(connectivities):
-  return grpc.ChannelConnectivity.READY in connectivities
+    return grpc.ChannelConnectivity.READY in connectivities
 
 
 def _last_connectivity_is_not_ready(connectivities):
-  return connectivities[-1] is not grpc.ChannelConnectivity.READY
+    return connectivities[-1] is not grpc.ChannelConnectivity.READY
 
 
 class _Callback(object):
 
-  def __init__(self):
-    self._condition = threading.Condition()
-    self._connectivities = []
+    def __init__(self):
+        self._condition = threading.Condition()
+        self._connectivities = []
 
-  def update(self, connectivity):
-    with self._condition:
-      self._connectivities.append(connectivity)
-      self._condition.notify()
+    def update(self, connectivity):
+        with self._condition:
+            self._connectivities.append(connectivity)
+            self._condition.notify()
 
-  def connectivities(self):
-    with self._condition:
-      return tuple(self._connectivities)
+    def connectivities(self):
+        with self._condition:
+            return tuple(self._connectivities)
 
-  def block_until_connectivities_satisfy(self, predicate):
-    with self._condition:
-      while True:
-        connectivities = tuple(self._connectivities)
-        if predicate(connectivities):
-          return connectivities
-        else:
-          self._condition.wait()
+    def block_until_connectivities_satisfy(self, predicate):
+        with self._condition:
+            while True:
+                connectivities = tuple(self._connectivities)
+                if predicate(connectivities):
+                    return connectivities
+                else:
+                    self._condition.wait()
 
 
 class ChannelConnectivityTest(unittest.TestCase):
 
-  def test_lonely_channel_connectivity(self):
-    callback = _Callback()
+    def test_lonely_channel_connectivity(self):
+        callback = _Callback()
 
-    channel = grpc.insecure_channel('localhost:12345')
-    channel.subscribe(callback.update, try_to_connect=False)
-    first_connectivities = callback.block_until_connectivities_satisfy(bool)
-    channel.subscribe(callback.update, try_to_connect=True)
-    second_connectivities = callback.block_until_connectivities_satisfy(
-        lambda connectivities: 2 <= len(connectivities))
-    # Wait for a connection that will never happen.
-    time.sleep(test_constants.SHORT_TIMEOUT)
-    third_connectivities = callback.connectivities()
-    channel.unsubscribe(callback.update)
-    fourth_connectivities = callback.connectivities()
-    channel.unsubscribe(callback.update)
-    fifth_connectivities = callback.connectivities()
+        channel = grpc.insecure_channel('localhost:12345')
+        channel.subscribe(callback.update, try_to_connect=False)
+        first_connectivities = callback.block_until_connectivities_satisfy(bool)
+        channel.subscribe(callback.update, try_to_connect=True)
+        second_connectivities = callback.block_until_connectivities_satisfy(
+            lambda connectivities: 2 <= len(connectivities))
+        # Wait for a connection that will never happen.
+        time.sleep(test_constants.SHORT_TIMEOUT)
+        third_connectivities = callback.connectivities()
+        channel.unsubscribe(callback.update)
+        fourth_connectivities = callback.connectivities()
+        channel.unsubscribe(callback.update)
+        fifth_connectivities = callback.connectivities()
 
-    self.assertSequenceEqual(
-        (grpc.ChannelConnectivity.IDLE,), first_connectivities)
-    self.assertNotIn(
-        grpc.ChannelConnectivity.READY, second_connectivities)
-    self.assertNotIn(
-        grpc.ChannelConnectivity.READY, third_connectivities)
-    self.assertNotIn(
-        grpc.ChannelConnectivity.READY, fourth_connectivities)
-    self.assertNotIn(
-        grpc.ChannelConnectivity.READY, fifth_connectivities)
+        self.assertSequenceEqual((grpc.ChannelConnectivity.IDLE,),
+                                 first_connectivities)
+        self.assertNotIn(grpc.ChannelConnectivity.READY, second_connectivities)
+        self.assertNotIn(grpc.ChannelConnectivity.READY, third_connectivities)
+        self.assertNotIn(grpc.ChannelConnectivity.READY, fourth_connectivities)
+        self.assertNotIn(grpc.ChannelConnectivity.READY, fifth_connectivities)
 
-  def test_immediately_connectable_channel_connectivity(self):
-    thread_pool = _thread_pool.RecordingThreadPool(max_workers=None)
-    server = grpc.server(thread_pool)
-    port = server.add_insecure_port('[::]:0')
-    server.start()
-    first_callback = _Callback()
-    second_callback = _Callback()
+    def test_immediately_connectable_channel_connectivity(self):
+        thread_pool = _thread_pool.RecordingThreadPool(max_workers=None)
+        server = grpc.server(thread_pool)
+        port = server.add_insecure_port('[::]:0')
+        server.start()
+        first_callback = _Callback()
+        second_callback = _Callback()
 
-    channel = grpc.insecure_channel('localhost:{}'.format(port))
-    channel.subscribe(first_callback.update, try_to_connect=False)
-    first_connectivities = first_callback.block_until_connectivities_satisfy(
-        bool)
-    # Wait for a connection that will never happen because try_to_connect=True
-    # has not yet been passed.
-    time.sleep(test_constants.SHORT_TIMEOUT)
-    second_connectivities = first_callback.connectivities()
-    channel.subscribe(second_callback.update, try_to_connect=True)
-    third_connectivities = first_callback.block_until_connectivities_satisfy(
-        lambda connectivities: 2 <= len(connectivities))
-    fourth_connectivities = second_callback.block_until_connectivities_satisfy(
-        bool)
-    # Wait for a connection that will happen (or may already have happened).
-    first_callback.block_until_connectivities_satisfy(_ready_in_connectivities)
-    second_callback.block_until_connectivities_satisfy(_ready_in_connectivities)
-    del channel
+        channel = grpc.insecure_channel('localhost:{}'.format(port))
+        channel.subscribe(first_callback.update, try_to_connect=False)
+        first_connectivities = first_callback.block_until_connectivities_satisfy(
+            bool)
+        # Wait for a connection that will never happen because try_to_connect=True
+        # has not yet been passed.
+        time.sleep(test_constants.SHORT_TIMEOUT)
+        second_connectivities = first_callback.connectivities()
+        channel.subscribe(second_callback.update, try_to_connect=True)
+        third_connectivities = first_callback.block_until_connectivities_satisfy(
+            lambda connectivities: 2 <= len(connectivities))
+        fourth_connectivities = second_callback.block_until_connectivities_satisfy(
+            bool)
+        # Wait for a connection that will happen (or may already have happened).
+        first_callback.block_until_connectivities_satisfy(
+            _ready_in_connectivities)
+        second_callback.block_until_connectivities_satisfy(
+            _ready_in_connectivities)
+        del channel
 
-    self.assertSequenceEqual(
-        (grpc.ChannelConnectivity.IDLE,), first_connectivities)
-    self.assertSequenceEqual(
-        (grpc.ChannelConnectivity.IDLE,), second_connectivities)
-    self.assertNotIn(
-        grpc.ChannelConnectivity.TRANSIENT_FAILURE, third_connectivities)
-    self.assertNotIn(
-        grpc.ChannelConnectivity.SHUTDOWN, third_connectivities)
-    self.assertNotIn(
-        grpc.ChannelConnectivity.TRANSIENT_FAILURE,
-        fourth_connectivities)
-    self.assertNotIn(
-        grpc.ChannelConnectivity.SHUTDOWN, fourth_connectivities)
-    self.assertFalse(thread_pool.was_used())
+        self.assertSequenceEqual((grpc.ChannelConnectivity.IDLE,),
+                                 first_connectivities)
+        self.assertSequenceEqual((grpc.ChannelConnectivity.IDLE,),
+                                 second_connectivities)
+        self.assertNotIn(grpc.ChannelConnectivity.TRANSIENT_FAILURE,
+                         third_connectivities)
+        self.assertNotIn(grpc.ChannelConnectivity.SHUTDOWN,
+                         third_connectivities)
+        self.assertNotIn(grpc.ChannelConnectivity.TRANSIENT_FAILURE,
+                         fourth_connectivities)
+        self.assertNotIn(grpc.ChannelConnectivity.SHUTDOWN,
+                         fourth_connectivities)
+        self.assertFalse(thread_pool.was_used())
 
-  def test_reachable_then_unreachable_channel_connectivity(self):
-    thread_pool = _thread_pool.RecordingThreadPool(max_workers=None)
-    server = grpc.server(thread_pool)
-    port = server.add_insecure_port('[::]:0')
-    server.start()
-    callback = _Callback()
+    def test_reachable_then_unreachable_channel_connectivity(self):
+        thread_pool = _thread_pool.RecordingThreadPool(max_workers=None)
+        server = grpc.server(thread_pool)
+        port = server.add_insecure_port('[::]:0')
+        server.start()
+        callback = _Callback()
 
-    channel = grpc.insecure_channel('localhost:{}'.format(port))
-    channel.subscribe(callback.update, try_to_connect=True)
-    callback.block_until_connectivities_satisfy(_ready_in_connectivities)
-    # Now take down the server and confirm that channel readiness is repudiated.
-    server.stop(None)
-    callback.block_until_connectivities_satisfy(_last_connectivity_is_not_ready)
-    channel.unsubscribe(callback.update)
-    self.assertFalse(thread_pool.was_used())
+        channel = grpc.insecure_channel('localhost:{}'.format(port))
+        channel.subscribe(callback.update, try_to_connect=True)
+        callback.block_until_connectivities_satisfy(_ready_in_connectivities)
+        # Now take down the server and confirm that channel readiness is repudiated.
+        server.stop(None)
+        callback.block_until_connectivities_satisfy(
+            _last_connectivity_is_not_ready)
+        channel.unsubscribe(callback.update)
+        self.assertFalse(thread_pool.was_used())
 
 
 if __name__ == '__main__':
-  unittest.main(verbosity=2)
+    unittest.main(verbosity=2)
diff --git a/src/python/grpcio_tests/tests/unit/_channel_ready_future_test.py b/src/python/grpcio_tests/tests/unit/_channel_ready_future_test.py
index 46a964d..2d1b63e 100644
--- a/src/python/grpcio_tests/tests/unit/_channel_ready_future_test.py
+++ b/src/python/grpcio_tests/tests/unit/_channel_ready_future_test.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Tests of grpc.channel_ready_future."""
 
 import threading
@@ -39,65 +38,66 @@
 
 class _Callback(object):
 
-  def __init__(self):
-    self._condition = threading.Condition()
-    self._value = None
+    def __init__(self):
+        self._condition = threading.Condition()
+        self._value = None
 
-  def accept_value(self, value):
-    with self._condition:
-      self._value = value
-      self._condition.notify_all()
+    def accept_value(self, value):
+        with self._condition:
+            self._value = value
+            self._condition.notify_all()
 
-  def block_until_called(self):
-    with self._condition:
-      while self._value is None:
-        self._condition.wait()
-      return self._value
+    def block_until_called(self):
+        with self._condition:
+            while self._value is None:
+                self._condition.wait()
+            return self._value
 
 
 class ChannelReadyFutureTest(unittest.TestCase):
 
-  def test_lonely_channel_connectivity(self):
-    channel = grpc.insecure_channel('localhost:12345')
-    callback = _Callback()
+    def test_lonely_channel_connectivity(self):
+        channel = grpc.insecure_channel('localhost:12345')
+        callback = _Callback()
 
-    ready_future = grpc.channel_ready_future(channel)
-    ready_future.add_done_callback(callback.accept_value)
-    with self.assertRaises(grpc.FutureTimeoutError):
-      ready_future.result(timeout=test_constants.SHORT_TIMEOUT)
-    self.assertFalse(ready_future.cancelled())
-    self.assertFalse(ready_future.done())
-    self.assertTrue(ready_future.running())
-    ready_future.cancel()
-    value_passed_to_callback = callback.block_until_called()
-    self.assertIs(ready_future, value_passed_to_callback)
-    self.assertTrue(ready_future.cancelled())
-    self.assertTrue(ready_future.done())
-    self.assertFalse(ready_future.running())
+        ready_future = grpc.channel_ready_future(channel)
+        ready_future.add_done_callback(callback.accept_value)
+        with self.assertRaises(grpc.FutureTimeoutError):
+            ready_future.result(timeout=test_constants.SHORT_TIMEOUT)
+        self.assertFalse(ready_future.cancelled())
+        self.assertFalse(ready_future.done())
+        self.assertTrue(ready_future.running())
+        ready_future.cancel()
+        value_passed_to_callback = callback.block_until_called()
+        self.assertIs(ready_future, value_passed_to_callback)
+        self.assertTrue(ready_future.cancelled())
+        self.assertTrue(ready_future.done())
+        self.assertFalse(ready_future.running())
 
-  def test_immediately_connectable_channel_connectivity(self):
-    thread_pool = _thread_pool.RecordingThreadPool(max_workers=None)
-    server = grpc.server(thread_pool)
-    port = server.add_insecure_port('[::]:0')
-    server.start()
-    channel = grpc.insecure_channel('localhost:{}'.format(port))
-    callback = _Callback()
+    def test_immediately_connectable_channel_connectivity(self):
+        thread_pool = _thread_pool.RecordingThreadPool(max_workers=None)
+        server = grpc.server(thread_pool)
+        port = server.add_insecure_port('[::]:0')
+        server.start()
+        channel = grpc.insecure_channel('localhost:{}'.format(port))
+        callback = _Callback()
 
-    ready_future = grpc.channel_ready_future(channel)
-    ready_future.add_done_callback(callback.accept_value)
-    self.assertIsNone(ready_future.result(timeout=test_constants.LONG_TIMEOUT))
-    value_passed_to_callback = callback.block_until_called()
-    self.assertIs(ready_future, value_passed_to_callback)
-    self.assertFalse(ready_future.cancelled())
-    self.assertTrue(ready_future.done())
-    self.assertFalse(ready_future.running())
-    # Cancellation after maturity has no effect.
-    ready_future.cancel()
-    self.assertFalse(ready_future.cancelled())
-    self.assertTrue(ready_future.done())
-    self.assertFalse(ready_future.running())
-    self.assertFalse(thread_pool.was_used())
+        ready_future = grpc.channel_ready_future(channel)
+        ready_future.add_done_callback(callback.accept_value)
+        self.assertIsNone(
+            ready_future.result(timeout=test_constants.LONG_TIMEOUT))
+        value_passed_to_callback = callback.block_until_called()
+        self.assertIs(ready_future, value_passed_to_callback)
+        self.assertFalse(ready_future.cancelled())
+        self.assertTrue(ready_future.done())
+        self.assertFalse(ready_future.running())
+        # Cancellation after maturity has no effect.
+        ready_future.cancel()
+        self.assertFalse(ready_future.cancelled())
+        self.assertTrue(ready_future.done())
+        self.assertFalse(ready_future.running())
+        self.assertFalse(thread_pool.was_used())
 
 
 if __name__ == '__main__':
-  unittest.main(verbosity=2)
+    unittest.main(verbosity=2)
diff --git a/src/python/grpcio_tests/tests/unit/_compression_test.py b/src/python/grpcio_tests/tests/unit/_compression_test.py
index 4d3f02e..7dd944e 100644
--- a/src/python/grpcio_tests/tests/unit/_compression_test.py
+++ b/src/python/grpcio_tests/tests/unit/_compression_test.py
@@ -42,93 +42,96 @@
 
 
 def handle_unary(request, servicer_context):
-  servicer_context.send_initial_metadata([
-    ('grpc-internal-encoding-request', 'gzip')])
-  return request
+    servicer_context.send_initial_metadata(
+        [('grpc-internal-encoding-request', 'gzip')])
+    return request
 
 
 def handle_stream(request_iterator, servicer_context):
-  # TODO(issue:#6891) We should be able to remove this loop,
-  # and replace with return; yield
-  servicer_context.send_initial_metadata([
-    ('grpc-internal-encoding-request', 'gzip')])
-  for request in request_iterator:
-    yield request
+    # TODO(issue:#6891) We should be able to remove this loop,
+    # and replace with return; yield
+    servicer_context.send_initial_metadata(
+        [('grpc-internal-encoding-request', 'gzip')])
+    for request in request_iterator:
+        yield request
 
 
 class _MethodHandler(grpc.RpcMethodHandler):
 
-  def __init__(self, request_streaming, response_streaming):
-    self.request_streaming = request_streaming
-    self.response_streaming = response_streaming
-    self.request_deserializer = None
-    self.response_serializer = None
-    self.unary_unary = None
-    self.unary_stream = None
-    self.stream_unary = None
-    self.stream_stream = None
-    if self.request_streaming and self.response_streaming:
-      self.stream_stream = lambda x, y: handle_stream(x, y)
-    elif not self.request_streaming and not self.response_streaming:
-      self.unary_unary = lambda x, y: handle_unary(x, y)
+    def __init__(self, request_streaming, response_streaming):
+        self.request_streaming = request_streaming
+        self.response_streaming = response_streaming
+        self.request_deserializer = None
+        self.response_serializer = None
+        self.unary_unary = None
+        self.unary_stream = None
+        self.stream_unary = None
+        self.stream_stream = None
+        if self.request_streaming and self.response_streaming:
+            self.stream_stream = lambda x, y: handle_stream(x, y)
+        elif not self.request_streaming and not self.response_streaming:
+            self.unary_unary = lambda x, y: handle_unary(x, y)
 
 
 class _GenericHandler(grpc.GenericRpcHandler):
 
-  def service(self, handler_call_details):
-    if handler_call_details.method == _UNARY_UNARY:
-      return _MethodHandler(False, False)
-    elif handler_call_details.method == _STREAM_STREAM:
-      return _MethodHandler(True, True)
-    else:
-      return None
+    def service(self, handler_call_details):
+        if handler_call_details.method == _UNARY_UNARY:
+            return _MethodHandler(False, False)
+        elif handler_call_details.method == _STREAM_STREAM:
+            return _MethodHandler(True, True)
+        else:
+            return None
 
 
 class CompressionTest(unittest.TestCase):
 
-  def setUp(self):
-    self._server_pool = logging_pool.pool(test_constants.THREAD_CONCURRENCY)
-    self._server = grpc.server(
-        self._server_pool, handlers=(_GenericHandler(),))
-    self._port = self._server.add_insecure_port('[::]:0')
-    self._server.start()
+    def setUp(self):
+        self._server_pool = logging_pool.pool(test_constants.THREAD_CONCURRENCY)
+        self._server = grpc.server(
+            self._server_pool, handlers=(_GenericHandler(),))
+        self._port = self._server.add_insecure_port('[::]:0')
+        self._server.start()
 
-  def testUnary(self):
-    request = b'\x00' * 100
+    def testUnary(self):
+        request = b'\x00' * 100
 
-    # Client -> server compressed through default client channel compression
-    # settings. Server -> client compressed via server-side metadata setting.
-    # TODO(https://github.com/grpc/grpc/issues/4078): replace the "1" integer
-    # literal with proper use of the public API.
-    compressed_channel = grpc.insecure_channel('localhost:%d' % self._port,
-        options=[('grpc.default_compression_algorithm', 1)])
-    multi_callable = compressed_channel.unary_unary(_UNARY_UNARY)
-    response = multi_callable(request)
-    self.assertEqual(request, response)
+        # Client -> server compressed through default client channel compression
+        # settings. Server -> client compressed via server-side metadata setting.
+        # TODO(https://github.com/grpc/grpc/issues/4078): replace the "1" integer
+        # literal with proper use of the public API.
+        compressed_channel = grpc.insecure_channel(
+            'localhost:%d' % self._port,
+            options=[('grpc.default_compression_algorithm', 1)])
+        multi_callable = compressed_channel.unary_unary(_UNARY_UNARY)
+        response = multi_callable(request)
+        self.assertEqual(request, response)
 
-    # Client -> server compressed through client metadata setting. Server ->
-    # client compressed via server-side metadata setting.
-    # TODO(https://github.com/grpc/grpc/issues/4078): replace the "0" integer
-    # literal with proper use of the public API.
-    uncompressed_channel = grpc.insecure_channel('localhost:%d' % self._port,
-        options=[('grpc.default_compression_algorithm', 0)])
-    multi_callable = compressed_channel.unary_unary(_UNARY_UNARY)
-    response = multi_callable(request, metadata=[
-      ('grpc-internal-encoding-request', 'gzip')])
-    self.assertEqual(request, response)
+        # Client -> server compressed through client metadata setting. Server ->
+        # client compressed via server-side metadata setting.
+        # TODO(https://github.com/grpc/grpc/issues/4078): replace the "0" integer
+        # literal with proper use of the public API.
+        uncompressed_channel = grpc.insecure_channel(
+            'localhost:%d' % self._port,
+            options=[('grpc.default_compression_algorithm', 0)])
+        multi_callable = compressed_channel.unary_unary(_UNARY_UNARY)
+        response = multi_callable(
+            request, metadata=[('grpc-internal-encoding-request', 'gzip')])
+        self.assertEqual(request, response)
 
-  def testStreaming(self):
-    request = b'\x00' * 100
+    def testStreaming(self):
+        request = b'\x00' * 100
 
-    # TODO(https://github.com/grpc/grpc/issues/4078): replace the "1" integer
-    # literal with proper use of the public API.
-    compressed_channel = grpc.insecure_channel('localhost:%d' % self._port,
-        options=[('grpc.default_compression_algorithm', 1)])
-    multi_callable = compressed_channel.stream_stream(_STREAM_STREAM)
-    call = multi_callable(iter([request] * test_constants.STREAM_LENGTH))
-    for response in call:
-      self.assertEqual(request, response)
+        # TODO(https://github.com/grpc/grpc/issues/4078): replace the "1" integer
+        # literal with proper use of the public API.
+        compressed_channel = grpc.insecure_channel(
+            'localhost:%d' % self._port,
+            options=[('grpc.default_compression_algorithm', 1)])
+        multi_callable = compressed_channel.stream_stream(_STREAM_STREAM)
+        call = multi_callable(iter([request] * test_constants.STREAM_LENGTH))
+        for response in call:
+            self.assertEqual(request, response)
 
 
 if __name__ == '__main__':
-  unittest.main(verbosity=2)
+    unittest.main(verbosity=2)
diff --git a/src/python/grpcio_tests/tests/unit/_credentials_test.py b/src/python/grpcio_tests/tests/unit/_credentials_test.py
index 87af85a..21bf297 100644
--- a/src/python/grpcio_tests/tests/unit/_credentials_test.py
+++ b/src/python/grpcio_tests/tests/unit/_credentials_test.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Tests of credentials."""
 
 import unittest
@@ -36,37 +35,38 @@
 
 class CredentialsTest(unittest.TestCase):
 
-  def test_call_credentials_composition(self):
-    first = grpc.access_token_call_credentials('abc')
-    second = grpc.access_token_call_credentials('def')
-    third = grpc.access_token_call_credentials('ghi')
+    def test_call_credentials_composition(self):
+        first = grpc.access_token_call_credentials('abc')
+        second = grpc.access_token_call_credentials('def')
+        third = grpc.access_token_call_credentials('ghi')
 
-    first_and_second = grpc.composite_call_credentials(first, second)
-    first_second_and_third = grpc.composite_call_credentials(
-        first, second, third)
-    
-    self.assertIsInstance(first_and_second, grpc.CallCredentials)
-    self.assertIsInstance(first_second_and_third, grpc.CallCredentials)
+        first_and_second = grpc.composite_call_credentials(first, second)
+        first_second_and_third = grpc.composite_call_credentials(first, second,
+                                                                 third)
 
-  def test_channel_credentials_composition(self):
-    first_call_credentials = grpc.access_token_call_credentials('abc')
-    second_call_credentials = grpc.access_token_call_credentials('def')
-    third_call_credentials = grpc.access_token_call_credentials('ghi')
-    channel_credentials = grpc.ssl_channel_credentials()
+        self.assertIsInstance(first_and_second, grpc.CallCredentials)
+        self.assertIsInstance(first_second_and_third, grpc.CallCredentials)
 
-    channel_and_first = grpc.composite_channel_credentials(
-        channel_credentials, first_call_credentials)
-    channel_first_and_second = grpc.composite_channel_credentials(
-        channel_credentials, first_call_credentials, second_call_credentials)
-    channel_first_second_and_third = grpc.composite_channel_credentials(
-        channel_credentials, first_call_credentials, second_call_credentials,
-        third_call_credentials)
+    def test_channel_credentials_composition(self):
+        first_call_credentials = grpc.access_token_call_credentials('abc')
+        second_call_credentials = grpc.access_token_call_credentials('def')
+        third_call_credentials = grpc.access_token_call_credentials('ghi')
+        channel_credentials = grpc.ssl_channel_credentials()
 
-    self.assertIsInstance(channel_and_first, grpc.ChannelCredentials)
-    self.assertIsInstance(channel_first_and_second, grpc.ChannelCredentials)
-    self.assertIsInstance(
-        channel_first_second_and_third, grpc.ChannelCredentials)
+        channel_and_first = grpc.composite_channel_credentials(
+            channel_credentials, first_call_credentials)
+        channel_first_and_second = grpc.composite_channel_credentials(
+            channel_credentials, first_call_credentials,
+            second_call_credentials)
+        channel_first_second_and_third = grpc.composite_channel_credentials(
+            channel_credentials, first_call_credentials,
+            second_call_credentials, third_call_credentials)
+
+        self.assertIsInstance(channel_and_first, grpc.ChannelCredentials)
+        self.assertIsInstance(channel_first_and_second, grpc.ChannelCredentials)
+        self.assertIsInstance(channel_first_second_and_third,
+                              grpc.ChannelCredentials)
 
 
 if __name__ == '__main__':
-  unittest.main(verbosity=2)
+    unittest.main(verbosity=2)
diff --git a/src/python/grpcio_tests/tests/unit/_cython/_cancel_many_calls_test.py b/src/python/grpcio_tests/tests/unit/_cython/_cancel_many_calls_test.py
index 20115fb..d77f5ec 100644
--- a/src/python/grpcio_tests/tests/unit/_cython/_cancel_many_calls_test.py
+++ b/src/python/grpcio_tests/tests/unit/_cython/_cancel_many_calls_test.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Test making many calls and immediately cancelling most of them."""
 
 import threading
@@ -51,173 +50,178 @@
 
 class _State(object):
 
-  def __init__(self):
-    self.condition = threading.Condition()
-    self.handlers_released = False
-    self.parked_handlers = 0
-    self.handled_rpcs = 0
+    def __init__(self):
+        self.condition = threading.Condition()
+        self.handlers_released = False
+        self.parked_handlers = 0
+        self.handled_rpcs = 0
 
 
 def _is_cancellation_event(event):
-  return (
-      event.tag is _RECEIVE_CLOSE_ON_SERVER_TAG and
-      event.batch_operations[0].received_cancelled)
+    return (event.tag is _RECEIVE_CLOSE_ON_SERVER_TAG and
+            event.batch_operations[0].received_cancelled)
 
 
 class _Handler(object):
 
-  def __init__(self, state, completion_queue, rpc_event):
-    self._state = state
-    self._lock = threading.Lock()
-    self._completion_queue = completion_queue
-    self._call = rpc_event.operation_call
+    def __init__(self, state, completion_queue, rpc_event):
+        self._state = state
+        self._lock = threading.Lock()
+        self._completion_queue = completion_queue
+        self._call = rpc_event.operation_call
 
-  def __call__(self):
-    with self._state.condition:
-      self._state.parked_handlers += 1
-      if self._state.parked_handlers == test_constants.THREAD_CONCURRENCY:
-        self._state.condition.notify_all()
-      while not self._state.handlers_released:
-        self._state.condition.wait()
+    def __call__(self):
+        with self._state.condition:
+            self._state.parked_handlers += 1
+            if self._state.parked_handlers == test_constants.THREAD_CONCURRENCY:
+                self._state.condition.notify_all()
+            while not self._state.handlers_released:
+                self._state.condition.wait()
 
-    with self._lock:
-      self._call.start_server_batch(
-          cygrpc.Operations(
-              (cygrpc.operation_receive_close_on_server(_EMPTY_FLAGS),)),
-          _RECEIVE_CLOSE_ON_SERVER_TAG)
-      self._call.start_server_batch(
-          cygrpc.Operations((cygrpc.operation_receive_message(_EMPTY_FLAGS),)),
-          _RECEIVE_MESSAGE_TAG)
-    first_event = self._completion_queue.poll()
-    if _is_cancellation_event(first_event):
-      self._completion_queue.poll()
-    else:
-      with self._lock:
-        operations = (
-            cygrpc.operation_send_initial_metadata(
-                _EMPTY_METADATA, _EMPTY_FLAGS),
-            cygrpc.operation_send_message(b'\x79\x57', _EMPTY_FLAGS),
-            cygrpc.operation_send_status_from_server(
-                _EMPTY_METADATA, cygrpc.StatusCode.ok, b'test details!',
-                _EMPTY_FLAGS),
-        )
-        self._call.start_server_batch(
-            cygrpc.Operations(operations), _SERVER_COMPLETE_CALL_TAG)
-      self._completion_queue.poll()
-      self._completion_queue.poll()
+        with self._lock:
+            self._call.start_server_batch(
+                cygrpc.Operations(
+                    (cygrpc.operation_receive_close_on_server(_EMPTY_FLAGS),)),
+                _RECEIVE_CLOSE_ON_SERVER_TAG)
+            self._call.start_server_batch(
+                cygrpc.Operations(
+                    (cygrpc.operation_receive_message(_EMPTY_FLAGS),)),
+                _RECEIVE_MESSAGE_TAG)
+        first_event = self._completion_queue.poll()
+        if _is_cancellation_event(first_event):
+            self._completion_queue.poll()
+        else:
+            with self._lock:
+                operations = (
+                    cygrpc.operation_send_initial_metadata(_EMPTY_METADATA,
+                                                           _EMPTY_FLAGS),
+                    cygrpc.operation_send_message(b'\x79\x57', _EMPTY_FLAGS),
+                    cygrpc.operation_send_status_from_server(
+                        _EMPTY_METADATA, cygrpc.StatusCode.ok, b'test details!',
+                        _EMPTY_FLAGS),)
+                self._call.start_server_batch(
+                    cygrpc.Operations(operations), _SERVER_COMPLETE_CALL_TAG)
+            self._completion_queue.poll()
+            self._completion_queue.poll()
 
 
 def _serve(state, server, server_completion_queue, thread_pool):
-  for _ in range(test_constants.RPC_CONCURRENCY):
-    call_completion_queue = cygrpc.CompletionQueue()
-    server.request_call(
-        call_completion_queue, server_completion_queue, _REQUEST_CALL_TAG)
-    rpc_event = server_completion_queue.poll()
-    thread_pool.submit(_Handler(state, call_completion_queue, rpc_event))
-    with state.condition:
-      state.handled_rpcs += 1
-      if test_constants.RPC_CONCURRENCY <= state.handled_rpcs:
-        state.condition.notify_all()
-  server_completion_queue.poll()
+    for _ in range(test_constants.RPC_CONCURRENCY):
+        call_completion_queue = cygrpc.CompletionQueue()
+        server.request_call(call_completion_queue, server_completion_queue,
+                            _REQUEST_CALL_TAG)
+        rpc_event = server_completion_queue.poll()
+        thread_pool.submit(_Handler(state, call_completion_queue, rpc_event))
+        with state.condition:
+            state.handled_rpcs += 1
+            if test_constants.RPC_CONCURRENCY <= state.handled_rpcs:
+                state.condition.notify_all()
+    server_completion_queue.poll()
 
 
 class _QueueDriver(object):
 
-  def __init__(self, condition, completion_queue, due):
-    self._condition = condition
-    self._completion_queue = completion_queue
-    self._due = due
-    self._events = []
-    self._returned = False
+    def __init__(self, condition, completion_queue, due):
+        self._condition = condition
+        self._completion_queue = completion_queue
+        self._due = due
+        self._events = []
+        self._returned = False
 
-  def start(self):
-    def in_thread():
-      while True:
-        event = self._completion_queue.poll()
+    def start(self):
+
+        def in_thread():
+            while True:
+                event = self._completion_queue.poll()
+                with self._condition:
+                    self._events.append(event)
+                    self._due.remove(event.tag)
+                    self._condition.notify_all()
+                    if not self._due:
+                        self._returned = True
+                        return
+
+        thread = threading.Thread(target=in_thread)
+        thread.start()
+
+    def events(self, at_least):
         with self._condition:
-          self._events.append(event)
-          self._due.remove(event.tag)
-          self._condition.notify_all()
-          if not self._due:
-            self._returned = True
-            return
-    thread = threading.Thread(target=in_thread)
-    thread.start()
-
-  def events(self, at_least):
-    with self._condition:
-      while len(self._events) < at_least:
-        self._condition.wait()
-      return tuple(self._events)
+            while len(self._events) < at_least:
+                self._condition.wait()
+            return tuple(self._events)
 
 
 class CancelManyCallsTest(unittest.TestCase):
 
-  def testCancelManyCalls(self):
-    server_thread_pool = logging_pool.pool(test_constants.THREAD_CONCURRENCY)
+    def testCancelManyCalls(self):
+        server_thread_pool = logging_pool.pool(
+            test_constants.THREAD_CONCURRENCY)
 
-    server_completion_queue = cygrpc.CompletionQueue()
-    server = cygrpc.Server(cygrpc.ChannelArgs([]))
-    server.register_completion_queue(server_completion_queue)
-    port = server.add_http2_port(b'[::]:0')
-    server.start()
-    channel = cygrpc.Channel('localhost:{}'.format(port).encode(),
-                             cygrpc.ChannelArgs([]))
+        server_completion_queue = cygrpc.CompletionQueue()
+        server = cygrpc.Server(cygrpc.ChannelArgs([]))
+        server.register_completion_queue(server_completion_queue)
+        port = server.add_http2_port(b'[::]:0')
+        server.start()
+        channel = cygrpc.Channel('localhost:{}'.format(port).encode(),
+                                 cygrpc.ChannelArgs([]))
 
-    state = _State()
+        state = _State()
 
-    server_thread_args = (
-        state, server, server_completion_queue, server_thread_pool,)
-    server_thread = threading.Thread(target=_serve, args=server_thread_args)
-    server_thread.start()
+        server_thread_args = (
+            state,
+            server,
+            server_completion_queue,
+            server_thread_pool,)
+        server_thread = threading.Thread(target=_serve, args=server_thread_args)
+        server_thread.start()
 
-    client_condition = threading.Condition()
-    client_due = set()
-    client_completion_queue = cygrpc.CompletionQueue()
-    client_driver = _QueueDriver(
-        client_condition, client_completion_queue, client_due)
-    client_driver.start()
+        client_condition = threading.Condition()
+        client_due = set()
+        client_completion_queue = cygrpc.CompletionQueue()
+        client_driver = _QueueDriver(client_condition, client_completion_queue,
+                                     client_due)
+        client_driver.start()
 
-    with client_condition:
-      client_calls = []
-      for index in range(test_constants.RPC_CONCURRENCY):
-        client_call = channel.create_call(
-            None, _EMPTY_FLAGS, client_completion_queue, b'/twinkies', None,
-            _INFINITE_FUTURE)
-        operations = (
-            cygrpc.operation_send_initial_metadata(
-                _EMPTY_METADATA, _EMPTY_FLAGS),
-            cygrpc.operation_send_message(b'\x45\x56', _EMPTY_FLAGS),
-            cygrpc.operation_send_close_from_client(_EMPTY_FLAGS),
-            cygrpc.operation_receive_initial_metadata(_EMPTY_FLAGS),
-            cygrpc.operation_receive_message(_EMPTY_FLAGS),
-            cygrpc.operation_receive_status_on_client(_EMPTY_FLAGS),
-        )
-        tag = 'client_complete_call_{0:04d}_tag'.format(index)
-        client_call.start_client_batch(cygrpc.Operations(operations), tag)
-        client_due.add(tag)
-        client_calls.append(client_call)
+        with client_condition:
+            client_calls = []
+            for index in range(test_constants.RPC_CONCURRENCY):
+                client_call = channel.create_call(
+                    None, _EMPTY_FLAGS, client_completion_queue, b'/twinkies',
+                    None, _INFINITE_FUTURE)
+                operations = (
+                    cygrpc.operation_send_initial_metadata(_EMPTY_METADATA,
+                                                           _EMPTY_FLAGS),
+                    cygrpc.operation_send_message(b'\x45\x56', _EMPTY_FLAGS),
+                    cygrpc.operation_send_close_from_client(_EMPTY_FLAGS),
+                    cygrpc.operation_receive_initial_metadata(_EMPTY_FLAGS),
+                    cygrpc.operation_receive_message(_EMPTY_FLAGS),
+                    cygrpc.operation_receive_status_on_client(_EMPTY_FLAGS),)
+                tag = 'client_complete_call_{0:04d}_tag'.format(index)
+                client_call.start_client_batch(
+                    cygrpc.Operations(operations), tag)
+                client_due.add(tag)
+                client_calls.append(client_call)
 
-    with state.condition:
-      while True:
-        if state.parked_handlers < test_constants.THREAD_CONCURRENCY:
-          state.condition.wait()
-        elif state.handled_rpcs < test_constants.RPC_CONCURRENCY:
-          state.condition.wait()
-        else:
-          state.handlers_released = True
-          state.condition.notify_all()
-          break
+        with state.condition:
+            while True:
+                if state.parked_handlers < test_constants.THREAD_CONCURRENCY:
+                    state.condition.wait()
+                elif state.handled_rpcs < test_constants.RPC_CONCURRENCY:
+                    state.condition.wait()
+                else:
+                    state.handlers_released = True
+                    state.condition.notify_all()
+                    break
 
-    client_driver.events(
-        test_constants.RPC_CONCURRENCY * _SUCCESS_CALL_FRACTION)
-    with client_condition:
-      for client_call in client_calls:
-        client_call.cancel()
+        client_driver.events(test_constants.RPC_CONCURRENCY *
+                             _SUCCESS_CALL_FRACTION)
+        with client_condition:
+            for client_call in client_calls:
+                client_call.cancel()
 
-    with state.condition:
-      server.shutdown(server_completion_queue, _SERVER_SHUTDOWN_TAG)
+        with state.condition:
+            server.shutdown(server_completion_queue, _SERVER_SHUTDOWN_TAG)
 
 
 if __name__ == '__main__':
-  unittest.main(verbosity=2)
+    unittest.main(verbosity=2)
diff --git a/src/python/grpcio_tests/tests/unit/_cython/_channel_test.py b/src/python/grpcio_tests/tests/unit/_cython/_channel_test.py
index f9c8a3a..0ca0686 100644
--- a/src/python/grpcio_tests/tests/unit/_cython/_channel_test.py
+++ b/src/python/grpcio_tests/tests/unit/_cython/_channel_test.py
@@ -37,46 +37,49 @@
 
 
 def _channel_and_completion_queue():
-  channel = cygrpc.Channel(b'localhost:54321', cygrpc.ChannelArgs(()))
-  completion_queue = cygrpc.CompletionQueue()
-  return channel, completion_queue
+    channel = cygrpc.Channel(b'localhost:54321', cygrpc.ChannelArgs(()))
+    completion_queue = cygrpc.CompletionQueue()
+    return channel, completion_queue
 
 
 def _connectivity_loop(channel, completion_queue):
-  for _ in range(100):
-    connectivity = channel.check_connectivity_state(True)
-    channel.watch_connectivity_state(
-        connectivity, cygrpc.Timespec(time.time() + 0.2), completion_queue,
-        None)
-    completion_queue.poll(deadline=cygrpc.Timespec(float('+inf')))
+    for _ in range(100):
+        connectivity = channel.check_connectivity_state(True)
+        channel.watch_connectivity_state(connectivity,
+                                         cygrpc.Timespec(time.time() + 0.2),
+                                         completion_queue, None)
+        completion_queue.poll(deadline=cygrpc.Timespec(float('+inf')))
 
 
 def _create_loop_destroy():
-  channel, completion_queue = _channel_and_completion_queue()
-  _connectivity_loop(channel, completion_queue)
-  completion_queue.shutdown()
+    channel, completion_queue = _channel_and_completion_queue()
+    _connectivity_loop(channel, completion_queue)
+    completion_queue.shutdown()
 
 
 def _in_parallel(behavior, arguments):
-  threads = tuple(
-      threading.Thread(target=behavior, args=arguments)
-      for _ in range(test_constants.THREAD_CONCURRENCY))
-  for thread in threads:
-    thread.start()
-  for thread in threads:
-    thread.join()
+    threads = tuple(
+        threading.Thread(
+            target=behavior, args=arguments)
+        for _ in range(test_constants.THREAD_CONCURRENCY))
+    for thread in threads:
+        thread.start()
+    for thread in threads:
+        thread.join()
 
 
 class ChannelTest(unittest.TestCase):
 
-  def test_single_channel_lonely_connectivity(self):
-    channel, completion_queue = _channel_and_completion_queue()
-    _in_parallel(_connectivity_loop, (channel, completion_queue,))
-    completion_queue.shutdown()
+    def test_single_channel_lonely_connectivity(self):
+        channel, completion_queue = _channel_and_completion_queue()
+        _in_parallel(_connectivity_loop, (
+            channel,
+            completion_queue,))
+        completion_queue.shutdown()
 
-  def test_multiple_channels_lonely_connectivity(self):
-    _in_parallel(_create_loop_destroy, ())
+    def test_multiple_channels_lonely_connectivity(self):
+        _in_parallel(_create_loop_destroy, ())
 
 
 if __name__ == '__main__':
-  unittest.main(verbosity=2)
+    unittest.main(verbosity=2)
diff --git a/src/python/grpcio_tests/tests/unit/_cython/_read_some_but_not_all_responses_test.py b/src/python/grpcio_tests/tests/unit/_cython/_read_some_but_not_all_responses_test.py
index 2ae5285..9fbfcbb 100644
--- a/src/python/grpcio_tests/tests/unit/_cython/_read_some_but_not_all_responses_test.py
+++ b/src/python/grpcio_tests/tests/unit/_cython/_read_some_but_not_all_responses_test.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Test a corner-case at the level of the Cython API."""
 
 import threading
@@ -41,212 +40,221 @@
 
 class _ServerDriver(object):
 
-  def __init__(self, completion_queue, shutdown_tag):
-    self._condition = threading.Condition()
-    self._completion_queue = completion_queue
-    self._shutdown_tag = shutdown_tag
-    self._events = []
-    self._saw_shutdown_tag = False
+    def __init__(self, completion_queue, shutdown_tag):
+        self._condition = threading.Condition()
+        self._completion_queue = completion_queue
+        self._shutdown_tag = shutdown_tag
+        self._events = []
+        self._saw_shutdown_tag = False
 
-  def start(self):
-    def in_thread():
-      while True:
-        event = self._completion_queue.poll()
+    def start(self):
+
+        def in_thread():
+            while True:
+                event = self._completion_queue.poll()
+                with self._condition:
+                    self._events.append(event)
+                    self._condition.notify()
+                    if event.tag is self._shutdown_tag:
+                        self._saw_shutdown_tag = True
+                        break
+
+        thread = threading.Thread(target=in_thread)
+        thread.start()
+
+    def done(self):
         with self._condition:
-          self._events.append(event)
-          self._condition.notify()
-          if event.tag is self._shutdown_tag:
-            self._saw_shutdown_tag = True
-            break
-    thread = threading.Thread(target=in_thread)
-    thread.start()
+            return self._saw_shutdown_tag
 
-  def done(self):
-    with self._condition:
-      return self._saw_shutdown_tag
+    def first_event(self):
+        with self._condition:
+            while not self._events:
+                self._condition.wait()
+            return self._events[0]
 
-  def first_event(self):
-    with self._condition:
-      while not self._events:
-        self._condition.wait()
-      return self._events[0]
-
-  def events(self):
-    with self._condition:
-      while not self._saw_shutdown_tag:
-        self._condition.wait()
-      return tuple(self._events)
+    def events(self):
+        with self._condition:
+            while not self._saw_shutdown_tag:
+                self._condition.wait()
+            return tuple(self._events)
 
 
 class _QueueDriver(object):
 
-  def __init__(self, condition, completion_queue, due):
-    self._condition = condition
-    self._completion_queue = completion_queue
-    self._due = due
-    self._events = []
-    self._returned = False
+    def __init__(self, condition, completion_queue, due):
+        self._condition = condition
+        self._completion_queue = completion_queue
+        self._due = due
+        self._events = []
+        self._returned = False
 
-  def start(self):
-    def in_thread():
-      while True:
-        event = self._completion_queue.poll()
+    def start(self):
+
+        def in_thread():
+            while True:
+                event = self._completion_queue.poll()
+                with self._condition:
+                    self._events.append(event)
+                    self._due.remove(event.tag)
+                    self._condition.notify_all()
+                    if not self._due:
+                        self._returned = True
+                        return
+
+        thread = threading.Thread(target=in_thread)
+        thread.start()
+
+    def done(self):
         with self._condition:
-          self._events.append(event)
-          self._due.remove(event.tag)
-          self._condition.notify_all()
-          if not self._due:
-            self._returned = True
-            return
-    thread = threading.Thread(target=in_thread)
-    thread.start()
+            return self._returned
 
-  def done(self):
-    with self._condition:
-      return self._returned
+    def event_with_tag(self, tag):
+        with self._condition:
+            while True:
+                for event in self._events:
+                    if event.tag is tag:
+                        return event
+                self._condition.wait()
 
-  def event_with_tag(self, tag):
-    with self._condition:
-      while True:
-        for event in self._events:
-          if event.tag is tag:
-            return event
-        self._condition.wait()
-
-  def events(self):
-    with self._condition:
-      while not self._returned:
-        self._condition.wait()
-      return tuple(self._events)
+    def events(self):
+        with self._condition:
+            while not self._returned:
+                self._condition.wait()
+            return tuple(self._events)
 
 
 class ReadSomeButNotAllResponsesTest(unittest.TestCase):
 
-  def testReadSomeButNotAllResponses(self):
-    server_completion_queue = cygrpc.CompletionQueue()
-    server = cygrpc.Server(cygrpc.ChannelArgs([]))
-    server.register_completion_queue(server_completion_queue)
-    port = server.add_http2_port(b'[::]:0')
-    server.start()
-    channel = cygrpc.Channel('localhost:{}'.format(port).encode(),
-                             cygrpc.ChannelArgs([]))
+    def testReadSomeButNotAllResponses(self):
+        server_completion_queue = cygrpc.CompletionQueue()
+        server = cygrpc.Server(cygrpc.ChannelArgs([]))
+        server.register_completion_queue(server_completion_queue)
+        port = server.add_http2_port(b'[::]:0')
+        server.start()
+        channel = cygrpc.Channel('localhost:{}'.format(port).encode(),
+                                 cygrpc.ChannelArgs([]))
 
-    server_shutdown_tag = 'server_shutdown_tag'
-    server_driver = _ServerDriver(server_completion_queue, server_shutdown_tag)
-    server_driver.start()
+        server_shutdown_tag = 'server_shutdown_tag'
+        server_driver = _ServerDriver(server_completion_queue,
+                                      server_shutdown_tag)
+        server_driver.start()
 
-    client_condition = threading.Condition()
-    client_due = set()
-    client_completion_queue = cygrpc.CompletionQueue()
-    client_driver = _QueueDriver(
-        client_condition, client_completion_queue, client_due)
-    client_driver.start()
+        client_condition = threading.Condition()
+        client_due = set()
+        client_completion_queue = cygrpc.CompletionQueue()
+        client_driver = _QueueDriver(client_condition, client_completion_queue,
+                                     client_due)
+        client_driver.start()
 
-    server_call_condition = threading.Condition()
-    server_send_initial_metadata_tag = 'server_send_initial_metadata_tag'
-    server_send_first_message_tag = 'server_send_first_message_tag'
-    server_send_second_message_tag = 'server_send_second_message_tag'
-    server_complete_rpc_tag = 'server_complete_rpc_tag'
-    server_call_due = set((
-        server_send_initial_metadata_tag,
-        server_send_first_message_tag,
-        server_send_second_message_tag,
-        server_complete_rpc_tag,
-    ))
-    server_call_completion_queue = cygrpc.CompletionQueue()
-    server_call_driver = _QueueDriver(
-        server_call_condition, server_call_completion_queue, server_call_due)
-    server_call_driver.start()
+        server_call_condition = threading.Condition()
+        server_send_initial_metadata_tag = 'server_send_initial_metadata_tag'
+        server_send_first_message_tag = 'server_send_first_message_tag'
+        server_send_second_message_tag = 'server_send_second_message_tag'
+        server_complete_rpc_tag = 'server_complete_rpc_tag'
+        server_call_due = set((
+            server_send_initial_metadata_tag,
+            server_send_first_message_tag,
+            server_send_second_message_tag,
+            server_complete_rpc_tag,))
+        server_call_completion_queue = cygrpc.CompletionQueue()
+        server_call_driver = _QueueDriver(server_call_condition,
+                                          server_call_completion_queue,
+                                          server_call_due)
+        server_call_driver.start()
 
-    server_rpc_tag = 'server_rpc_tag'
-    request_call_result = server.request_call(
-        server_call_completion_queue, server_completion_queue, server_rpc_tag)
+        server_rpc_tag = 'server_rpc_tag'
+        request_call_result = server.request_call(server_call_completion_queue,
+                                                  server_completion_queue,
+                                                  server_rpc_tag)
 
-    client_call = channel.create_call(
-        None, _EMPTY_FLAGS, client_completion_queue, b'/twinkies', None,
-        _INFINITE_FUTURE)
-    client_receive_initial_metadata_tag = 'client_receive_initial_metadata_tag'
-    client_complete_rpc_tag = 'client_complete_rpc_tag'
-    with client_condition:
-      client_receive_initial_metadata_start_batch_result = (
-          client_call.start_client_batch(cygrpc.Operations([
-              cygrpc.operation_receive_initial_metadata(_EMPTY_FLAGS),
-          ]), client_receive_initial_metadata_tag))
-      client_due.add(client_receive_initial_metadata_tag)
-      client_complete_rpc_start_batch_result = (
-          client_call.start_client_batch(cygrpc.Operations([
-              cygrpc.operation_send_initial_metadata(
-                  _EMPTY_METADATA, _EMPTY_FLAGS),
-              cygrpc.operation_send_close_from_client(_EMPTY_FLAGS),
-              cygrpc.operation_receive_status_on_client(_EMPTY_FLAGS),
-          ]), client_complete_rpc_tag))
-      client_due.add(client_complete_rpc_tag)
+        client_call = channel.create_call(None, _EMPTY_FLAGS,
+                                          client_completion_queue, b'/twinkies',
+                                          None, _INFINITE_FUTURE)
+        client_receive_initial_metadata_tag = 'client_receive_initial_metadata_tag'
+        client_complete_rpc_tag = 'client_complete_rpc_tag'
+        with client_condition:
+            client_receive_initial_metadata_start_batch_result = (
+                client_call.start_client_batch(
+                    cygrpc.Operations([
+                        cygrpc.operation_receive_initial_metadata(_EMPTY_FLAGS),
+                    ]), client_receive_initial_metadata_tag))
+            client_due.add(client_receive_initial_metadata_tag)
+            client_complete_rpc_start_batch_result = (
+                client_call.start_client_batch(
+                    cygrpc.Operations([
+                        cygrpc.operation_send_initial_metadata(_EMPTY_METADATA,
+                                                               _EMPTY_FLAGS),
+                        cygrpc.operation_send_close_from_client(_EMPTY_FLAGS),
+                        cygrpc.operation_receive_status_on_client(_EMPTY_FLAGS),
+                    ]), client_complete_rpc_tag))
+            client_due.add(client_complete_rpc_tag)
 
-    server_rpc_event = server_driver.first_event()
+        server_rpc_event = server_driver.first_event()
 
-    with server_call_condition:
-      server_send_initial_metadata_start_batch_result = (
-          server_rpc_event.operation_call.start_server_batch([
-              cygrpc.operation_send_initial_metadata(
-                  _EMPTY_METADATA, _EMPTY_FLAGS),
-          ], server_send_initial_metadata_tag))
-      server_send_first_message_start_batch_result = (
-          server_rpc_event.operation_call.start_server_batch([
-              cygrpc.operation_send_message(b'\x07', _EMPTY_FLAGS),
-          ], server_send_first_message_tag))
-    server_send_initial_metadata_event = server_call_driver.event_with_tag(
-        server_send_initial_metadata_tag)
-    server_send_first_message_event = server_call_driver.event_with_tag(
-        server_send_first_message_tag)
-    with server_call_condition:
-      server_send_second_message_start_batch_result = (
-          server_rpc_event.operation_call.start_server_batch([
-              cygrpc.operation_send_message(b'\x07', _EMPTY_FLAGS),
-          ], server_send_second_message_tag))
-      server_complete_rpc_start_batch_result = (
-          server_rpc_event.operation_call.start_server_batch([
-              cygrpc.operation_receive_close_on_server(_EMPTY_FLAGS),
-              cygrpc.operation_send_status_from_server(
-                  cygrpc.Metadata(()), cygrpc.StatusCode.ok, b'test details',
-                  _EMPTY_FLAGS),
-          ], server_complete_rpc_tag))
-    server_send_second_message_event = server_call_driver.event_with_tag(
-        server_send_second_message_tag)
-    server_complete_rpc_event = server_call_driver.event_with_tag(
-        server_complete_rpc_tag)
-    server_call_driver.events()
+        with server_call_condition:
+            server_send_initial_metadata_start_batch_result = (
+                server_rpc_event.operation_call.start_server_batch([
+                    cygrpc.operation_send_initial_metadata(_EMPTY_METADATA,
+                                                           _EMPTY_FLAGS),
+                ], server_send_initial_metadata_tag))
+            server_send_first_message_start_batch_result = (
+                server_rpc_event.operation_call.start_server_batch([
+                    cygrpc.operation_send_message(b'\x07', _EMPTY_FLAGS),
+                ], server_send_first_message_tag))
+        server_send_initial_metadata_event = server_call_driver.event_with_tag(
+            server_send_initial_metadata_tag)
+        server_send_first_message_event = server_call_driver.event_with_tag(
+            server_send_first_message_tag)
+        with server_call_condition:
+            server_send_second_message_start_batch_result = (
+                server_rpc_event.operation_call.start_server_batch([
+                    cygrpc.operation_send_message(b'\x07', _EMPTY_FLAGS),
+                ], server_send_second_message_tag))
+            server_complete_rpc_start_batch_result = (
+                server_rpc_event.operation_call.start_server_batch([
+                    cygrpc.operation_receive_close_on_server(_EMPTY_FLAGS),
+                    cygrpc.operation_send_status_from_server(
+                        cygrpc.Metadata(()), cygrpc.StatusCode.ok,
+                        b'test details', _EMPTY_FLAGS),
+                ], server_complete_rpc_tag))
+        server_send_second_message_event = server_call_driver.event_with_tag(
+            server_send_second_message_tag)
+        server_complete_rpc_event = server_call_driver.event_with_tag(
+            server_complete_rpc_tag)
+        server_call_driver.events()
 
-    with client_condition:
-      client_receive_first_message_tag = 'client_receive_first_message_tag'
-      client_receive_first_message_start_batch_result = (
-          client_call.start_client_batch(cygrpc.Operations([
-              cygrpc.operation_receive_message(_EMPTY_FLAGS),
-          ]), client_receive_first_message_tag))
-      client_due.add(client_receive_first_message_tag)
-    client_receive_first_message_event = client_driver.event_with_tag(
-        client_receive_first_message_tag)
+        with client_condition:
+            client_receive_first_message_tag = 'client_receive_first_message_tag'
+            client_receive_first_message_start_batch_result = (
+                client_call.start_client_batch(
+                    cygrpc.Operations([
+                        cygrpc.operation_receive_message(_EMPTY_FLAGS),
+                    ]), client_receive_first_message_tag))
+            client_due.add(client_receive_first_message_tag)
+        client_receive_first_message_event = client_driver.event_with_tag(
+            client_receive_first_message_tag)
 
-    client_call_cancel_result = client_call.cancel()
-    client_driver.events()
+        client_call_cancel_result = client_call.cancel()
+        client_driver.events()
 
-    server.shutdown(server_completion_queue, server_shutdown_tag)
-    server.cancel_all_calls()
-    server_driver.events()
+        server.shutdown(server_completion_queue, server_shutdown_tag)
+        server.cancel_all_calls()
+        server_driver.events()
 
-    self.assertEqual(cygrpc.CallError.ok, request_call_result)
-    self.assertEqual(
-        cygrpc.CallError.ok, server_send_initial_metadata_start_batch_result)
-    self.assertEqual(
-        cygrpc.CallError.ok, client_receive_initial_metadata_start_batch_result)
-    self.assertEqual(
-        cygrpc.CallError.ok, client_complete_rpc_start_batch_result)
-    self.assertEqual(cygrpc.CallError.ok, client_call_cancel_result)
-    self.assertIs(server_rpc_tag, server_rpc_event.tag)
-    self.assertEqual(
-        cygrpc.CompletionType.operation_complete, server_rpc_event.type)
-    self.assertIsInstance(server_rpc_event.operation_call, cygrpc.Call)
-    self.assertEqual(0, len(server_rpc_event.batch_operations))
+        self.assertEqual(cygrpc.CallError.ok, request_call_result)
+        self.assertEqual(cygrpc.CallError.ok,
+                         server_send_initial_metadata_start_batch_result)
+        self.assertEqual(cygrpc.CallError.ok,
+                         client_receive_initial_metadata_start_batch_result)
+        self.assertEqual(cygrpc.CallError.ok,
+                         client_complete_rpc_start_batch_result)
+        self.assertEqual(cygrpc.CallError.ok, client_call_cancel_result)
+        self.assertIs(server_rpc_tag, server_rpc_event.tag)
+        self.assertEqual(cygrpc.CompletionType.operation_complete,
+                         server_rpc_event.type)
+        self.assertIsInstance(server_rpc_event.operation_call, cygrpc.Call)
+        self.assertEqual(0, len(server_rpc_event.batch_operations))
 
 
 if __name__ == '__main__':
-  unittest.main(verbosity=2)
+    unittest.main(verbosity=2)
diff --git a/src/python/grpcio_tests/tests/unit/_cython/cygrpc_test.py b/src/python/grpcio_tests/tests/unit/_cython/cygrpc_test.py
index 8dedebf..b4efe87 100644
--- a/src/python/grpcio_tests/tests/unit/_cython/cygrpc_test.py
+++ b/src/python/grpcio_tests/tests/unit/_cython/cygrpc_test.py
@@ -37,399 +37,431 @@
 from tests.unit import test_common
 from tests.unit import resources
 
-
 _SSL_HOST_OVERRIDE = b'foo.test.google.fr'
 _CALL_CREDENTIALS_METADATA_KEY = 'call-creds-key'
 _CALL_CREDENTIALS_METADATA_VALUE = 'call-creds-value'
 _EMPTY_FLAGS = 0
 
+
 def _metadata_plugin_callback(context, callback):
-  callback(cygrpc.Metadata(
-      [cygrpc.Metadatum(_CALL_CREDENTIALS_METADATA_KEY,
-                        _CALL_CREDENTIALS_METADATA_VALUE)]),
-      cygrpc.StatusCode.ok, b'')
+    callback(
+        cygrpc.Metadata([
+            cygrpc.Metadatum(_CALL_CREDENTIALS_METADATA_KEY,
+                             _CALL_CREDENTIALS_METADATA_VALUE)
+        ]), cygrpc.StatusCode.ok, b'')
 
 
 class TypeSmokeTest(unittest.TestCase):
 
-  def testStringsInUtilitiesUpDown(self):
-    self.assertEqual(0, cygrpc.StatusCode.ok)
-    metadatum = cygrpc.Metadatum(b'a', b'b')
-    self.assertEqual(b'a', metadatum.key)
-    self.assertEqual(b'b', metadatum.value)
-    metadata = cygrpc.Metadata([metadatum])
-    self.assertEqual(1, len(metadata))
-    self.assertEqual(metadatum.key, metadata[0].key)
+    def testStringsInUtilitiesUpDown(self):
+        self.assertEqual(0, cygrpc.StatusCode.ok)
+        metadatum = cygrpc.Metadatum(b'a', b'b')
+        self.assertEqual(b'a', metadatum.key)
+        self.assertEqual(b'b', metadatum.value)
+        metadata = cygrpc.Metadata([metadatum])
+        self.assertEqual(1, len(metadata))
+        self.assertEqual(metadatum.key, metadata[0].key)
 
-  def testMetadataIteration(self):
-    metadata = cygrpc.Metadata([
-        cygrpc.Metadatum(b'a', b'b'), cygrpc.Metadatum(b'c', b'd')])
-    iterator = iter(metadata)
-    metadatum = next(iterator)
-    self.assertIsInstance(metadatum, cygrpc.Metadatum)
-    self.assertEqual(metadatum.key, b'a')
-    self.assertEqual(metadatum.value, b'b')
-    metadatum = next(iterator)
-    self.assertIsInstance(metadatum, cygrpc.Metadatum)
-    self.assertEqual(metadatum.key, b'c')
-    self.assertEqual(metadatum.value, b'd')
-    with self.assertRaises(StopIteration):
-      next(iterator)
+    def testMetadataIteration(self):
+        metadata = cygrpc.Metadata(
+            [cygrpc.Metadatum(b'a', b'b'), cygrpc.Metadatum(b'c', b'd')])
+        iterator = iter(metadata)
+        metadatum = next(iterator)
+        self.assertIsInstance(metadatum, cygrpc.Metadatum)
+        self.assertEqual(metadatum.key, b'a')
+        self.assertEqual(metadatum.value, b'b')
+        metadatum = next(iterator)
+        self.assertIsInstance(metadatum, cygrpc.Metadatum)
+        self.assertEqual(metadatum.key, b'c')
+        self.assertEqual(metadatum.value, b'd')
+        with self.assertRaises(StopIteration):
+            next(iterator)
 
-  def testOperationsIteration(self):
-    operations = cygrpc.Operations([
-        cygrpc.operation_send_message(b'asdf', _EMPTY_FLAGS)])
-    iterator = iter(operations)
-    operation = next(iterator)
-    self.assertIsInstance(operation, cygrpc.Operation)
-    # `Operation`s are write-only structures; can't directly debug anything out
-    # of them. Just check that we stop iterating.
-    with self.assertRaises(StopIteration):
-      next(iterator)
+    def testOperationsIteration(self):
+        operations = cygrpc.Operations(
+            [cygrpc.operation_send_message(b'asdf', _EMPTY_FLAGS)])
+        iterator = iter(operations)
+        operation = next(iterator)
+        self.assertIsInstance(operation, cygrpc.Operation)
+        # `Operation`s are write-only structures; can't directly debug anything out
+        # of them. Just check that we stop iterating.
+        with self.assertRaises(StopIteration):
+            next(iterator)
 
-  def testOperationFlags(self):
-    operation = cygrpc.operation_send_message(b'asdf',
-                                              cygrpc.WriteFlag.no_compress)
-    self.assertEqual(cygrpc.WriteFlag.no_compress, operation.flags)
+    def testOperationFlags(self):
+        operation = cygrpc.operation_send_message(b'asdf',
+                                                  cygrpc.WriteFlag.no_compress)
+        self.assertEqual(cygrpc.WriteFlag.no_compress, operation.flags)
 
-  def testTimespec(self):
-    now = time.time()
-    timespec = cygrpc.Timespec(now)
-    self.assertAlmostEqual(now, float(timespec), places=8)
+    def testTimespec(self):
+        now = time.time()
+        now_timespec_a = cygrpc.Timespec(now)
+        now_timespec_b = cygrpc.Timespec(now)
+        self.assertAlmostEqual(now, float(now_timespec_a), places=8)
+        self.assertEqual(now_timespec_a, now_timespec_b)
+        self.assertLess(cygrpc.Timespec(now - 1), cygrpc.Timespec(now))
+        self.assertGreater(cygrpc.Timespec(now + 1), cygrpc.Timespec(now))
+        self.assertGreaterEqual(cygrpc.Timespec(now + 1), cygrpc.Timespec(now))
+        self.assertGreaterEqual(cygrpc.Timespec(now), cygrpc.Timespec(now))
+        self.assertLessEqual(cygrpc.Timespec(now - 1), cygrpc.Timespec(now))
+        self.assertLessEqual(cygrpc.Timespec(now), cygrpc.Timespec(now))
+        self.assertNotEqual(cygrpc.Timespec(now - 1), cygrpc.Timespec(now))
+        self.assertNotEqual(cygrpc.Timespec(now + 1), cygrpc.Timespec(now))
 
-  def testCompletionQueueUpDown(self):
-    completion_queue = cygrpc.CompletionQueue()
-    del completion_queue
+    def testCompletionQueueUpDown(self):
+        completion_queue = cygrpc.CompletionQueue()
+        del completion_queue
 
-  def testServerUpDown(self):
-    server = cygrpc.Server(cygrpc.ChannelArgs([]))
-    del server
+    def testServerUpDown(self):
+        server = cygrpc.Server(cygrpc.ChannelArgs([]))
+        del server
 
-  def testChannelUpDown(self):
-    channel = cygrpc.Channel(b'[::]:0', cygrpc.ChannelArgs([]))
-    del channel
+    def testChannelUpDown(self):
+        channel = cygrpc.Channel(b'[::]:0', cygrpc.ChannelArgs([]))
+        del channel
 
-  def testCredentialsMetadataPluginUpDown(self):
-    plugin = cygrpc.CredentialsMetadataPlugin(
-        lambda ignored_a, ignored_b: None, b'')
-    del plugin
+    def testCredentialsMetadataPluginUpDown(self):
+        plugin = cygrpc.CredentialsMetadataPlugin(
+            lambda ignored_a, ignored_b: None, b'')
+        del plugin
 
-  def testCallCredentialsFromPluginUpDown(self):
-    plugin = cygrpc.CredentialsMetadataPlugin(_metadata_plugin_callback, b'')
-    call_credentials = cygrpc.call_credentials_metadata_plugin(plugin)
-    del plugin
-    del call_credentials
+    def testCallCredentialsFromPluginUpDown(self):
+        plugin = cygrpc.CredentialsMetadataPlugin(_metadata_plugin_callback,
+                                                  b'')
+        call_credentials = cygrpc.call_credentials_metadata_plugin(plugin)
+        del plugin
+        del call_credentials
 
-  def testServerStartNoExplicitShutdown(self):
-    server = cygrpc.Server(cygrpc.ChannelArgs([]))
-    completion_queue = cygrpc.CompletionQueue()
-    server.register_completion_queue(completion_queue)
-    port = server.add_http2_port(b'[::]:0')
-    self.assertIsInstance(port, int)
-    server.start()
-    del server
+    def testServerStartNoExplicitShutdown(self):
+        server = cygrpc.Server(cygrpc.ChannelArgs([]))
+        completion_queue = cygrpc.CompletionQueue()
+        server.register_completion_queue(completion_queue)
+        port = server.add_http2_port(b'[::]:0')
+        self.assertIsInstance(port, int)
+        server.start()
+        del server
 
-  def testServerStartShutdown(self):
-    completion_queue = cygrpc.CompletionQueue()
-    server = cygrpc.Server(cygrpc.ChannelArgs([]))
-    server.add_http2_port(b'[::]:0')
-    server.register_completion_queue(completion_queue)
-    server.start()
-    shutdown_tag = object()
-    server.shutdown(completion_queue, shutdown_tag)
-    event = completion_queue.poll()
-    self.assertEqual(cygrpc.CompletionType.operation_complete, event.type)
-    self.assertIs(shutdown_tag, event.tag)
-    del server
-    del completion_queue
+    def testServerStartShutdown(self):
+        completion_queue = cygrpc.CompletionQueue()
+        server = cygrpc.Server(cygrpc.ChannelArgs([]))
+        server.add_http2_port(b'[::]:0')
+        server.register_completion_queue(completion_queue)
+        server.start()
+        shutdown_tag = object()
+        server.shutdown(completion_queue, shutdown_tag)
+        event = completion_queue.poll()
+        self.assertEqual(cygrpc.CompletionType.operation_complete, event.type)
+        self.assertIs(shutdown_tag, event.tag)
+        del server
+        del completion_queue
 
 
 class ServerClientMixin(object):
 
-  def setUpMixin(self, server_credentials, client_credentials, host_override):
-    self.server_completion_queue = cygrpc.CompletionQueue()
-    self.server = cygrpc.Server(cygrpc.ChannelArgs([]))
-    self.server.register_completion_queue(self.server_completion_queue)
-    if server_credentials:
-      self.port = self.server.add_http2_port(b'[::]:0', server_credentials)
-    else:
-      self.port = self.server.add_http2_port(b'[::]:0')
-    self.server.start()
-    self.client_completion_queue = cygrpc.CompletionQueue()
-    if client_credentials:
-      client_channel_arguments = cygrpc.ChannelArgs([
-          cygrpc.ChannelArg(cygrpc.ChannelArgKey.ssl_target_name_override,
-                            host_override)])
-      self.client_channel = cygrpc.Channel(
-          'localhost:{}'.format(self.port).encode(), client_channel_arguments,
-          client_credentials)
-    else:
-      self.client_channel = cygrpc.Channel(
-          'localhost:{}'.format(self.port).encode(), cygrpc.ChannelArgs([]))
-    if host_override:
-      self.host_argument = None  # default host
-      self.expected_host = host_override
-    else:
-      # arbitrary host name necessitating no further identification
-      self.host_argument = b'hostess'
-      self.expected_host = self.host_argument
+    def setUpMixin(self, server_credentials, client_credentials, host_override):
+        self.server_completion_queue = cygrpc.CompletionQueue()
+        self.server = cygrpc.Server(cygrpc.ChannelArgs([]))
+        self.server.register_completion_queue(self.server_completion_queue)
+        if server_credentials:
+            self.port = self.server.add_http2_port(b'[::]:0',
+                                                   server_credentials)
+        else:
+            self.port = self.server.add_http2_port(b'[::]:0')
+        self.server.start()
+        self.client_completion_queue = cygrpc.CompletionQueue()
+        if client_credentials:
+            client_channel_arguments = cygrpc.ChannelArgs([
+                cygrpc.ChannelArg(cygrpc.ChannelArgKey.ssl_target_name_override,
+                                  host_override)
+            ])
+            self.client_channel = cygrpc.Channel(
+                'localhost:{}'.format(self.port).encode(),
+                client_channel_arguments, client_credentials)
+        else:
+            self.client_channel = cygrpc.Channel(
+                'localhost:{}'.format(self.port).encode(),
+                cygrpc.ChannelArgs([]))
+        if host_override:
+            self.host_argument = None  # default host
+            self.expected_host = host_override
+        else:
+            # arbitrary host name necessitating no further identification
+            self.host_argument = b'hostess'
+            self.expected_host = self.host_argument
 
-  def tearDownMixin(self):
-    del self.server
-    del self.client_completion_queue
-    del self.server_completion_queue
+    def tearDownMixin(self):
+        del self.server
+        del self.client_completion_queue
+        del self.server_completion_queue
 
-  def _perform_operations(self, operations, call, queue, deadline, description):
-    """Perform the list of operations with given call, queue, and deadline.
+    def _perform_operations(self, operations, call, queue, deadline,
+                            description):
+        """Perform the list of operations with given call, queue, and deadline.
 
     Invocation errors are reported with as an exception with `description` in
     the message. Performs the operations asynchronously, returning a future.
     """
-    def performer():
-      tag = object()
-      try:
-        call_result = call.start_client_batch(
-            cygrpc.Operations(operations), tag)
-        self.assertEqual(cygrpc.CallError.ok, call_result)
-        event = queue.poll(deadline)
-        self.assertEqual(cygrpc.CompletionType.operation_complete, event.type)
-        self.assertTrue(event.success)
-        self.assertIs(tag, event.tag)
-      except Exception as error:
-        raise Exception("Error in '{}': {}".format(description, error.message))
-      return event
-    return test_utilities.SimpleFuture(performer)
 
-  def testEcho(self):
-    DEADLINE = time.time()+5
-    DEADLINE_TOLERANCE = 0.25
-    CLIENT_METADATA_ASCII_KEY = b'key'
-    CLIENT_METADATA_ASCII_VALUE = b'val'
-    CLIENT_METADATA_BIN_KEY = b'key-bin'
-    CLIENT_METADATA_BIN_VALUE = b'\0'*1000
-    SERVER_INITIAL_METADATA_KEY = b'init_me_me_me'
-    SERVER_INITIAL_METADATA_VALUE = b'whodawha?'
-    SERVER_TRAILING_METADATA_KEY = b'california_is_in_a_drought'
-    SERVER_TRAILING_METADATA_VALUE = b'zomg it is'
-    SERVER_STATUS_CODE = cygrpc.StatusCode.ok
-    SERVER_STATUS_DETAILS = b'our work is never over'
-    REQUEST = b'in death a member of project mayhem has a name'
-    RESPONSE = b'his name is robert paulson'
-    METHOD = b'twinkies'
+        def performer():
+            tag = object()
+            try:
+                call_result = call.start_client_batch(
+                    cygrpc.Operations(operations), tag)
+                self.assertEqual(cygrpc.CallError.ok, call_result)
+                event = queue.poll(deadline)
+                self.assertEqual(cygrpc.CompletionType.operation_complete,
+                                 event.type)
+                self.assertTrue(event.success)
+                self.assertIs(tag, event.tag)
+            except Exception as error:
+                raise Exception(
+                    "Error in '{}': {}".format(description, error.message))
+            return event
 
-    cygrpc_deadline = cygrpc.Timespec(DEADLINE)
+        return test_utilities.SimpleFuture(performer)
 
-    server_request_tag = object()
-    request_call_result = self.server.request_call(
-        self.server_completion_queue, self.server_completion_queue,
-        server_request_tag)
+    def testEcho(self):
+        DEADLINE = time.time() + 5
+        DEADLINE_TOLERANCE = 0.25
+        CLIENT_METADATA_ASCII_KEY = b'key'
+        CLIENT_METADATA_ASCII_VALUE = b'val'
+        CLIENT_METADATA_BIN_KEY = b'key-bin'
+        CLIENT_METADATA_BIN_VALUE = b'\0' * 1000
+        SERVER_INITIAL_METADATA_KEY = b'init_me_me_me'
+        SERVER_INITIAL_METADATA_VALUE = b'whodawha?'
+        SERVER_TRAILING_METADATA_KEY = b'california_is_in_a_drought'
+        SERVER_TRAILING_METADATA_VALUE = b'zomg it is'
+        SERVER_STATUS_CODE = cygrpc.StatusCode.ok
+        SERVER_STATUS_DETAILS = b'our work is never over'
+        REQUEST = b'in death a member of project mayhem has a name'
+        RESPONSE = b'his name is robert paulson'
+        METHOD = b'twinkies'
 
-    self.assertEqual(cygrpc.CallError.ok, request_call_result)
+        cygrpc_deadline = cygrpc.Timespec(DEADLINE)
 
-    client_call_tag = object()
-    client_call = self.client_channel.create_call(
-        None, 0, self.client_completion_queue, METHOD, self.host_argument,
-        cygrpc_deadline)
-    client_initial_metadata = cygrpc.Metadata([
-        cygrpc.Metadatum(CLIENT_METADATA_ASCII_KEY,
-                         CLIENT_METADATA_ASCII_VALUE),
-        cygrpc.Metadatum(CLIENT_METADATA_BIN_KEY, CLIENT_METADATA_BIN_VALUE)])
-    client_start_batch_result = client_call.start_client_batch([
-        cygrpc.operation_send_initial_metadata(client_initial_metadata,
-                                               _EMPTY_FLAGS),
-        cygrpc.operation_send_message(REQUEST, _EMPTY_FLAGS),
-        cygrpc.operation_send_close_from_client(_EMPTY_FLAGS),
-        cygrpc.operation_receive_initial_metadata(_EMPTY_FLAGS),
-        cygrpc.operation_receive_message(_EMPTY_FLAGS),
-        cygrpc.operation_receive_status_on_client(_EMPTY_FLAGS)
-    ], client_call_tag)
-    self.assertEqual(cygrpc.CallError.ok, client_start_batch_result)
-    client_event_future = test_utilities.CompletionQueuePollFuture(
-        self.client_completion_queue, cygrpc_deadline)
+        server_request_tag = object()
+        request_call_result = self.server.request_call(
+            self.server_completion_queue, self.server_completion_queue,
+            server_request_tag)
 
-    request_event = self.server_completion_queue.poll(cygrpc_deadline)
-    self.assertEqual(cygrpc.CompletionType.operation_complete,
-                      request_event.type)
-    self.assertIsInstance(request_event.operation_call, cygrpc.Call)
-    self.assertIs(server_request_tag, request_event.tag)
-    self.assertEqual(0, len(request_event.batch_operations))
-    self.assertTrue(
-        test_common.metadata_transmitted(client_initial_metadata,
-                                         request_event.request_metadata))
-    self.assertEqual(METHOD, request_event.request_call_details.method)
-    self.assertEqual(self.expected_host,
-                     request_event.request_call_details.host)
-    self.assertLess(
-        abs(DEADLINE - float(request_event.request_call_details.deadline)),
-        DEADLINE_TOLERANCE)
+        self.assertEqual(cygrpc.CallError.ok, request_call_result)
 
-    server_call_tag = object()
-    server_call = request_event.operation_call
-    server_initial_metadata = cygrpc.Metadata([
-        cygrpc.Metadatum(SERVER_INITIAL_METADATA_KEY,
-                         SERVER_INITIAL_METADATA_VALUE)])
-    server_trailing_metadata = cygrpc.Metadata([
-        cygrpc.Metadatum(SERVER_TRAILING_METADATA_KEY,
-                         SERVER_TRAILING_METADATA_VALUE)])
-    server_start_batch_result = server_call.start_server_batch([
-        cygrpc.operation_send_initial_metadata(server_initial_metadata,
-                                               _EMPTY_FLAGS),
-        cygrpc.operation_receive_message(_EMPTY_FLAGS),
-        cygrpc.operation_send_message(RESPONSE, _EMPTY_FLAGS),
-        cygrpc.operation_receive_close_on_server(_EMPTY_FLAGS),
-        cygrpc.operation_send_status_from_server(
-            server_trailing_metadata, SERVER_STATUS_CODE,
-            SERVER_STATUS_DETAILS, _EMPTY_FLAGS)
-    ], server_call_tag)
-    self.assertEqual(cygrpc.CallError.ok, server_start_batch_result)
+        client_call_tag = object()
+        client_call = self.client_channel.create_call(
+            None, 0, self.client_completion_queue, METHOD, self.host_argument,
+            cygrpc_deadline)
+        client_initial_metadata = cygrpc.Metadata([
+            cygrpc.Metadatum(CLIENT_METADATA_ASCII_KEY,
+                             CLIENT_METADATA_ASCII_VALUE),
+            cygrpc.Metadatum(CLIENT_METADATA_BIN_KEY, CLIENT_METADATA_BIN_VALUE)
+        ])
+        client_start_batch_result = client_call.start_client_batch([
+            cygrpc.operation_send_initial_metadata(client_initial_metadata,
+                                                   _EMPTY_FLAGS),
+            cygrpc.operation_send_message(REQUEST, _EMPTY_FLAGS),
+            cygrpc.operation_send_close_from_client(_EMPTY_FLAGS),
+            cygrpc.operation_receive_initial_metadata(_EMPTY_FLAGS),
+            cygrpc.operation_receive_message(_EMPTY_FLAGS),
+            cygrpc.operation_receive_status_on_client(_EMPTY_FLAGS)
+        ], client_call_tag)
+        self.assertEqual(cygrpc.CallError.ok, client_start_batch_result)
+        client_event_future = test_utilities.CompletionQueuePollFuture(
+            self.client_completion_queue, cygrpc_deadline)
 
-    server_event = self.server_completion_queue.poll(cygrpc_deadline)
-    client_event = client_event_future.result()
-
-    self.assertEqual(6, len(client_event.batch_operations))
-    found_client_op_types = set()
-    for client_result in client_event.batch_operations:
-      # we expect each op type to be unique
-      self.assertNotIn(client_result.type, found_client_op_types)
-      found_client_op_types.add(client_result.type)
-      if client_result.type == cygrpc.OperationType.receive_initial_metadata:
+        request_event = self.server_completion_queue.poll(cygrpc_deadline)
+        self.assertEqual(cygrpc.CompletionType.operation_complete,
+                         request_event.type)
+        self.assertIsInstance(request_event.operation_call, cygrpc.Call)
+        self.assertIs(server_request_tag, request_event.tag)
+        self.assertEqual(0, len(request_event.batch_operations))
         self.assertTrue(
-            test_common.metadata_transmitted(server_initial_metadata,
-                                             client_result.received_metadata))
-      elif client_result.type == cygrpc.OperationType.receive_message:
-        self.assertEqual(RESPONSE, client_result.received_message.bytes())
-      elif client_result.type == cygrpc.OperationType.receive_status_on_client:
-        self.assertTrue(
-            test_common.metadata_transmitted(server_trailing_metadata,
-                                             client_result.received_metadata))
-        self.assertEqual(SERVER_STATUS_DETAILS,
-                         client_result.received_status_details)
-        self.assertEqual(SERVER_STATUS_CODE, client_result.received_status_code)
-    self.assertEqual(set([
-          cygrpc.OperationType.send_initial_metadata,
-          cygrpc.OperationType.send_message,
-          cygrpc.OperationType.send_close_from_client,
-          cygrpc.OperationType.receive_initial_metadata,
-          cygrpc.OperationType.receive_message,
-          cygrpc.OperationType.receive_status_on_client
-      ]), found_client_op_types)
+            test_common.metadata_transmitted(client_initial_metadata,
+                                             request_event.request_metadata))
+        self.assertEqual(METHOD, request_event.request_call_details.method)
+        self.assertEqual(self.expected_host,
+                         request_event.request_call_details.host)
+        self.assertLess(
+            abs(DEADLINE - float(request_event.request_call_details.deadline)),
+            DEADLINE_TOLERANCE)
 
-    self.assertEqual(5, len(server_event.batch_operations))
-    found_server_op_types = set()
-    for server_result in server_event.batch_operations:
-      self.assertNotIn(client_result.type, found_server_op_types)
-      found_server_op_types.add(server_result.type)
-      if server_result.type == cygrpc.OperationType.receive_message:
-        self.assertEqual(REQUEST, server_result.received_message.bytes())
-      elif server_result.type == cygrpc.OperationType.receive_close_on_server:
-        self.assertFalse(server_result.received_cancelled)
-    self.assertEqual(set([
-          cygrpc.OperationType.send_initial_metadata,
-          cygrpc.OperationType.receive_message,
-          cygrpc.OperationType.send_message,
-          cygrpc.OperationType.receive_close_on_server,
-          cygrpc.OperationType.send_status_from_server
-      ]), found_server_op_types)
+        server_call_tag = object()
+        server_call = request_event.operation_call
+        server_initial_metadata = cygrpc.Metadata([
+            cygrpc.Metadatum(SERVER_INITIAL_METADATA_KEY,
+                             SERVER_INITIAL_METADATA_VALUE)
+        ])
+        server_trailing_metadata = cygrpc.Metadata([
+            cygrpc.Metadatum(SERVER_TRAILING_METADATA_KEY,
+                             SERVER_TRAILING_METADATA_VALUE)
+        ])
+        server_start_batch_result = server_call.start_server_batch([
+            cygrpc.operation_send_initial_metadata(
+                server_initial_metadata,
+                _EMPTY_FLAGS), cygrpc.operation_receive_message(_EMPTY_FLAGS),
+            cygrpc.operation_send_message(RESPONSE, _EMPTY_FLAGS),
+            cygrpc.operation_receive_close_on_server(_EMPTY_FLAGS),
+            cygrpc.operation_send_status_from_server(
+                server_trailing_metadata, SERVER_STATUS_CODE,
+                SERVER_STATUS_DETAILS, _EMPTY_FLAGS)
+        ], server_call_tag)
+        self.assertEqual(cygrpc.CallError.ok, server_start_batch_result)
 
-    del client_call
-    del server_call
+        server_event = self.server_completion_queue.poll(cygrpc_deadline)
+        client_event = client_event_future.result()
 
-  def test6522(self):
-    DEADLINE = time.time()+5
-    DEADLINE_TOLERANCE = 0.25
-    METHOD = b'twinkies'
+        self.assertEqual(6, len(client_event.batch_operations))
+        found_client_op_types = set()
+        for client_result in client_event.batch_operations:
+            # we expect each op type to be unique
+            self.assertNotIn(client_result.type, found_client_op_types)
+            found_client_op_types.add(client_result.type)
+            if client_result.type == cygrpc.OperationType.receive_initial_metadata:
+                self.assertTrue(
+                    test_common.metadata_transmitted(
+                        server_initial_metadata,
+                        client_result.received_metadata))
+            elif client_result.type == cygrpc.OperationType.receive_message:
+                self.assertEqual(RESPONSE,
+                                 client_result.received_message.bytes())
+            elif client_result.type == cygrpc.OperationType.receive_status_on_client:
+                self.assertTrue(
+                    test_common.metadata_transmitted(
+                        server_trailing_metadata,
+                        client_result.received_metadata))
+                self.assertEqual(SERVER_STATUS_DETAILS,
+                                 client_result.received_status_details)
+                self.assertEqual(SERVER_STATUS_CODE,
+                                 client_result.received_status_code)
+        self.assertEqual(
+            set([
+                cygrpc.OperationType.send_initial_metadata,
+                cygrpc.OperationType.send_message,
+                cygrpc.OperationType.send_close_from_client,
+                cygrpc.OperationType.receive_initial_metadata,
+                cygrpc.OperationType.receive_message,
+                cygrpc.OperationType.receive_status_on_client
+            ]), found_client_op_types)
 
-    cygrpc_deadline = cygrpc.Timespec(DEADLINE)
-    empty_metadata = cygrpc.Metadata([])
+        self.assertEqual(5, len(server_event.batch_operations))
+        found_server_op_types = set()
+        for server_result in server_event.batch_operations:
+            self.assertNotIn(client_result.type, found_server_op_types)
+            found_server_op_types.add(server_result.type)
+            if server_result.type == cygrpc.OperationType.receive_message:
+                self.assertEqual(REQUEST,
+                                 server_result.received_message.bytes())
+            elif server_result.type == cygrpc.OperationType.receive_close_on_server:
+                self.assertFalse(server_result.received_cancelled)
+        self.assertEqual(
+            set([
+                cygrpc.OperationType.send_initial_metadata,
+                cygrpc.OperationType.receive_message,
+                cygrpc.OperationType.send_message,
+                cygrpc.OperationType.receive_close_on_server,
+                cygrpc.OperationType.send_status_from_server
+            ]), found_server_op_types)
 
-    server_request_tag = object()
-    self.server.request_call(
-        self.server_completion_queue, self.server_completion_queue,
-        server_request_tag)
-    client_call = self.client_channel.create_call(
-        None, 0, self.client_completion_queue, METHOD, self.host_argument,
-        cygrpc_deadline)
+        del client_call
+        del server_call
 
-    # Prologue
-    def perform_client_operations(operations, description):
-      return self._perform_operations(
-          operations, client_call,
-          self.client_completion_queue, cygrpc_deadline, description)
+    def test6522(self):
+        DEADLINE = time.time() + 5
+        DEADLINE_TOLERANCE = 0.25
+        METHOD = b'twinkies'
 
-    client_event_future = perform_client_operations([
+        cygrpc_deadline = cygrpc.Timespec(DEADLINE)
+        empty_metadata = cygrpc.Metadata([])
+
+        server_request_tag = object()
+        self.server.request_call(self.server_completion_queue,
+                                 self.server_completion_queue,
+                                 server_request_tag)
+        client_call = self.client_channel.create_call(
+            None, 0, self.client_completion_queue, METHOD, self.host_argument,
+            cygrpc_deadline)
+
+        # Prologue
+        def perform_client_operations(operations, description):
+            return self._perform_operations(operations, client_call,
+                                            self.client_completion_queue,
+                                            cygrpc_deadline, description)
+
+        client_event_future = perform_client_operations([
             cygrpc.operation_send_initial_metadata(empty_metadata,
                                                    _EMPTY_FLAGS),
             cygrpc.operation_receive_initial_metadata(_EMPTY_FLAGS),
         ], "Client prologue")
 
-    request_event = self.server_completion_queue.poll(cygrpc_deadline)
-    server_call = request_event.operation_call
+        request_event = self.server_completion_queue.poll(cygrpc_deadline)
+        server_call = request_event.operation_call
 
-    def perform_server_operations(operations, description):
-      return self._perform_operations(
-          operations, server_call,
-          self.server_completion_queue, cygrpc_deadline, description)
+        def perform_server_operations(operations, description):
+            return self._perform_operations(operations, server_call,
+                                            self.server_completion_queue,
+                                            cygrpc_deadline, description)
 
-    server_event_future = perform_server_operations([
+        server_event_future = perform_server_operations([
             cygrpc.operation_send_initial_metadata(empty_metadata,
                                                    _EMPTY_FLAGS),
         ], "Server prologue")
 
-    client_event_future.result()  # force completion
-    server_event_future.result()
+        client_event_future.result()  # force completion
+        server_event_future.result()
 
-    # Messaging
-    for _ in range(10):
-      client_event_future = perform_client_operations([
-              cygrpc.operation_send_message(b'', _EMPTY_FLAGS),
-              cygrpc.operation_receive_message(_EMPTY_FLAGS),
-          ], "Client message")
-      server_event_future = perform_server_operations([
-              cygrpc.operation_send_message(b'', _EMPTY_FLAGS),
-              cygrpc.operation_receive_message(_EMPTY_FLAGS),
-          ], "Server receive")
+        # Messaging
+        for _ in range(10):
+            client_event_future = perform_client_operations([
+                cygrpc.operation_send_message(b'', _EMPTY_FLAGS),
+                cygrpc.operation_receive_message(_EMPTY_FLAGS),
+            ], "Client message")
+            server_event_future = perform_server_operations([
+                cygrpc.operation_send_message(b'', _EMPTY_FLAGS),
+                cygrpc.operation_receive_message(_EMPTY_FLAGS),
+            ], "Server receive")
 
-      client_event_future.result()  # force completion
-      server_event_future.result()
+            client_event_future.result()  # force completion
+            server_event_future.result()
 
-    # Epilogue
-    client_event_future = perform_client_operations([
+        # Epilogue
+        client_event_future = perform_client_operations([
             cygrpc.operation_send_close_from_client(_EMPTY_FLAGS),
             cygrpc.operation_receive_status_on_client(_EMPTY_FLAGS)
         ], "Client epilogue")
 
-    server_event_future = perform_server_operations([
+        server_event_future = perform_server_operations([
             cygrpc.operation_receive_close_on_server(_EMPTY_FLAGS),
             cygrpc.operation_send_status_from_server(
                 empty_metadata, cygrpc.StatusCode.ok, b'', _EMPTY_FLAGS)
         ], "Server epilogue")
 
-    client_event_future.result()  # force completion
-    server_event_future.result()
+        client_event_future.result()  # force completion
+        server_event_future.result()
 
 
 class InsecureServerInsecureClient(unittest.TestCase, ServerClientMixin):
 
-  def setUp(self):
-    self.setUpMixin(None, None, None)
+    def setUp(self):
+        self.setUpMixin(None, None, None)
 
-  def tearDown(self):
-    self.tearDownMixin()
+    def tearDown(self):
+        self.tearDownMixin()
 
 
 class SecureServerSecureClient(unittest.TestCase, ServerClientMixin):
 
-  def setUp(self):
-    server_credentials = cygrpc.server_credentials_ssl(
-        None, [cygrpc.SslPemKeyCertPair(resources.private_key(),
-                                        resources.certificate_chain())], False)
-    client_credentials = cygrpc.channel_credentials_ssl(
-        resources.test_root_certificates(), None)
-    self.setUpMixin(server_credentials, client_credentials, _SSL_HOST_OVERRIDE)
+    def setUp(self):
+        server_credentials = cygrpc.server_credentials_ssl(None, [
+            cygrpc.SslPemKeyCertPair(resources.private_key(),
+                                     resources.certificate_chain())
+        ], False)
+        client_credentials = cygrpc.channel_credentials_ssl(
+            resources.test_root_certificates(), None)
+        self.setUpMixin(server_credentials, client_credentials,
+                        _SSL_HOST_OVERRIDE)
 
-  def tearDown(self):
-    self.tearDownMixin()
+    def tearDown(self):
+        self.tearDownMixin()
 
 
 if __name__ == '__main__':
-  unittest.main(verbosity=2)
+    unittest.main(verbosity=2)
diff --git a/src/python/grpcio_tests/tests/unit/_cython/test_utilities.py b/src/python/grpcio_tests/tests/unit/_cython/test_utilities.py
index 6280ce7..dffb373 100644
--- a/src/python/grpcio_tests/tests/unit/_cython/test_utilities.py
+++ b/src/python/grpcio_tests/tests/unit/_cython/test_utilities.py
@@ -33,34 +33,35 @@
 
 
 class SimpleFuture(object):
-  """A simple future mechanism."""
+    """A simple future mechanism."""
 
-  def __init__(self, function, *args, **kwargs):
-    def wrapped_function():
-      try:
-        self._result = function(*args, **kwargs)
-      except Exception as error:
-        self._error = error
-    self._result = None
-    self._error = None
-    self._thread = threading.Thread(target=wrapped_function)
-    self._thread.start()
+    def __init__(self, function, *args, **kwargs):
 
-  def result(self):
-    """The resulting value of this future.
+        def wrapped_function():
+            try:
+                self._result = function(*args, **kwargs)
+            except Exception as error:
+                self._error = error
+
+        self._result = None
+        self._error = None
+        self._thread = threading.Thread(target=wrapped_function)
+        self._thread.start()
+
+    def result(self):
+        """The resulting value of this future.
 
     Re-raises any exceptions.
     """
-    self._thread.join()
-    if self._error:
-      # TODO(atash): re-raise exceptions in a way that preserves tracebacks
-      raise self._error
-    return self._result
+        self._thread.join()
+        if self._error:
+            # TODO(atash): re-raise exceptions in a way that preserves tracebacks
+            raise self._error
+        return self._result
 
 
 class CompletionQueuePollFuture(SimpleFuture):
 
-  def __init__(self, completion_queue, deadline):
-    super(CompletionQueuePollFuture, self).__init__(
-        lambda: completion_queue.poll(deadline))
-
+    def __init__(self, completion_queue, deadline):
+        super(CompletionQueuePollFuture,
+              self).__init__(lambda: completion_queue.poll(deadline))
diff --git a/src/python/grpcio_tests/tests/unit/_empty_message_test.py b/src/python/grpcio_tests/tests/unit/_empty_message_test.py
index 69f4689..1551738 100644
--- a/src/python/grpcio_tests/tests/unit/_empty_message_test.py
+++ b/src/python/grpcio_tests/tests/unit/_empty_message_test.py
@@ -44,95 +44,94 @@
 
 
 def handle_unary_unary(request, servicer_context):
-  return _RESPONSE
+    return _RESPONSE
 
 
 def handle_unary_stream(request, servicer_context):
-  for _ in range(test_constants.STREAM_LENGTH):
-    yield _RESPONSE
+    for _ in range(test_constants.STREAM_LENGTH):
+        yield _RESPONSE
 
 
 def handle_stream_unary(request_iterator, servicer_context):
-  for request in request_iterator:
-    pass
-  return _RESPONSE
+    for request in request_iterator:
+        pass
+    return _RESPONSE
 
 
 def handle_stream_stream(request_iterator, servicer_context):
-  for request in request_iterator:
-    yield _RESPONSE
+    for request in request_iterator:
+        yield _RESPONSE
 
 
 class _MethodHandler(grpc.RpcMethodHandler):
 
-  def __init__(self, request_streaming, response_streaming):
-    self.request_streaming = request_streaming
-    self.response_streaming = response_streaming
-    self.request_deserializer = None
-    self.response_serializer = None
-    self.unary_unary = None
-    self.unary_stream = None
-    self.stream_unary = None
-    self.stream_stream = None
-    if self.request_streaming and self.response_streaming:
-      self.stream_stream = handle_stream_stream
-    elif self.request_streaming:
-      self.stream_unary = handle_stream_unary
-    elif self.response_streaming:
-      self.unary_stream = handle_unary_stream
-    else:
-      self.unary_unary = handle_unary_unary
+    def __init__(self, request_streaming, response_streaming):
+        self.request_streaming = request_streaming
+        self.response_streaming = response_streaming
+        self.request_deserializer = None
+        self.response_serializer = None
+        self.unary_unary = None
+        self.unary_stream = None
+        self.stream_unary = None
+        self.stream_stream = None
+        if self.request_streaming and self.response_streaming:
+            self.stream_stream = handle_stream_stream
+        elif self.request_streaming:
+            self.stream_unary = handle_stream_unary
+        elif self.response_streaming:
+            self.unary_stream = handle_unary_stream
+        else:
+            self.unary_unary = handle_unary_unary
 
 
 class _GenericHandler(grpc.GenericRpcHandler):
 
-  def service(self, handler_call_details):
-    if handler_call_details.method == _UNARY_UNARY:
-      return _MethodHandler(False, False)
-    elif handler_call_details.method == _UNARY_STREAM:
-      return _MethodHandler(False, True)
-    elif handler_call_details.method == _STREAM_UNARY:
-      return _MethodHandler(True, False)
-    elif handler_call_details.method == _STREAM_STREAM:
-      return _MethodHandler(True, True)
-    else:
-      return None
+    def service(self, handler_call_details):
+        if handler_call_details.method == _UNARY_UNARY:
+            return _MethodHandler(False, False)
+        elif handler_call_details.method == _UNARY_STREAM:
+            return _MethodHandler(False, True)
+        elif handler_call_details.method == _STREAM_UNARY:
+            return _MethodHandler(True, False)
+        elif handler_call_details.method == _STREAM_STREAM:
+            return _MethodHandler(True, True)
+        else:
+            return None
 
 
 class EmptyMessageTest(unittest.TestCase):
 
-  def setUp(self):
-    self._server_pool = logging_pool.pool(test_constants.THREAD_CONCURRENCY)
-    self._server = grpc.server(
-        self._server_pool, handlers=(_GenericHandler(),))
-    port = self._server.add_insecure_port('[::]:0')
-    self._server.start()
-    self._channel = grpc.insecure_channel('localhost:%d' % port)
+    def setUp(self):
+        self._server_pool = logging_pool.pool(test_constants.THREAD_CONCURRENCY)
+        self._server = grpc.server(
+            self._server_pool, handlers=(_GenericHandler(),))
+        port = self._server.add_insecure_port('[::]:0')
+        self._server.start()
+        self._channel = grpc.insecure_channel('localhost:%d' % port)
 
-  def tearDown(self):
-    self._server.stop(0)
+    def tearDown(self):
+        self._server.stop(0)
 
-  def testUnaryUnary(self):
-    response = self._channel.unary_unary(_UNARY_UNARY)(_REQUEST)
-    self.assertEqual(_RESPONSE, response)
+    def testUnaryUnary(self):
+        response = self._channel.unary_unary(_UNARY_UNARY)(_REQUEST)
+        self.assertEqual(_RESPONSE, response)
 
-  def testUnaryStream(self):
-    response_iterator = self._channel.unary_stream(_UNARY_STREAM)(_REQUEST)
-    self.assertSequenceEqual(
-        [_RESPONSE] * test_constants.STREAM_LENGTH, list(response_iterator))
+    def testUnaryStream(self):
+        response_iterator = self._channel.unary_stream(_UNARY_STREAM)(_REQUEST)
+        self.assertSequenceEqual([_RESPONSE] * test_constants.STREAM_LENGTH,
+                                 list(response_iterator))
 
-  def testStreamUnary(self):
-    response = self._channel.stream_unary(_STREAM_UNARY)(
-        iter([_REQUEST] * test_constants.STREAM_LENGTH))
-    self.assertEqual(_RESPONSE, response)
+    def testStreamUnary(self):
+        response = self._channel.stream_unary(_STREAM_UNARY)(
+            iter([_REQUEST] * test_constants.STREAM_LENGTH))
+        self.assertEqual(_RESPONSE, response)
 
-  def testStreamStream(self):
-    response_iterator = self._channel.stream_stream(_STREAM_STREAM)(
-        iter([_REQUEST] * test_constants.STREAM_LENGTH))
-    self.assertSequenceEqual(
-        [_RESPONSE] * test_constants.STREAM_LENGTH, list(response_iterator))
+    def testStreamStream(self):
+        response_iterator = self._channel.stream_stream(_STREAM_STREAM)(
+            iter([_REQUEST] * test_constants.STREAM_LENGTH))
+        self.assertSequenceEqual([_RESPONSE] * test_constants.STREAM_LENGTH,
+                                 list(response_iterator))
 
 
 if __name__ == '__main__':
-  unittest.main(verbosity=2)
-
+    unittest.main(verbosity=2)
diff --git a/src/python/grpcio_tests/tests/unit/_exit_scenarios.py b/src/python/grpcio_tests/tests/unit/_exit_scenarios.py
index 7775271..22a6643 100644
--- a/src/python/grpcio_tests/tests/unit/_exit_scenarios.py
+++ b/src/python/grpcio_tests/tests/unit/_exit_scenarios.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Defines a number of module-scope gRPC scenarios to test clean exit."""
 
 import argparse
@@ -73,88 +72,88 @@
 
 
 def hang_unary_unary(request, servicer_context):
-  time.sleep(WAIT_TIME)
+    time.sleep(WAIT_TIME)
 
 
 def hang_unary_stream(request, servicer_context):
-  time.sleep(WAIT_TIME)
+    time.sleep(WAIT_TIME)
 
 
 def hang_partial_unary_stream(request, servicer_context):
-  for _ in range(test_constants.STREAM_LENGTH // 2):
-    yield request
-  time.sleep(WAIT_TIME)
+    for _ in range(test_constants.STREAM_LENGTH // 2):
+        yield request
+    time.sleep(WAIT_TIME)
 
 
 def hang_stream_unary(request_iterator, servicer_context):
-  time.sleep(WAIT_TIME)
+    time.sleep(WAIT_TIME)
 
 
 def hang_partial_stream_unary(request_iterator, servicer_context):
-  for _ in range(test_constants.STREAM_LENGTH // 2):
-    next(request_iterator)
-  time.sleep(WAIT_TIME)
+    for _ in range(test_constants.STREAM_LENGTH // 2):
+        next(request_iterator)
+    time.sleep(WAIT_TIME)
 
 
 def hang_stream_stream(request_iterator, servicer_context):
-  time.sleep(WAIT_TIME)
+    time.sleep(WAIT_TIME)
 
 
 def hang_partial_stream_stream(request_iterator, servicer_context):
-  for _ in range(test_constants.STREAM_LENGTH // 2):
-    yield next(request_iterator)
-  time.sleep(WAIT_TIME)
+    for _ in range(test_constants.STREAM_LENGTH // 2):
+        yield next(request_iterator)
+    time.sleep(WAIT_TIME)
 
 
 class MethodHandler(grpc.RpcMethodHandler):
 
-  def __init__(self, request_streaming, response_streaming, partial_hang):
-    self.request_streaming = request_streaming
-    self.response_streaming = response_streaming
-    self.request_deserializer = None
-    self.response_serializer = None
-    self.unary_unary = None
-    self.unary_stream = None
-    self.stream_unary = None
-    self.stream_stream = None
-    if self.request_streaming and self.response_streaming:
-      if partial_hang:
-        self.stream_stream = hang_partial_stream_stream
-      else:
-        self.stream_stream = hang_stream_stream
-    elif self.request_streaming:
-      if partial_hang:
-        self.stream_unary = hang_partial_stream_unary
-      else:
-        self.stream_unary = hang_stream_unary
-    elif self.response_streaming:
-      if partial_hang:
-        self.unary_stream = hang_partial_unary_stream
-      else:
-        self.unary_stream = hang_unary_stream
-    else:
-      self.unary_unary = hang_unary_unary
+    def __init__(self, request_streaming, response_streaming, partial_hang):
+        self.request_streaming = request_streaming
+        self.response_streaming = response_streaming
+        self.request_deserializer = None
+        self.response_serializer = None
+        self.unary_unary = None
+        self.unary_stream = None
+        self.stream_unary = None
+        self.stream_stream = None
+        if self.request_streaming and self.response_streaming:
+            if partial_hang:
+                self.stream_stream = hang_partial_stream_stream
+            else:
+                self.stream_stream = hang_stream_stream
+        elif self.request_streaming:
+            if partial_hang:
+                self.stream_unary = hang_partial_stream_unary
+            else:
+                self.stream_unary = hang_stream_unary
+        elif self.response_streaming:
+            if partial_hang:
+                self.unary_stream = hang_partial_unary_stream
+            else:
+                self.unary_stream = hang_unary_stream
+        else:
+            self.unary_unary = hang_unary_unary
 
 
 class GenericHandler(grpc.GenericRpcHandler):
 
-  def service(self, handler_call_details):
-    if handler_call_details.method == UNARY_UNARY:
-      return MethodHandler(False, False, False)
-    elif handler_call_details.method == UNARY_STREAM:
-      return MethodHandler(False, True, False)
-    elif handler_call_details.method == STREAM_UNARY:
-      return MethodHandler(True, False, False)
-    elif handler_call_details.method == STREAM_STREAM:
-      return MethodHandler(True, True, False)
-    elif handler_call_details.method == PARTIAL_UNARY_STREAM:
-      return MethodHandler(False, True, True)
-    elif handler_call_details.method == PARTIAL_STREAM_UNARY:
-      return MethodHandler(True, False, True)
-    elif handler_call_details.method == PARTIAL_STREAM_STREAM:
-      return MethodHandler(True, True, True)
-    else:
-      return None
+    def service(self, handler_call_details):
+        if handler_call_details.method == UNARY_UNARY:
+            return MethodHandler(False, False, False)
+        elif handler_call_details.method == UNARY_STREAM:
+            return MethodHandler(False, True, False)
+        elif handler_call_details.method == STREAM_UNARY:
+            return MethodHandler(True, False, False)
+        elif handler_call_details.method == STREAM_STREAM:
+            return MethodHandler(True, True, False)
+        elif handler_call_details.method == PARTIAL_UNARY_STREAM:
+            return MethodHandler(False, True, True)
+        elif handler_call_details.method == PARTIAL_STREAM_UNARY:
+            return MethodHandler(True, False, True)
+        elif handler_call_details.method == PARTIAL_STREAM_STREAM:
+            return MethodHandler(True, True, True)
+        else:
+            return None
 
 
 # Traditional executors will not exit until all their
@@ -162,88 +161,88 @@
 # never finish, we don't want to block exit on these jobs.
 class DaemonPool(object):
 
-  def submit(self, fn, *args, **kwargs):
-    thread = threading.Thread(target=fn, args=args, kwargs=kwargs)
-    thread.daemon = True
-    thread.start()
+    def submit(self, fn, *args, **kwargs):
+        thread = threading.Thread(target=fn, args=args, kwargs=kwargs)
+        thread.daemon = True
+        thread.start()
 
-  def shutdown(self, wait=True):
-    pass
+    def shutdown(self, wait=True):
+        pass
 
 
 def infinite_request_iterator():
-  while True:
-    yield REQUEST
+    while True:
+        yield REQUEST
 
 
 if __name__ == '__main__':
-  parser = argparse.ArgumentParser()
-  parser.add_argument('scenario', type=str)
-  parser.add_argument(
-      '--wait_for_interrupt', dest='wait_for_interrupt', action='store_true')
-  args = parser.parse_args()
+    parser = argparse.ArgumentParser()
+    parser.add_argument('scenario', type=str)
+    parser.add_argument(
+        '--wait_for_interrupt', dest='wait_for_interrupt', action='store_true')
+    args = parser.parse_args()
 
-  if args.scenario == UNSTARTED_SERVER:
-    server = grpc.server(DaemonPool())
-    if args.wait_for_interrupt:
-      time.sleep(WAIT_TIME)
-  elif args.scenario == RUNNING_SERVER:
-    server = grpc.server(DaemonPool())
-    port = server.add_insecure_port('[::]:0')
-    server.start()
-    if args.wait_for_interrupt:
-      time.sleep(WAIT_TIME)
-  elif args.scenario == POLL_CONNECTIVITY_NO_SERVER:
-    channel = grpc.insecure_channel('localhost:12345')
+    if args.scenario == UNSTARTED_SERVER:
+        server = grpc.server(DaemonPool())
+        if args.wait_for_interrupt:
+            time.sleep(WAIT_TIME)
+    elif args.scenario == RUNNING_SERVER:
+        server = grpc.server(DaemonPool())
+        port = server.add_insecure_port('[::]:0')
+        server.start()
+        if args.wait_for_interrupt:
+            time.sleep(WAIT_TIME)
+    elif args.scenario == POLL_CONNECTIVITY_NO_SERVER:
+        channel = grpc.insecure_channel('localhost:12345')
 
-    def connectivity_callback(connectivity):
-      pass
+        def connectivity_callback(connectivity):
+            pass
 
-    channel.subscribe(connectivity_callback, try_to_connect=True)
-    if args.wait_for_interrupt:
-      time.sleep(WAIT_TIME)
-  elif args.scenario == POLL_CONNECTIVITY:
-    server = grpc.server(DaemonPool())
-    port = server.add_insecure_port('[::]:0')
-    server.start()
-    channel = grpc.insecure_channel('localhost:%d' % port)
+        channel.subscribe(connectivity_callback, try_to_connect=True)
+        if args.wait_for_interrupt:
+            time.sleep(WAIT_TIME)
+    elif args.scenario == POLL_CONNECTIVITY:
+        server = grpc.server(DaemonPool())
+        port = server.add_insecure_port('[::]:0')
+        server.start()
+        channel = grpc.insecure_channel('localhost:%d' % port)
 
-    def connectivity_callback(connectivity):
-      pass
+        def connectivity_callback(connectivity):
+            pass
 
-    channel.subscribe(connectivity_callback, try_to_connect=True)
-    if args.wait_for_interrupt:
-      time.sleep(WAIT_TIME)
+        channel.subscribe(connectivity_callback, try_to_connect=True)
+        if args.wait_for_interrupt:
+            time.sleep(WAIT_TIME)
 
-  else:
-    handler = GenericHandler()
-    server = grpc.server(DaemonPool())
-    port = server.add_insecure_port('[::]:0')
-    server.add_generic_rpc_handlers((handler,))
-    server.start()
-    channel = grpc.insecure_channel('localhost:%d' % port)
+    else:
+        handler = GenericHandler()
+        server = grpc.server(DaemonPool())
+        port = server.add_insecure_port('[::]:0')
+        server.add_generic_rpc_handlers((handler,))
+        server.start()
+        channel = grpc.insecure_channel('localhost:%d' % port)
 
-    method = TEST_TO_METHOD[args.scenario]
+        method = TEST_TO_METHOD[args.scenario]
 
-    if args.scenario == IN_FLIGHT_UNARY_UNARY_CALL:
-      multi_callable = channel.unary_unary(method)
-      future = multi_callable.future(REQUEST)
-      result, call = multi_callable.with_call(REQUEST)
-    elif (args.scenario == IN_FLIGHT_UNARY_STREAM_CALL or
-          args.scenario == IN_FLIGHT_PARTIAL_UNARY_STREAM_CALL):
-      multi_callable = channel.unary_stream(method)
-      response_iterator = multi_callable(REQUEST)
-      for response in response_iterator:
-        pass
-    elif (args.scenario == IN_FLIGHT_STREAM_UNARY_CALL or
-          args.scenario == IN_FLIGHT_PARTIAL_STREAM_UNARY_CALL):
-      multi_callable = channel.stream_unary(method)
-      future = multi_callable.future(infinite_request_iterator())
-      result, call = multi_callable.with_call(
-          iter([REQUEST] * test_constants.STREAM_LENGTH))
-    elif (args.scenario == IN_FLIGHT_STREAM_STREAM_CALL or
-          args.scenario == IN_FLIGHT_PARTIAL_STREAM_STREAM_CALL):
-      multi_callable = channel.stream_stream(method)
-      response_iterator = multi_callable(infinite_request_iterator())
-      for response in response_iterator:
-        pass
+        if args.scenario == IN_FLIGHT_UNARY_UNARY_CALL:
+            multi_callable = channel.unary_unary(method)
+            future = multi_callable.future(REQUEST)
+            result, call = multi_callable.with_call(REQUEST)
+        elif (args.scenario == IN_FLIGHT_UNARY_STREAM_CALL or
+              args.scenario == IN_FLIGHT_PARTIAL_UNARY_STREAM_CALL):
+            multi_callable = channel.unary_stream(method)
+            response_iterator = multi_callable(REQUEST)
+            for response in response_iterator:
+                pass
+        elif (args.scenario == IN_FLIGHT_STREAM_UNARY_CALL or
+              args.scenario == IN_FLIGHT_PARTIAL_STREAM_UNARY_CALL):
+            multi_callable = channel.stream_unary(method)
+            future = multi_callable.future(infinite_request_iterator())
+            result, call = multi_callable.with_call(
+                iter([REQUEST] * test_constants.STREAM_LENGTH))
+        elif (args.scenario == IN_FLIGHT_STREAM_STREAM_CALL or
+              args.scenario == IN_FLIGHT_PARTIAL_STREAM_STREAM_CALL):
+            multi_callable = channel.stream_stream(method)
+            response_iterator = multi_callable(infinite_request_iterator())
+            for response in response_iterator:
+                pass
diff --git a/src/python/grpcio_tests/tests/unit/_exit_test.py b/src/python/grpcio_tests/tests/unit/_exit_test.py
index 5a4a328..b99605d 100644
--- a/src/python/grpcio_tests/tests/unit/_exit_test.py
+++ b/src/python/grpcio_tests/tests/unit/_exit_test.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Tests clean exit of server/client on Python Interpreter exit/sigint.
 
 The tests in this module spawn a subprocess for each test case, the
@@ -45,15 +44,15 @@
 
 from tests.unit import _exit_scenarios
 
-SCENARIO_FILE = os.path.abspath(os.path.join(
-    os.path.dirname(os.path.realpath(__file__)), '_exit_scenarios.py'))
+SCENARIO_FILE = os.path.abspath(
+    os.path.join(
+        os.path.dirname(os.path.realpath(__file__)), '_exit_scenarios.py'))
 INTERPRETER = sys.executable
 BASE_COMMAND = [INTERPRETER, SCENARIO_FILE]
 BASE_SIGTERM_COMMAND = BASE_COMMAND + ['--wait_for_interrupt']
 
 INIT_TIME = 1.0
 
-
 processes = []
 process_lock = threading.Lock()
 
@@ -61,126 +60,146 @@
 # Make sure we attempt to clean up any
 # processes we may have left running
 def cleanup_processes():
-  with process_lock:
-    for process in processes:
-      try:
-        process.kill()
-      except Exception:
-        pass
+    with process_lock:
+        for process in processes:
+            try:
+                process.kill()
+            except Exception:
+                pass
+
+
 atexit.register(cleanup_processes)
 
 
 def interrupt_and_wait(process):
-  with process_lock:
-    processes.append(process)
-  time.sleep(INIT_TIME)
-  os.kill(process.pid, signal.SIGINT)
-  process.wait()
+    with process_lock:
+        processes.append(process)
+    time.sleep(INIT_TIME)
+    os.kill(process.pid, signal.SIGINT)
+    process.wait()
 
 
 def wait(process):
-  with process_lock:
-    processes.append(process)
-  process.wait()
+    with process_lock:
+        processes.append(process)
+    process.wait()
 
 
 @unittest.skip('https://github.com/grpc/grpc/issues/7311')
 class ExitTest(unittest.TestCase):
 
-  def test_unstarted_server(self):
-    process = subprocess.Popen(
-        BASE_COMMAND + [_exit_scenarios.UNSTARTED_SERVER],
-        stdout=sys.stdout, stderr=sys.stderr)
-    wait(process)
+    def test_unstarted_server(self):
+        process = subprocess.Popen(
+            BASE_COMMAND + [_exit_scenarios.UNSTARTED_SERVER],
+            stdout=sys.stdout,
+            stderr=sys.stderr)
+        wait(process)
 
-  def test_unstarted_server_terminate(self):
-    process = subprocess.Popen(
-        BASE_SIGTERM_COMMAND + [_exit_scenarios.UNSTARTED_SERVER],
-        stdout=sys.stdout)
-    interrupt_and_wait(process)
+    def test_unstarted_server_terminate(self):
+        process = subprocess.Popen(
+            BASE_SIGTERM_COMMAND + [_exit_scenarios.UNSTARTED_SERVER],
+            stdout=sys.stdout)
+        interrupt_and_wait(process)
 
-  def test_running_server(self):
-    process = subprocess.Popen(
-        BASE_COMMAND + [_exit_scenarios.RUNNING_SERVER],
-        stdout=sys.stdout, stderr=sys.stderr)
-    wait(process)
+    def test_running_server(self):
+        process = subprocess.Popen(
+            BASE_COMMAND + [_exit_scenarios.RUNNING_SERVER],
+            stdout=sys.stdout,
+            stderr=sys.stderr)
+        wait(process)
 
-  def test_running_server_terminate(self):
-    process = subprocess.Popen(
-        BASE_SIGTERM_COMMAND + [_exit_scenarios.RUNNING_SERVER],
-        stdout=sys.stdout, stderr=sys.stderr)
-    interrupt_and_wait(process)
+    def test_running_server_terminate(self):
+        process = subprocess.Popen(
+            BASE_SIGTERM_COMMAND + [_exit_scenarios.RUNNING_SERVER],
+            stdout=sys.stdout,
+            stderr=sys.stderr)
+        interrupt_and_wait(process)
 
-  def test_poll_connectivity_no_server(self):
-    process = subprocess.Popen(
-        BASE_COMMAND + [_exit_scenarios.POLL_CONNECTIVITY_NO_SERVER],
-        stdout=sys.stdout, stderr=sys.stderr)
-    wait(process)
+    def test_poll_connectivity_no_server(self):
+        process = subprocess.Popen(
+            BASE_COMMAND + [_exit_scenarios.POLL_CONNECTIVITY_NO_SERVER],
+            stdout=sys.stdout,
+            stderr=sys.stderr)
+        wait(process)
 
-  def test_poll_connectivity_no_server_terminate(self):
-    process = subprocess.Popen(
-        BASE_SIGTERM_COMMAND + [_exit_scenarios.POLL_CONNECTIVITY_NO_SERVER],
-        stdout=sys.stdout, stderr=sys.stderr)
-    interrupt_and_wait(process)
+    def test_poll_connectivity_no_server_terminate(self):
+        process = subprocess.Popen(
+            BASE_SIGTERM_COMMAND +
+            [_exit_scenarios.POLL_CONNECTIVITY_NO_SERVER],
+            stdout=sys.stdout,
+            stderr=sys.stderr)
+        interrupt_and_wait(process)
 
-  def test_poll_connectivity(self):
-    process = subprocess.Popen(
-        BASE_COMMAND + [_exit_scenarios.POLL_CONNECTIVITY],
-        stdout=sys.stdout, stderr=sys.stderr)
-    wait(process)
+    def test_poll_connectivity(self):
+        process = subprocess.Popen(
+            BASE_COMMAND + [_exit_scenarios.POLL_CONNECTIVITY],
+            stdout=sys.stdout,
+            stderr=sys.stderr)
+        wait(process)
 
-  def test_poll_connectivity_terminate(self):
-    process = subprocess.Popen(
-        BASE_SIGTERM_COMMAND + [_exit_scenarios.POLL_CONNECTIVITY],
-        stdout=sys.stdout, stderr=sys.stderr)
-    interrupt_and_wait(process)
+    def test_poll_connectivity_terminate(self):
+        process = subprocess.Popen(
+            BASE_SIGTERM_COMMAND + [_exit_scenarios.POLL_CONNECTIVITY],
+            stdout=sys.stdout,
+            stderr=sys.stderr)
+        interrupt_and_wait(process)
 
-  def test_in_flight_unary_unary_call(self):
-    process = subprocess.Popen(
-        BASE_COMMAND + [_exit_scenarios.IN_FLIGHT_UNARY_UNARY_CALL],
-        stdout=sys.stdout, stderr=sys.stderr)
-    interrupt_and_wait(process)
+    def test_in_flight_unary_unary_call(self):
+        process = subprocess.Popen(
+            BASE_COMMAND + [_exit_scenarios.IN_FLIGHT_UNARY_UNARY_CALL],
+            stdout=sys.stdout,
+            stderr=sys.stderr)
+        interrupt_and_wait(process)
 
-  @unittest.skipIf(six.PY2, 'https://github.com/grpc/grpc/issues/6999')
-  def test_in_flight_unary_stream_call(self):
-    process = subprocess.Popen(
-        BASE_COMMAND + [_exit_scenarios.IN_FLIGHT_UNARY_STREAM_CALL],
-        stdout=sys.stdout, stderr=sys.stderr)
-    interrupt_and_wait(process)
+    @unittest.skipIf(six.PY2, 'https://github.com/grpc/grpc/issues/6999')
+    def test_in_flight_unary_stream_call(self):
+        process = subprocess.Popen(
+            BASE_COMMAND + [_exit_scenarios.IN_FLIGHT_UNARY_STREAM_CALL],
+            stdout=sys.stdout,
+            stderr=sys.stderr)
+        interrupt_and_wait(process)
 
-  def test_in_flight_stream_unary_call(self):
-    process = subprocess.Popen(
-        BASE_COMMAND + [_exit_scenarios.IN_FLIGHT_STREAM_UNARY_CALL],
-        stdout=sys.stdout, stderr=sys.stderr)
-    interrupt_and_wait(process)
+    def test_in_flight_stream_unary_call(self):
+        process = subprocess.Popen(
+            BASE_COMMAND + [_exit_scenarios.IN_FLIGHT_STREAM_UNARY_CALL],
+            stdout=sys.stdout,
+            stderr=sys.stderr)
+        interrupt_and_wait(process)
 
-  @unittest.skipIf(six.PY2, 'https://github.com/grpc/grpc/issues/6999')
-  def test_in_flight_stream_stream_call(self):
-    process = subprocess.Popen(
-        BASE_COMMAND + [_exit_scenarios.IN_FLIGHT_STREAM_STREAM_CALL],
-        stdout=sys.stdout, stderr=sys.stderr)
-    interrupt_and_wait(process)
+    @unittest.skipIf(six.PY2, 'https://github.com/grpc/grpc/issues/6999')
+    def test_in_flight_stream_stream_call(self):
+        process = subprocess.Popen(
+            BASE_COMMAND + [_exit_scenarios.IN_FLIGHT_STREAM_STREAM_CALL],
+            stdout=sys.stdout,
+            stderr=sys.stderr)
+        interrupt_and_wait(process)
 
-  @unittest.skipIf(six.PY2, 'https://github.com/grpc/grpc/issues/6999')
-  def test_in_flight_partial_unary_stream_call(self):
-    process = subprocess.Popen(
-        BASE_COMMAND + [_exit_scenarios.IN_FLIGHT_PARTIAL_UNARY_STREAM_CALL],
-        stdout=sys.stdout, stderr=sys.stderr)
-    interrupt_and_wait(process)
+    @unittest.skipIf(six.PY2, 'https://github.com/grpc/grpc/issues/6999')
+    def test_in_flight_partial_unary_stream_call(self):
+        process = subprocess.Popen(
+            BASE_COMMAND +
+            [_exit_scenarios.IN_FLIGHT_PARTIAL_UNARY_STREAM_CALL],
+            stdout=sys.stdout,
+            stderr=sys.stderr)
+        interrupt_and_wait(process)
 
-  def test_in_flight_partial_stream_unary_call(self):
-    process = subprocess.Popen(
-        BASE_COMMAND + [_exit_scenarios.IN_FLIGHT_PARTIAL_STREAM_UNARY_CALL],
-        stdout=sys.stdout, stderr=sys.stderr)
-    interrupt_and_wait(process)
+    def test_in_flight_partial_stream_unary_call(self):
+        process = subprocess.Popen(
+            BASE_COMMAND +
+            [_exit_scenarios.IN_FLIGHT_PARTIAL_STREAM_UNARY_CALL],
+            stdout=sys.stdout,
+            stderr=sys.stderr)
+        interrupt_and_wait(process)
 
-  @unittest.skipIf(six.PY2, 'https://github.com/grpc/grpc/issues/6999')
-  def test_in_flight_partial_stream_stream_call(self):
-    process = subprocess.Popen(
-        BASE_COMMAND + [_exit_scenarios.IN_FLIGHT_PARTIAL_STREAM_STREAM_CALL],
-        stdout=sys.stdout, stderr=sys.stderr)
-    interrupt_and_wait(process)
+    @unittest.skipIf(six.PY2, 'https://github.com/grpc/grpc/issues/6999')
+    def test_in_flight_partial_stream_stream_call(self):
+        process = subprocess.Popen(
+            BASE_COMMAND +
+            [_exit_scenarios.IN_FLIGHT_PARTIAL_STREAM_STREAM_CALL],
+            stdout=sys.stdout,
+            stderr=sys.stderr)
+        interrupt_and_wait(process)
 
 
 if __name__ == '__main__':
-  unittest.main(verbosity=2)
+    unittest.main(verbosity=2)
diff --git a/src/python/grpcio_tests/tests/unit/_invalid_metadata_test.py b/src/python/grpcio_tests/tests/unit/_invalid_metadata_test.py
index 2dc225d..1b1b1bd 100644
--- a/src/python/grpcio_tests/tests/unit/_invalid_metadata_test.py
+++ b/src/python/grpcio_tests/tests/unit/_invalid_metadata_test.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Test of RPCs made against gRPC Python's application-layer API."""
 
 import unittest
@@ -47,129 +46,131 @@
 
 
 def _unary_unary_multi_callable(channel):
-  return channel.unary_unary(_UNARY_UNARY)
+    return channel.unary_unary(_UNARY_UNARY)
 
 
 def _unary_stream_multi_callable(channel):
-  return channel.unary_stream(
-      _UNARY_STREAM,
-      request_serializer=_SERIALIZE_REQUEST,
-      response_deserializer=_DESERIALIZE_RESPONSE)
+    return channel.unary_stream(
+        _UNARY_STREAM,
+        request_serializer=_SERIALIZE_REQUEST,
+        response_deserializer=_DESERIALIZE_RESPONSE)
 
 
 def _stream_unary_multi_callable(channel):
-  return channel.stream_unary(
-      _STREAM_UNARY,
-      request_serializer=_SERIALIZE_REQUEST,
-      response_deserializer=_DESERIALIZE_RESPONSE)
+    return channel.stream_unary(
+        _STREAM_UNARY,
+        request_serializer=_SERIALIZE_REQUEST,
+        response_deserializer=_DESERIALIZE_RESPONSE)
 
 
 def _stream_stream_multi_callable(channel):
-  return channel.stream_stream(_STREAM_STREAM)
+    return channel.stream_stream(_STREAM_STREAM)
 
 
 class InvalidMetadataTest(unittest.TestCase):
 
-  def setUp(self):
-    self._channel = grpc.insecure_channel('localhost:8080')
-    self._unary_unary = _unary_unary_multi_callable(self._channel)
-    self._unary_stream = _unary_stream_multi_callable(self._channel)
-    self._stream_unary = _stream_unary_multi_callable(self._channel)
-    self._stream_stream = _stream_stream_multi_callable(self._channel)
+    def setUp(self):
+        self._channel = grpc.insecure_channel('localhost:8080')
+        self._unary_unary = _unary_unary_multi_callable(self._channel)
+        self._unary_stream = _unary_stream_multi_callable(self._channel)
+        self._stream_unary = _stream_unary_multi_callable(self._channel)
+        self._stream_stream = _stream_stream_multi_callable(self._channel)
 
-  def testUnaryRequestBlockingUnaryResponse(self):
-    request = b'\x07\x08'
-    metadata = (('InVaLiD', 'UnaryRequestBlockingUnaryResponse'),)
-    expected_error_details = "metadata was invalid: %s" % metadata
-    with self.assertRaises(ValueError) as exception_context:
-      self._unary_unary(request, metadata=metadata)
-    self.assertIn(expected_error_details, str(exception_context.exception))
+    def testUnaryRequestBlockingUnaryResponse(self):
+        request = b'\x07\x08'
+        metadata = (('InVaLiD', 'UnaryRequestBlockingUnaryResponse'),)
+        expected_error_details = "metadata was invalid: %s" % metadata
+        with self.assertRaises(ValueError) as exception_context:
+            self._unary_unary(request, metadata=metadata)
+        self.assertIn(expected_error_details, str(exception_context.exception))
 
-  def testUnaryRequestBlockingUnaryResponseWithCall(self):
-    request = b'\x07\x08'
-    metadata = (('InVaLiD', 'UnaryRequestBlockingUnaryResponseWithCall'),)
-    expected_error_details = "metadata was invalid: %s" % metadata
-    with self.assertRaises(ValueError) as exception_context:
-      self._unary_unary.with_call(request, metadata=metadata)
-    self.assertIn(expected_error_details, str(exception_context.exception))
+    def testUnaryRequestBlockingUnaryResponseWithCall(self):
+        request = b'\x07\x08'
+        metadata = (('InVaLiD', 'UnaryRequestBlockingUnaryResponseWithCall'),)
+        expected_error_details = "metadata was invalid: %s" % metadata
+        with self.assertRaises(ValueError) as exception_context:
+            self._unary_unary.with_call(request, metadata=metadata)
+        self.assertIn(expected_error_details, str(exception_context.exception))
 
-  def testUnaryRequestFutureUnaryResponse(self):
-    request = b'\x07\x08'
-    metadata = (('InVaLiD', 'UnaryRequestFutureUnaryResponse'),)
-    expected_error_details = "metadata was invalid: %s" % metadata
-    response_future = self._unary_unary.future(request, metadata=metadata)
-    with self.assertRaises(grpc.RpcError) as exception_context:
-      response_future.result()
-    self.assertEqual(
-        exception_context.exception.details(), expected_error_details)
-    self.assertEqual(
-        exception_context.exception.code(), grpc.StatusCode.INTERNAL)
-    self.assertEqual(response_future.details(), expected_error_details)
-    self.assertEqual(response_future.code(), grpc.StatusCode.INTERNAL)
+    def testUnaryRequestFutureUnaryResponse(self):
+        request = b'\x07\x08'
+        metadata = (('InVaLiD', 'UnaryRequestFutureUnaryResponse'),)
+        expected_error_details = "metadata was invalid: %s" % metadata
+        response_future = self._unary_unary.future(request, metadata=metadata)
+        with self.assertRaises(grpc.RpcError) as exception_context:
+            response_future.result()
+        self.assertEqual(exception_context.exception.details(),
+                         expected_error_details)
+        self.assertEqual(exception_context.exception.code(),
+                         grpc.StatusCode.INTERNAL)
+        self.assertEqual(response_future.details(), expected_error_details)
+        self.assertEqual(response_future.code(), grpc.StatusCode.INTERNAL)
 
-  def testUnaryRequestStreamResponse(self):
-    request = b'\x37\x58'
-    metadata = (('InVaLiD', 'UnaryRequestStreamResponse'),)
-    expected_error_details = "metadata was invalid: %s" % metadata
-    response_iterator = self._unary_stream(request, metadata=metadata)
-    with self.assertRaises(grpc.RpcError) as exception_context:
-      next(response_iterator)
-    self.assertEqual(
-        exception_context.exception.details(), expected_error_details)
-    self.assertEqual(
-        exception_context.exception.code(), grpc.StatusCode.INTERNAL)
-    self.assertEqual(response_iterator.details(), expected_error_details)
-    self.assertEqual(response_iterator.code(), grpc.StatusCode.INTERNAL)
+    def testUnaryRequestStreamResponse(self):
+        request = b'\x37\x58'
+        metadata = (('InVaLiD', 'UnaryRequestStreamResponse'),)
+        expected_error_details = "metadata was invalid: %s" % metadata
+        response_iterator = self._unary_stream(request, metadata=metadata)
+        with self.assertRaises(grpc.RpcError) as exception_context:
+            next(response_iterator)
+        self.assertEqual(exception_context.exception.details(),
+                         expected_error_details)
+        self.assertEqual(exception_context.exception.code(),
+                         grpc.StatusCode.INTERNAL)
+        self.assertEqual(response_iterator.details(), expected_error_details)
+        self.assertEqual(response_iterator.code(), grpc.StatusCode.INTERNAL)
 
-  def testStreamRequestBlockingUnaryResponse(self):
-    request_iterator = (b'\x07\x08' for _ in range(test_constants.STREAM_LENGTH))
-    metadata = (('InVaLiD', 'StreamRequestBlockingUnaryResponse'),)
-    expected_error_details = "metadata was invalid: %s" % metadata
-    with self.assertRaises(ValueError) as exception_context:
-      self._stream_unary(request_iterator, metadata=metadata)
-    self.assertIn(expected_error_details, str(exception_context.exception))
+    def testStreamRequestBlockingUnaryResponse(self):
+        request_iterator = (b'\x07\x08'
+                            for _ in range(test_constants.STREAM_LENGTH))
+        metadata = (('InVaLiD', 'StreamRequestBlockingUnaryResponse'),)
+        expected_error_details = "metadata was invalid: %s" % metadata
+        with self.assertRaises(ValueError) as exception_context:
+            self._stream_unary(request_iterator, metadata=metadata)
+        self.assertIn(expected_error_details, str(exception_context.exception))
 
-  def testStreamRequestBlockingUnaryResponseWithCall(self):
-    request_iterator = (
-        b'\x07\x08' for _ in range(test_constants.STREAM_LENGTH))
-    metadata = (('InVaLiD', 'StreamRequestBlockingUnaryResponseWithCall'),)
-    expected_error_details = "metadata was invalid: %s" % metadata
-    multi_callable = _stream_unary_multi_callable(self._channel)
-    with self.assertRaises(ValueError) as exception_context:
-      multi_callable.with_call(request_iterator, metadata=metadata)
-    self.assertIn(expected_error_details, str(exception_context.exception))
+    def testStreamRequestBlockingUnaryResponseWithCall(self):
+        request_iterator = (b'\x07\x08'
+                            for _ in range(test_constants.STREAM_LENGTH))
+        metadata = (('InVaLiD', 'StreamRequestBlockingUnaryResponseWithCall'),)
+        expected_error_details = "metadata was invalid: %s" % metadata
+        multi_callable = _stream_unary_multi_callable(self._channel)
+        with self.assertRaises(ValueError) as exception_context:
+            multi_callable.with_call(request_iterator, metadata=metadata)
+        self.assertIn(expected_error_details, str(exception_context.exception))
 
-  def testStreamRequestFutureUnaryResponse(self):
-    request_iterator = (
-        b'\x07\x08' for _ in range(test_constants.STREAM_LENGTH))
-    metadata = (('InVaLiD', 'StreamRequestFutureUnaryResponse'),)
-    expected_error_details = "metadata was invalid: %s" % metadata
-    response_future = self._stream_unary.future(
-        request_iterator, metadata=metadata)
-    with self.assertRaises(grpc.RpcError) as exception_context:
-      response_future.result()
-    self.assertEqual(
-        exception_context.exception.details(), expected_error_details)
-    self.assertEqual(
-        exception_context.exception.code(), grpc.StatusCode.INTERNAL)
-    self.assertEqual(response_future.details(), expected_error_details)
-    self.assertEqual(response_future.code(), grpc.StatusCode.INTERNAL)
+    def testStreamRequestFutureUnaryResponse(self):
+        request_iterator = (b'\x07\x08'
+                            for _ in range(test_constants.STREAM_LENGTH))
+        metadata = (('InVaLiD', 'StreamRequestFutureUnaryResponse'),)
+        expected_error_details = "metadata was invalid: %s" % metadata
+        response_future = self._stream_unary.future(
+            request_iterator, metadata=metadata)
+        with self.assertRaises(grpc.RpcError) as exception_context:
+            response_future.result()
+        self.assertEqual(exception_context.exception.details(),
+                         expected_error_details)
+        self.assertEqual(exception_context.exception.code(),
+                         grpc.StatusCode.INTERNAL)
+        self.assertEqual(response_future.details(), expected_error_details)
+        self.assertEqual(response_future.code(), grpc.StatusCode.INTERNAL)
 
-  def testStreamRequestStreamResponse(self):
-    request_iterator = (
-        b'\x07\x08' for _ in range(test_constants.STREAM_LENGTH))
-    metadata = (('InVaLiD', 'StreamRequestStreamResponse'),)
-    expected_error_details = "metadata was invalid: %s" % metadata
-    response_iterator = self._stream_stream(request_iterator, metadata=metadata)
-    with self.assertRaises(grpc.RpcError) as exception_context:
-      next(response_iterator)
-    self.assertEqual(
-        exception_context.exception.details(), expected_error_details)
-    self.assertEqual(
-        exception_context.exception.code(), grpc.StatusCode.INTERNAL)
-    self.assertEqual(response_iterator.details(), expected_error_details)
-    self.assertEqual(response_iterator.code(), grpc.StatusCode.INTERNAL)
+    def testStreamRequestStreamResponse(self):
+        request_iterator = (b'\x07\x08'
+                            for _ in range(test_constants.STREAM_LENGTH))
+        metadata = (('InVaLiD', 'StreamRequestStreamResponse'),)
+        expected_error_details = "metadata was invalid: %s" % metadata
+        response_iterator = self._stream_stream(
+            request_iterator, metadata=metadata)
+        with self.assertRaises(grpc.RpcError) as exception_context:
+            next(response_iterator)
+        self.assertEqual(exception_context.exception.details(),
+                         expected_error_details)
+        self.assertEqual(exception_context.exception.code(),
+                         grpc.StatusCode.INTERNAL)
+        self.assertEqual(response_iterator.details(), expected_error_details)
+        self.assertEqual(response_iterator.code(), grpc.StatusCode.INTERNAL)
 
 
 if __name__ == '__main__':
-  unittest.main(verbosity=2)
+    unittest.main(verbosity=2)
diff --git a/src/python/grpcio_tests/tests/unit/_invocation_defects_test.py b/src/python/grpcio_tests/tests/unit/_invocation_defects_test.py
index 4312679..efeb237 100644
--- a/src/python/grpcio_tests/tests/unit/_invocation_defects_test.py
+++ b/src/python/grpcio_tests/tests/unit/_invocation_defects_test.py
@@ -50,106 +50,117 @@
 
 
 class _Callback(object):
-  def __init__(self):
-    self._condition = threading.Condition()
-    self._value = None
-    self._called = False
 
-  def __call__(self, value):
-    with self._condition:
-      self._value = value
-      self._called = True
-      self._condition.notify_all()
+    def __init__(self):
+        self._condition = threading.Condition()
+        self._value = None
+        self._called = False
 
-  def value(self):
-    with self._condition:
-      while not self._called:
-        self._condition.wait()
-      return self._value
+    def __call__(self, value):
+        with self._condition:
+            self._value = value
+            self._called = True
+            self._condition.notify_all()
+
+    def value(self):
+        with self._condition:
+            while not self._called:
+                self._condition.wait()
+            return self._value
 
 
 class _Handler(object):
-  def __init__(self, control):
-    self._control = control
 
-  def handle_unary_unary(self, request, servicer_context):
-    self._control.control()
-    if servicer_context is not None:
-      servicer_context.set_trailing_metadata((('testkey', 'testvalue',),))
-    return request
+    def __init__(self, control):
+        self._control = control
 
-  def handle_unary_stream(self, request, servicer_context):
-    for _ in range(test_constants.STREAM_LENGTH):
-      self._control.control()
-      yield request
-    self._control.control()
-    if servicer_context is not None:
-      servicer_context.set_trailing_metadata((('testkey', 'testvalue',),))
+    def handle_unary_unary(self, request, servicer_context):
+        self._control.control()
+        if servicer_context is not None:
+            servicer_context.set_trailing_metadata(((
+                'testkey',
+                'testvalue',),))
+        return request
 
-  def handle_stream_unary(self, request_iterator, servicer_context):
-    if servicer_context is not None:
-      servicer_context.invocation_metadata()
-    self._control.control()
-    response_elements = []
-    for request in request_iterator:
-      self._control.control()
-      response_elements.append(request)
-    self._control.control()
-    if servicer_context is not None:
-      servicer_context.set_trailing_metadata((('testkey', 'testvalue',),))
-    return b''.join(response_elements)
+    def handle_unary_stream(self, request, servicer_context):
+        for _ in range(test_constants.STREAM_LENGTH):
+            self._control.control()
+            yield request
+        self._control.control()
+        if servicer_context is not None:
+            servicer_context.set_trailing_metadata(((
+                'testkey',
+                'testvalue',),))
 
-  def handle_stream_stream(self, request_iterator, servicer_context):
-    self._control.control()
-    if servicer_context is not None:
-      servicer_context.set_trailing_metadata((('testkey', 'testvalue',),))
-    for request in request_iterator:
-      self._control.control()
-      yield request
-    self._control.control()
+    def handle_stream_unary(self, request_iterator, servicer_context):
+        if servicer_context is not None:
+            servicer_context.invocation_metadata()
+        self._control.control()
+        response_elements = []
+        for request in request_iterator:
+            self._control.control()
+            response_elements.append(request)
+        self._control.control()
+        if servicer_context is not None:
+            servicer_context.set_trailing_metadata(((
+                'testkey',
+                'testvalue',),))
+        return b''.join(response_elements)
+
+    def handle_stream_stream(self, request_iterator, servicer_context):
+        self._control.control()
+        if servicer_context is not None:
+            servicer_context.set_trailing_metadata(((
+                'testkey',
+                'testvalue',),))
+        for request in request_iterator:
+            self._control.control()
+            yield request
+        self._control.control()
 
 
 class _MethodHandler(grpc.RpcMethodHandler):
-  def __init__(
-    self, request_streaming, response_streaming, request_deserializer,
-    response_serializer, unary_unary, unary_stream, stream_unary,
-    stream_stream):
-    self.request_streaming = request_streaming
-    self.response_streaming = response_streaming
-    self.request_deserializer = request_deserializer
-    self.response_serializer = response_serializer
-    self.unary_unary = unary_unary
-    self.unary_stream = unary_stream
-    self.stream_unary = stream_unary
-    self.stream_stream = stream_stream
+
+    def __init__(self, request_streaming, response_streaming,
+                 request_deserializer, response_serializer, unary_unary,
+                 unary_stream, stream_unary, stream_stream):
+        self.request_streaming = request_streaming
+        self.response_streaming = response_streaming
+        self.request_deserializer = request_deserializer
+        self.response_serializer = response_serializer
+        self.unary_unary = unary_unary
+        self.unary_stream = unary_stream
+        self.stream_unary = stream_unary
+        self.stream_stream = stream_stream
 
 
 class _GenericHandler(grpc.GenericRpcHandler):
-  def __init__(self, handler):
-    self._handler = handler
 
-  def service(self, handler_call_details):
-    if handler_call_details.method == _UNARY_UNARY:
-      return _MethodHandler(
-        False, False, None, None, self._handler.handle_unary_unary, None,
-        None, None)
-    elif handler_call_details.method == _UNARY_STREAM:
-      return _MethodHandler(
-        False, True, _DESERIALIZE_REQUEST, _SERIALIZE_RESPONSE, None,
-        self._handler.handle_unary_stream, None, None)
-    elif handler_call_details.method == _STREAM_UNARY:
-      return _MethodHandler(
-        True, False, _DESERIALIZE_REQUEST, _SERIALIZE_RESPONSE, None, None,
-        self._handler.handle_stream_unary, None)
-    elif handler_call_details.method == _STREAM_STREAM:
-      return _MethodHandler(
-        True, True, None, None, None, None, None,
-        self._handler.handle_stream_stream)
-    else:
-      return None
+    def __init__(self, handler):
+        self._handler = handler
+
+    def service(self, handler_call_details):
+        if handler_call_details.method == _UNARY_UNARY:
+            return _MethodHandler(False, False, None, None,
+                                  self._handler.handle_unary_unary, None, None,
+                                  None)
+        elif handler_call_details.method == _UNARY_STREAM:
+            return _MethodHandler(False, True, _DESERIALIZE_REQUEST,
+                                  _SERIALIZE_RESPONSE, None,
+                                  self._handler.handle_unary_stream, None, None)
+        elif handler_call_details.method == _STREAM_UNARY:
+            return _MethodHandler(True, False, _DESERIALIZE_REQUEST,
+                                  _SERIALIZE_RESPONSE, None, None,
+                                  self._handler.handle_stream_unary, None)
+        elif handler_call_details.method == _STREAM_STREAM:
+            return _MethodHandler(True, True, None, None, None, None, None,
+                                  self._handler.handle_stream_stream)
+        else:
+            return None
 
 
 class FailAfterFewIterationsCounter(object):
+
     def __init__(self, high, bytestring):
         self._current = 0
         self._high = high
@@ -167,81 +178,82 @@
 
 
 def _unary_unary_multi_callable(channel):
-  return channel.unary_unary(_UNARY_UNARY)
+    return channel.unary_unary(_UNARY_UNARY)
 
 
 def _unary_stream_multi_callable(channel):
-  return channel.unary_stream(
-    _UNARY_STREAM,
-    request_serializer=_SERIALIZE_REQUEST,
-    response_deserializer=_DESERIALIZE_RESPONSE)
+    return channel.unary_stream(
+        _UNARY_STREAM,
+        request_serializer=_SERIALIZE_REQUEST,
+        response_deserializer=_DESERIALIZE_RESPONSE)
 
 
 def _stream_unary_multi_callable(channel):
-  return channel.stream_unary(
-    _STREAM_UNARY,
-    request_serializer=_SERIALIZE_REQUEST,
-    response_deserializer=_DESERIALIZE_RESPONSE)
+    return channel.stream_unary(
+        _STREAM_UNARY,
+        request_serializer=_SERIALIZE_REQUEST,
+        response_deserializer=_DESERIALIZE_RESPONSE)
 
 
 def _stream_stream_multi_callable(channel):
-  return channel.stream_stream(_STREAM_STREAM)
+    return channel.stream_stream(_STREAM_STREAM)
 
 
 class InvocationDefectsTest(unittest.TestCase):
-  def setUp(self):
-    self._control = test_control.PauseFailControl()
-    self._handler = _Handler(self._control)
-    self._server_pool = logging_pool.pool(test_constants.THREAD_CONCURRENCY)
 
-    self._server = grpc.server(self._server_pool)
-    port = self._server.add_insecure_port('[::]:0')
-    self._server.add_generic_rpc_handlers((_GenericHandler(self._handler),))
-    self._server.start()
+    def setUp(self):
+        self._control = test_control.PauseFailControl()
+        self._handler = _Handler(self._control)
+        self._server_pool = logging_pool.pool(test_constants.THREAD_CONCURRENCY)
 
-    self._channel = grpc.insecure_channel('localhost:%d' % port)
+        self._server = grpc.server(self._server_pool)
+        port = self._server.add_insecure_port('[::]:0')
+        self._server.add_generic_rpc_handlers((_GenericHandler(self._handler),))
+        self._server.start()
 
-  def tearDown(self):
-    self._server.stop(0)
+        self._channel = grpc.insecure_channel('localhost:%d' % port)
 
-  def testIterableStreamRequestBlockingUnaryResponse(self):
-    requests = [b'\x07\x08' for _ in range(test_constants.STREAM_LENGTH)]
-    multi_callable = _stream_unary_multi_callable(self._channel)
+    def tearDown(self):
+        self._server.stop(0)
 
-    with self.assertRaises(grpc.RpcError):
-      response = multi_callable(
-        requests,
-        metadata=(('test', 'IterableStreamRequestBlockingUnaryResponse'),))
+    def testIterableStreamRequestBlockingUnaryResponse(self):
+        requests = [b'\x07\x08' for _ in range(test_constants.STREAM_LENGTH)]
+        multi_callable = _stream_unary_multi_callable(self._channel)
 
-  def testIterableStreamRequestFutureUnaryResponse(self):
-    requests = [b'\x07\x08' for _ in range(test_constants.STREAM_LENGTH)]
-    multi_callable = _stream_unary_multi_callable(self._channel)
-    response_future = multi_callable.future(
-      requests,
-      metadata=(
-        ('test', 'IterableStreamRequestFutureUnaryResponse'),))
+        with self.assertRaises(grpc.RpcError):
+            response = multi_callable(
+                requests,
+                metadata=(
+                    ('test', 'IterableStreamRequestBlockingUnaryResponse'),))
 
-    with self.assertRaises(grpc.RpcError):
-      response = response_future.result()
+    def testIterableStreamRequestFutureUnaryResponse(self):
+        requests = [b'\x07\x08' for _ in range(test_constants.STREAM_LENGTH)]
+        multi_callable = _stream_unary_multi_callable(self._channel)
+        response_future = multi_callable.future(
+            requests,
+            metadata=(('test', 'IterableStreamRequestFutureUnaryResponse'),))
 
-  def testIterableStreamRequestStreamResponse(self):
-    requests = [b'\x77\x58' for _ in range(test_constants.STREAM_LENGTH)]
-    multi_callable = _stream_stream_multi_callable(self._channel)
-    response_iterator = multi_callable(
-      requests,
-      metadata=(('test', 'IterableStreamRequestStreamResponse'),))
+        with self.assertRaises(grpc.RpcError):
+            response = response_future.result()
 
-    with self.assertRaises(grpc.RpcError):
-      next(response_iterator)
+    def testIterableStreamRequestStreamResponse(self):
+        requests = [b'\x77\x58' for _ in range(test_constants.STREAM_LENGTH)]
+        multi_callable = _stream_stream_multi_callable(self._channel)
+        response_iterator = multi_callable(
+            requests,
+            metadata=(('test', 'IterableStreamRequestStreamResponse'),))
 
-  def testIteratorStreamRequestStreamResponse(self):
-    requests_iterator = FailAfterFewIterationsCounter(
-      test_constants.STREAM_LENGTH // 2, b'\x07\x08')
-    multi_callable = _stream_stream_multi_callable(self._channel)
-    response_iterator = multi_callable(
-      requests_iterator,
-      metadata=(('test', 'IteratorStreamRequestStreamResponse'),))
+        with self.assertRaises(grpc.RpcError):
+            next(response_iterator)
 
-    with self.assertRaises(grpc.RpcError):
-      for _ in range(test_constants.STREAM_LENGTH // 2 + 1):
-        next(response_iterator)
+    def testIteratorStreamRequestStreamResponse(self):
+        requests_iterator = FailAfterFewIterationsCounter(
+            test_constants.STREAM_LENGTH // 2, b'\x07\x08')
+        multi_callable = _stream_stream_multi_callable(self._channel)
+        response_iterator = multi_callable(
+            requests_iterator,
+            metadata=(('test', 'IteratorStreamRequestStreamResponse'),))
+
+        with self.assertRaises(grpc.RpcError):
+            for _ in range(test_constants.STREAM_LENGTH // 2 + 1):
+                next(response_iterator)
diff --git a/src/python/grpcio_tests/tests/unit/_junkdrawer/__init__.py b/src/python/grpcio_tests/tests/unit/_junkdrawer/__init__.py
index 7086519..b893988 100644
--- a/src/python/grpcio_tests/tests/unit/_junkdrawer/__init__.py
+++ b/src/python/grpcio_tests/tests/unit/_junkdrawer/__init__.py
@@ -26,5 +26,3 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
diff --git a/src/python/grpcio_tests/tests/unit/_junkdrawer/stock_pb2.py b/src/python/grpcio_tests/tests/unit/_junkdrawer/stock_pb2.py
index eef18f8..70f437b 100644
--- a/src/python/grpcio_tests/tests/unit/_junkdrawer/stock_pb2.py
+++ b/src/python/grpcio_tests/tests/unit/_junkdrawer/stock_pb2.py
@@ -35,7 +35,7 @@
 # source: stock.proto
 
 import sys
-_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+_b = sys.version_info[0] < 3 and (lambda x: x) or (lambda x: x.encode('latin1'))
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
@@ -45,108 +45,135 @@
 
 _sym_db = _symbol_database.Default()
 
-
-
-
 DESCRIPTOR = _descriptor.FileDescriptor(
-  name='stock.proto',
-  package='stock',
-  serialized_pb=_b('\n\x0bstock.proto\x12\x05stock\">\n\x0cStockRequest\x12\x0e\n\x06symbol\x18\x01 \x01(\t\x12\x1e\n\x13num_trades_to_watch\x18\x02 \x01(\x05:\x01\x30\"+\n\nStockReply\x12\r\n\x05price\x18\x01 \x01(\x02\x12\x0e\n\x06symbol\x18\x02 \x01(\t2\x96\x02\n\x05Stock\x12=\n\x11GetLastTradePrice\x12\x13.stock.StockRequest\x1a\x11.stock.StockReply\"\x00\x12I\n\x19GetLastTradePriceMultiple\x12\x13.stock.StockRequest\x1a\x11.stock.StockReply\"\x00(\x01\x30\x01\x12?\n\x11WatchFutureTrades\x12\x13.stock.StockRequest\x1a\x11.stock.StockReply\"\x00\x30\x01\x12\x42\n\x14GetHighestTradePrice\x12\x13.stock.StockRequest\x1a\x11.stock.StockReply\"\x00(\x01')
-)
+    name='stock.proto',
+    package='stock',
+    serialized_pb=_b(
+        '\n\x0bstock.proto\x12\x05stock\">\n\x0cStockRequest\x12\x0e\n\x06symbol\x18\x01 \x01(\t\x12\x1e\n\x13num_trades_to_watch\x18\x02 \x01(\x05:\x01\x30\"+\n\nStockReply\x12\r\n\x05price\x18\x01 \x01(\x02\x12\x0e\n\x06symbol\x18\x02 \x01(\t2\x96\x02\n\x05Stock\x12=\n\x11GetLastTradePrice\x12\x13.stock.StockRequest\x1a\x11.stock.StockReply\"\x00\x12I\n\x19GetLastTradePriceMultiple\x12\x13.stock.StockRequest\x1a\x11.stock.StockReply\"\x00(\x01\x30\x01\x12?\n\x11WatchFutureTrades\x12\x13.stock.StockRequest\x1a\x11.stock.StockReply\"\x00\x30\x01\x12\x42\n\x14GetHighestTradePrice\x12\x13.stock.StockRequest\x1a\x11.stock.StockReply\"\x00(\x01'
+    ))
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
-
-
-
 _STOCKREQUEST = _descriptor.Descriptor(
-  name='StockRequest',
-  full_name='stock.StockRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='symbol', full_name='stock.StockRequest.symbol', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    _descriptor.FieldDescriptor(
-      name='num_trades_to_watch', full_name='stock.StockRequest.num_trades_to_watch', index=1,
-      number=2, type=5, cpp_type=1, label=1,
-      has_default_value=True, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=22,
-  serialized_end=84,
-)
-
+    name='StockRequest',
+    full_name='stock.StockRequest',
+    filename=None,
+    file=DESCRIPTOR,
+    containing_type=None,
+    fields=[
+        _descriptor.FieldDescriptor(
+            name='symbol',
+            full_name='stock.StockRequest.symbol',
+            index=0,
+            number=1,
+            type=9,
+            cpp_type=9,
+            label=1,
+            has_default_value=False,
+            default_value=_b("").decode('utf-8'),
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            options=None),
+        _descriptor.FieldDescriptor(
+            name='num_trades_to_watch',
+            full_name='stock.StockRequest.num_trades_to_watch',
+            index=1,
+            number=2,
+            type=5,
+            cpp_type=1,
+            label=1,
+            has_default_value=True,
+            default_value=0,
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            options=None),
+    ],
+    extensions=[],
+    nested_types=[],
+    enum_types=[],
+    options=None,
+    is_extendable=False,
+    extension_ranges=[],
+    oneofs=[],
+    serialized_start=22,
+    serialized_end=84,)
 
 _STOCKREPLY = _descriptor.Descriptor(
-  name='StockReply',
-  full_name='stock.StockReply',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='price', full_name='stock.StockReply.price', index=0,
-      number=1, type=2, cpp_type=6, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    _descriptor.FieldDescriptor(
-      name='symbol', full_name='stock.StockReply.symbol', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=86,
-  serialized_end=129,
-)
+    name='StockReply',
+    full_name='stock.StockReply',
+    filename=None,
+    file=DESCRIPTOR,
+    containing_type=None,
+    fields=[
+        _descriptor.FieldDescriptor(
+            name='price',
+            full_name='stock.StockReply.price',
+            index=0,
+            number=1,
+            type=2,
+            cpp_type=6,
+            label=1,
+            has_default_value=False,
+            default_value=0,
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            options=None),
+        _descriptor.FieldDescriptor(
+            name='symbol',
+            full_name='stock.StockReply.symbol',
+            index=1,
+            number=2,
+            type=9,
+            cpp_type=9,
+            label=1,
+            has_default_value=False,
+            default_value=_b("").decode('utf-8'),
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            options=None),
+    ],
+    extensions=[],
+    nested_types=[],
+    enum_types=[],
+    options=None,
+    is_extendable=False,
+    extension_ranges=[],
+    oneofs=[],
+    serialized_start=86,
+    serialized_end=129,)
 
 DESCRIPTOR.message_types_by_name['StockRequest'] = _STOCKREQUEST
 DESCRIPTOR.message_types_by_name['StockReply'] = _STOCKREPLY
 
-StockRequest = _reflection.GeneratedProtocolMessageType('StockRequest', (_message.Message,), dict(
-  DESCRIPTOR = _STOCKREQUEST,
-  __module__ = 'stock_pb2'
-  # @@protoc_insertion_point(class_scope:stock.StockRequest)
-  ))
+StockRequest = _reflection.GeneratedProtocolMessageType(
+    'StockRequest',
+    (_message.Message,),
+    dict(
+        DESCRIPTOR=_STOCKREQUEST,
+        __module__='stock_pb2'
+        # @@protoc_insertion_point(class_scope:stock.StockRequest)
+    ))
 _sym_db.RegisterMessage(StockRequest)
 
-StockReply = _reflection.GeneratedProtocolMessageType('StockReply', (_message.Message,), dict(
-  DESCRIPTOR = _STOCKREPLY,
-  __module__ = 'stock_pb2'
-  # @@protoc_insertion_point(class_scope:stock.StockReply)
-  ))
+StockReply = _reflection.GeneratedProtocolMessageType(
+    'StockReply',
+    (_message.Message,),
+    dict(
+        DESCRIPTOR=_STOCKREPLY,
+        __module__='stock_pb2'
+        # @@protoc_insertion_point(class_scope:stock.StockReply)
+    ))
 _sym_db.RegisterMessage(StockReply)
 
-
 # @@protoc_insertion_point(module_scope)
diff --git a/src/python/grpcio_tests/tests/unit/_metadata_code_details_test.py b/src/python/grpcio_tests/tests/unit/_metadata_code_details_test.py
index fb3e547..af2ce64 100644
--- a/src/python/grpcio_tests/tests/unit/_metadata_code_details_test.py
+++ b/src/python/grpcio_tests/tests/unit/_metadata_code_details_test.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Tests application-provided metadata, status code, and details."""
 
 import threading
@@ -53,20 +52,16 @@
 _STREAM_UNARY = 'StreamUnary'
 _STREAM_STREAM = 'StreamStream'
 
-_CLIENT_METADATA = (
-    ('client-md-key', 'client-md-key'),
-    ('client-md-key-bin', b'\x00\x01')
-)
+_CLIENT_METADATA = (('client-md-key', 'client-md-key'),
+                    ('client-md-key-bin', b'\x00\x01'))
 
 _SERVER_INITIAL_METADATA = (
     ('server-initial-md-key', 'server-initial-md-value'),
-    ('server-initial-md-key-bin', b'\x00\x02')
-)
+    ('server-initial-md-key-bin', b'\x00\x02'))
 
 _SERVER_TRAILING_METADATA = (
     ('server-trailing-md-key', 'server-trailing-md-value'),
-    ('server-trailing-md-key-bin', b'\x00\x03')
-)
+    ('server-trailing-md-key-bin', b'\x00\x03'))
 
 _NON_OK_CODE = grpc.StatusCode.NOT_FOUND
 _DETAILS = 'Test details!'
@@ -74,450 +69,464 @@
 
 class _Servicer(object):
 
-  def __init__(self):
-    self._lock = threading.Lock()
-    self._code = None
-    self._details = None
-    self._exception = False
-    self._return_none = False
-    self._received_client_metadata = None
+    def __init__(self):
+        self._lock = threading.Lock()
+        self._code = None
+        self._details = None
+        self._exception = False
+        self._return_none = False
+        self._received_client_metadata = None
 
-  def unary_unary(self, request, context):
-    with self._lock:
-      self._received_client_metadata = context.invocation_metadata()
-      context.send_initial_metadata(_SERVER_INITIAL_METADATA)
-      context.set_trailing_metadata(_SERVER_TRAILING_METADATA)
-      if self._code is not None:
-        context.set_code(self._code)
-      if self._details is not None:
-        context.set_details(self._details)
-      if self._exception:
-        raise test_control.Defect()
-      else:
-        return None if self._return_none else object()
+    def unary_unary(self, request, context):
+        with self._lock:
+            self._received_client_metadata = context.invocation_metadata()
+            context.send_initial_metadata(_SERVER_INITIAL_METADATA)
+            context.set_trailing_metadata(_SERVER_TRAILING_METADATA)
+            if self._code is not None:
+                context.set_code(self._code)
+            if self._details is not None:
+                context.set_details(self._details)
+            if self._exception:
+                raise test_control.Defect()
+            else:
+                return None if self._return_none else object()
 
-  def unary_stream(self, request, context):
-    with self._lock:
-      self._received_client_metadata = context.invocation_metadata()
-      context.send_initial_metadata(_SERVER_INITIAL_METADATA)
-      context.set_trailing_metadata(_SERVER_TRAILING_METADATA)
-      if self._code is not None:
-        context.set_code(self._code)
-      if self._details is not None:
-        context.set_details(self._details)
-      for _ in range(test_constants.STREAM_LENGTH // 2):
-        yield _SERIALIZED_RESPONSE
-      if self._exception:
-        raise test_control.Defect()
+    def unary_stream(self, request, context):
+        with self._lock:
+            self._received_client_metadata = context.invocation_metadata()
+            context.send_initial_metadata(_SERVER_INITIAL_METADATA)
+            context.set_trailing_metadata(_SERVER_TRAILING_METADATA)
+            if self._code is not None:
+                context.set_code(self._code)
+            if self._details is not None:
+                context.set_details(self._details)
+            for _ in range(test_constants.STREAM_LENGTH // 2):
+                yield _SERIALIZED_RESPONSE
+            if self._exception:
+                raise test_control.Defect()
 
-  def stream_unary(self, request_iterator, context):
-    with self._lock:
-      self._received_client_metadata = context.invocation_metadata()
-      context.send_initial_metadata(_SERVER_INITIAL_METADATA)
-      context.set_trailing_metadata(_SERVER_TRAILING_METADATA)
-      if self._code is not None:
-        context.set_code(self._code)
-      if self._details is not None:
-        context.set_details(self._details)
-      # TODO(https://github.com/grpc/grpc/issues/6891): just ignore the
-      # request iterator.
-      for ignored_request in request_iterator:
-        pass
-      if self._exception:
-        raise test_control.Defect()
-      else:
-        return None if self._return_none else _SERIALIZED_RESPONSE
+    def stream_unary(self, request_iterator, context):
+        with self._lock:
+            self._received_client_metadata = context.invocation_metadata()
+            context.send_initial_metadata(_SERVER_INITIAL_METADATA)
+            context.set_trailing_metadata(_SERVER_TRAILING_METADATA)
+            if self._code is not None:
+                context.set_code(self._code)
+            if self._details is not None:
+                context.set_details(self._details)
+            # TODO(https://github.com/grpc/grpc/issues/6891): just ignore the
+            # request iterator.
+            for ignored_request in request_iterator:
+                pass
+            if self._exception:
+                raise test_control.Defect()
+            else:
+                return None if self._return_none else _SERIALIZED_RESPONSE
 
-  def stream_stream(self, request_iterator, context):
-    with self._lock:
-      self._received_client_metadata = context.invocation_metadata()
-      context.send_initial_metadata(_SERVER_INITIAL_METADATA)
-      context.set_trailing_metadata(_SERVER_TRAILING_METADATA)
-      if self._code is not None:
-        context.set_code(self._code)
-      if self._details is not None:
-        context.set_details(self._details)
-      # TODO(https://github.com/grpc/grpc/issues/6891): just ignore the
-      # request iterator.
-      for ignored_request in request_iterator:
-        pass
-      for _ in range(test_constants.STREAM_LENGTH // 3):
-        yield object()
-      if self._exception:
-        raise test_control.Defect()
+    def stream_stream(self, request_iterator, context):
+        with self._lock:
+            self._received_client_metadata = context.invocation_metadata()
+            context.send_initial_metadata(_SERVER_INITIAL_METADATA)
+            context.set_trailing_metadata(_SERVER_TRAILING_METADATA)
+            if self._code is not None:
+                context.set_code(self._code)
+            if self._details is not None:
+                context.set_details(self._details)
+            # TODO(https://github.com/grpc/grpc/issues/6891): just ignore the
+            # request iterator.
+            for ignored_request in request_iterator:
+                pass
+            for _ in range(test_constants.STREAM_LENGTH // 3):
+                yield object()
+            if self._exception:
+                raise test_control.Defect()
 
-  def set_code(self, code):
-    with self._lock:
-      self._code = code
+    def set_code(self, code):
+        with self._lock:
+            self._code = code
 
-  def set_details(self, details):
-    with self._lock:
-      self._details = details
+    def set_details(self, details):
+        with self._lock:
+            self._details = details
 
-  def set_exception(self):
-    with self._lock:
-      self._exception = True
+    def set_exception(self):
+        with self._lock:
+            self._exception = True
 
-  def set_return_none(self):
-    with self._lock:
-      self._return_none = True
+    def set_return_none(self):
+        with self._lock:
+            self._return_none = True
 
-  def received_client_metadata(self):
-    with self._lock:
-      return self._received_client_metadata
+    def received_client_metadata(self):
+        with self._lock:
+            return self._received_client_metadata
 
 
 def _generic_handler(servicer):
-  method_handlers = {
-      _UNARY_UNARY: grpc.unary_unary_rpc_method_handler(
-          servicer.unary_unary, request_deserializer=_REQUEST_DESERIALIZER,
-          response_serializer=_RESPONSE_SERIALIZER),
-      _UNARY_STREAM: grpc.unary_stream_rpc_method_handler(
-          servicer.unary_stream),
-      _STREAM_UNARY: grpc.stream_unary_rpc_method_handler(
-          servicer.stream_unary),
-      _STREAM_STREAM: grpc.stream_stream_rpc_method_handler(
-          servicer.stream_stream, request_deserializer=_REQUEST_DESERIALIZER,
-          response_serializer=_RESPONSE_SERIALIZER),
-  }
-  return grpc.method_handlers_generic_handler(_SERVICE, method_handlers)
+    method_handlers = {
+        _UNARY_UNARY: grpc.unary_unary_rpc_method_handler(
+            servicer.unary_unary,
+            request_deserializer=_REQUEST_DESERIALIZER,
+            response_serializer=_RESPONSE_SERIALIZER),
+        _UNARY_STREAM:
+        grpc.unary_stream_rpc_method_handler(servicer.unary_stream),
+        _STREAM_UNARY:
+        grpc.stream_unary_rpc_method_handler(servicer.stream_unary),
+        _STREAM_STREAM: grpc.stream_stream_rpc_method_handler(
+            servicer.stream_stream,
+            request_deserializer=_REQUEST_DESERIALIZER,
+            response_serializer=_RESPONSE_SERIALIZER),
+    }
+    return grpc.method_handlers_generic_handler(_SERVICE, method_handlers)
 
 
 class MetadataCodeDetailsTest(unittest.TestCase):
 
-  def setUp(self):
-    self._servicer = _Servicer()
-    self._server_pool = logging_pool.pool(test_constants.THREAD_CONCURRENCY)
-    self._server = grpc.server(
-        self._server_pool, handlers=(_generic_handler(self._servicer),))
-    port = self._server.add_insecure_port('[::]:0')
-    self._server.start()
+    def setUp(self):
+        self._servicer = _Servicer()
+        self._server_pool = logging_pool.pool(test_constants.THREAD_CONCURRENCY)
+        self._server = grpc.server(
+            self._server_pool, handlers=(_generic_handler(self._servicer),))
+        port = self._server.add_insecure_port('[::]:0')
+        self._server.start()
 
-    channel = grpc.insecure_channel('localhost:{}'.format(port))
-    self._unary_unary = channel.unary_unary(
-        '/'.join(('', _SERVICE, _UNARY_UNARY,)),
-        request_serializer=_REQUEST_SERIALIZER,
-        response_deserializer=_RESPONSE_DESERIALIZER,)
-    self._unary_stream = channel.unary_stream(
-        '/'.join(('', _SERVICE, _UNARY_STREAM,)),)
-    self._stream_unary = channel.stream_unary(
-        '/'.join(('', _SERVICE, _STREAM_UNARY,)),)
-    self._stream_stream = channel.stream_stream(
-        '/'.join(('', _SERVICE, _STREAM_STREAM,)),
-        request_serializer=_REQUEST_SERIALIZER,
-        response_deserializer=_RESPONSE_DESERIALIZER,)
+        channel = grpc.insecure_channel('localhost:{}'.format(port))
+        self._unary_unary = channel.unary_unary(
+            '/'.join((
+                '',
+                _SERVICE,
+                _UNARY_UNARY,)),
+            request_serializer=_REQUEST_SERIALIZER,
+            response_deserializer=_RESPONSE_DESERIALIZER,)
+        self._unary_stream = channel.unary_stream('/'.join((
+            '',
+            _SERVICE,
+            _UNARY_STREAM,)),)
+        self._stream_unary = channel.stream_unary('/'.join((
+            '',
+            _SERVICE,
+            _STREAM_UNARY,)),)
+        self._stream_stream = channel.stream_stream(
+            '/'.join((
+                '',
+                _SERVICE,
+                _STREAM_STREAM,)),
+            request_serializer=_REQUEST_SERIALIZER,
+            response_deserializer=_RESPONSE_DESERIALIZER,)
 
+    def testSuccessfulUnaryUnary(self):
+        self._servicer.set_details(_DETAILS)
 
-  def testSuccessfulUnaryUnary(self):
-    self._servicer.set_details(_DETAILS)
+        unused_response, call = self._unary_unary.with_call(
+            object(), metadata=_CLIENT_METADATA)
 
-    unused_response, call = self._unary_unary.with_call(
-        object(), metadata=_CLIENT_METADATA)
+        self.assertTrue(
+            test_common.metadata_transmitted(
+                _CLIENT_METADATA, self._servicer.received_client_metadata()))
+        self.assertTrue(
+            test_common.metadata_transmitted(_SERVER_INITIAL_METADATA,
+                                             call.initial_metadata()))
+        self.assertTrue(
+            test_common.metadata_transmitted(_SERVER_TRAILING_METADATA,
+                                             call.trailing_metadata()))
+        self.assertIs(grpc.StatusCode.OK, call.code())
+        self.assertEqual(_DETAILS, call.details())
 
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _CLIENT_METADATA, self._servicer.received_client_metadata()))
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _SERVER_INITIAL_METADATA, call.initial_metadata()))
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _SERVER_TRAILING_METADATA, call.trailing_metadata()))
-    self.assertIs(grpc.StatusCode.OK, call.code())
-    self.assertEqual(_DETAILS, call.details())
+    def testSuccessfulUnaryStream(self):
+        self._servicer.set_details(_DETAILS)
 
-  def testSuccessfulUnaryStream(self):
-    self._servicer.set_details(_DETAILS)
+        call = self._unary_stream(
+            _SERIALIZED_REQUEST, metadata=_CLIENT_METADATA)
+        received_initial_metadata = call.initial_metadata()
+        for _ in call:
+            pass
 
-    call = self._unary_stream(_SERIALIZED_REQUEST, metadata=_CLIENT_METADATA)
-    received_initial_metadata = call.initial_metadata()
-    for _ in call:
-      pass
+        self.assertTrue(
+            test_common.metadata_transmitted(
+                _CLIENT_METADATA, self._servicer.received_client_metadata()))
+        self.assertTrue(
+            test_common.metadata_transmitted(_SERVER_INITIAL_METADATA,
+                                             received_initial_metadata))
+        self.assertTrue(
+            test_common.metadata_transmitted(_SERVER_TRAILING_METADATA,
+                                             call.trailing_metadata()))
+        self.assertIs(grpc.StatusCode.OK, call.code())
+        self.assertEqual(_DETAILS, call.details())
 
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _CLIENT_METADATA, self._servicer.received_client_metadata()))
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _SERVER_INITIAL_METADATA, received_initial_metadata))
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _SERVER_TRAILING_METADATA, call.trailing_metadata()))
-    self.assertIs(grpc.StatusCode.OK, call.code())
-    self.assertEqual(_DETAILS, call.details())
+    def testSuccessfulStreamUnary(self):
+        self._servicer.set_details(_DETAILS)
 
-  def testSuccessfulStreamUnary(self):
-    self._servicer.set_details(_DETAILS)
+        unused_response, call = self._stream_unary.with_call(
+            iter([_SERIALIZED_REQUEST] * test_constants.STREAM_LENGTH),
+            metadata=_CLIENT_METADATA)
 
-    unused_response, call = self._stream_unary.with_call(
-        iter([_SERIALIZED_REQUEST] * test_constants.STREAM_LENGTH),
-        metadata=_CLIENT_METADATA)
+        self.assertTrue(
+            test_common.metadata_transmitted(
+                _CLIENT_METADATA, self._servicer.received_client_metadata()))
+        self.assertTrue(
+            test_common.metadata_transmitted(_SERVER_INITIAL_METADATA,
+                                             call.initial_metadata()))
+        self.assertTrue(
+            test_common.metadata_transmitted(_SERVER_TRAILING_METADATA,
+                                             call.trailing_metadata()))
+        self.assertIs(grpc.StatusCode.OK, call.code())
+        self.assertEqual(_DETAILS, call.details())
 
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _CLIENT_METADATA, self._servicer.received_client_metadata()))
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _SERVER_INITIAL_METADATA, call.initial_metadata()))
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _SERVER_TRAILING_METADATA, call.trailing_metadata()))
-    self.assertIs(grpc.StatusCode.OK, call.code())
-    self.assertEqual(_DETAILS, call.details())
+    def testSuccessfulStreamStream(self):
+        self._servicer.set_details(_DETAILS)
 
-  def testSuccessfulStreamStream(self):
-    self._servicer.set_details(_DETAILS)
+        call = self._stream_stream(
+            iter([object()] * test_constants.STREAM_LENGTH),
+            metadata=_CLIENT_METADATA)
+        received_initial_metadata = call.initial_metadata()
+        for _ in call:
+            pass
 
-    call = self._stream_stream(
-        iter([object()] * test_constants.STREAM_LENGTH),
-        metadata=_CLIENT_METADATA)
-    received_initial_metadata = call.initial_metadata()
-    for _ in call:
-      pass
+        self.assertTrue(
+            test_common.metadata_transmitted(
+                _CLIENT_METADATA, self._servicer.received_client_metadata()))
+        self.assertTrue(
+            test_common.metadata_transmitted(_SERVER_INITIAL_METADATA,
+                                             received_initial_metadata))
+        self.assertTrue(
+            test_common.metadata_transmitted(_SERVER_TRAILING_METADATA,
+                                             call.trailing_metadata()))
+        self.assertIs(grpc.StatusCode.OK, call.code())
+        self.assertEqual(_DETAILS, call.details())
 
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _CLIENT_METADATA, self._servicer.received_client_metadata()))
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _SERVER_INITIAL_METADATA, received_initial_metadata))
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _SERVER_TRAILING_METADATA, call.trailing_metadata()))
-    self.assertIs(grpc.StatusCode.OK, call.code())
-    self.assertEqual(_DETAILS, call.details())
+    def testCustomCodeUnaryUnary(self):
+        self._servicer.set_code(_NON_OK_CODE)
+        self._servicer.set_details(_DETAILS)
 
-  def testCustomCodeUnaryUnary(self):
-    self._servicer.set_code(_NON_OK_CODE)
-    self._servicer.set_details(_DETAILS)
+        with self.assertRaises(grpc.RpcError) as exception_context:
+            self._unary_unary.with_call(object(), metadata=_CLIENT_METADATA)
 
-    with self.assertRaises(grpc.RpcError) as exception_context:
-      self._unary_unary.with_call(object(), metadata=_CLIENT_METADATA)
+        self.assertTrue(
+            test_common.metadata_transmitted(
+                _CLIENT_METADATA, self._servicer.received_client_metadata()))
+        self.assertTrue(
+            test_common.metadata_transmitted(
+                _SERVER_INITIAL_METADATA,
+                exception_context.exception.initial_metadata()))
+        self.assertTrue(
+            test_common.metadata_transmitted(
+                _SERVER_TRAILING_METADATA,
+                exception_context.exception.trailing_metadata()))
+        self.assertIs(_NON_OK_CODE, exception_context.exception.code())
+        self.assertEqual(_DETAILS, exception_context.exception.details())
 
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _CLIENT_METADATA, self._servicer.received_client_metadata()))
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _SERVER_INITIAL_METADATA,
-            exception_context.exception.initial_metadata()))
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _SERVER_TRAILING_METADATA,
-            exception_context.exception.trailing_metadata()))
-    self.assertIs(_NON_OK_CODE, exception_context.exception.code())
-    self.assertEqual(_DETAILS, exception_context.exception.details())
+    def testCustomCodeUnaryStream(self):
+        self._servicer.set_code(_NON_OK_CODE)
+        self._servicer.set_details(_DETAILS)
 
-  def testCustomCodeUnaryStream(self):
-    self._servicer.set_code(_NON_OK_CODE)
-    self._servicer.set_details(_DETAILS)
+        call = self._unary_stream(
+            _SERIALIZED_REQUEST, metadata=_CLIENT_METADATA)
+        received_initial_metadata = call.initial_metadata()
+        with self.assertRaises(grpc.RpcError):
+            for _ in call:
+                pass
 
-    call = self._unary_stream(_SERIALIZED_REQUEST, metadata=_CLIENT_METADATA)
-    received_initial_metadata = call.initial_metadata()
-    with self.assertRaises(grpc.RpcError):
-      for _ in call:
-        pass
+        self.assertTrue(
+            test_common.metadata_transmitted(
+                _CLIENT_METADATA, self._servicer.received_client_metadata()))
+        self.assertTrue(
+            test_common.metadata_transmitted(_SERVER_INITIAL_METADATA,
+                                             received_initial_metadata))
+        self.assertTrue(
+            test_common.metadata_transmitted(_SERVER_TRAILING_METADATA,
+                                             call.trailing_metadata()))
+        self.assertIs(_NON_OK_CODE, call.code())
+        self.assertEqual(_DETAILS, call.details())
 
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _CLIENT_METADATA, self._servicer.received_client_metadata()))
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _SERVER_INITIAL_METADATA, received_initial_metadata))
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _SERVER_TRAILING_METADATA, call.trailing_metadata()))
-    self.assertIs(_NON_OK_CODE, call.code())
-    self.assertEqual(_DETAILS, call.details())
+    def testCustomCodeStreamUnary(self):
+        self._servicer.set_code(_NON_OK_CODE)
+        self._servicer.set_details(_DETAILS)
 
-  def testCustomCodeStreamUnary(self):
-    self._servicer.set_code(_NON_OK_CODE)
-    self._servicer.set_details(_DETAILS)
+        with self.assertRaises(grpc.RpcError) as exception_context:
+            self._stream_unary.with_call(
+                iter([_SERIALIZED_REQUEST] * test_constants.STREAM_LENGTH),
+                metadata=_CLIENT_METADATA)
 
-    with self.assertRaises(grpc.RpcError) as exception_context:
-      self._stream_unary.with_call(
-          iter([_SERIALIZED_REQUEST] * test_constants.STREAM_LENGTH),
-          metadata=_CLIENT_METADATA)
+        self.assertTrue(
+            test_common.metadata_transmitted(
+                _CLIENT_METADATA, self._servicer.received_client_metadata()))
+        self.assertTrue(
+            test_common.metadata_transmitted(
+                _SERVER_INITIAL_METADATA,
+                exception_context.exception.initial_metadata()))
+        self.assertTrue(
+            test_common.metadata_transmitted(
+                _SERVER_TRAILING_METADATA,
+                exception_context.exception.trailing_metadata()))
+        self.assertIs(_NON_OK_CODE, exception_context.exception.code())
+        self.assertEqual(_DETAILS, exception_context.exception.details())
 
-    self.assertTrue(
-        test_common.metadata_transmitted(
-          _CLIENT_METADATA, self._servicer.received_client_metadata()))
-    self.assertTrue(
-        test_common.metadata_transmitted(
-          _SERVER_INITIAL_METADATA,
-          exception_context.exception.initial_metadata()))
-    self.assertTrue(
-        test_common.metadata_transmitted(
-          _SERVER_TRAILING_METADATA,
-          exception_context.exception.trailing_metadata()))
-    self.assertIs(_NON_OK_CODE, exception_context.exception.code())
-    self.assertEqual(_DETAILS, exception_context.exception.details())
+    def testCustomCodeStreamStream(self):
+        self._servicer.set_code(_NON_OK_CODE)
+        self._servicer.set_details(_DETAILS)
 
-  def testCustomCodeStreamStream(self):
-    self._servicer.set_code(_NON_OK_CODE)
-    self._servicer.set_details(_DETAILS)
+        call = self._stream_stream(
+            iter([object()] * test_constants.STREAM_LENGTH),
+            metadata=_CLIENT_METADATA)
+        received_initial_metadata = call.initial_metadata()
+        with self.assertRaises(grpc.RpcError) as exception_context:
+            for _ in call:
+                pass
 
-    call = self._stream_stream(
-        iter([object()] * test_constants.STREAM_LENGTH),
-        metadata=_CLIENT_METADATA)
-    received_initial_metadata = call.initial_metadata()
-    with self.assertRaises(grpc.RpcError) as exception_context:
-      for _ in call:
-        pass
+        self.assertTrue(
+            test_common.metadata_transmitted(
+                _CLIENT_METADATA, self._servicer.received_client_metadata()))
+        self.assertTrue(
+            test_common.metadata_transmitted(_SERVER_INITIAL_METADATA,
+                                             received_initial_metadata))
+        self.assertTrue(
+            test_common.metadata_transmitted(
+                _SERVER_TRAILING_METADATA,
+                exception_context.exception.trailing_metadata()))
+        self.assertIs(_NON_OK_CODE, exception_context.exception.code())
+        self.assertEqual(_DETAILS, exception_context.exception.details())
 
-    self.assertTrue(
-        test_common.metadata_transmitted(
-          _CLIENT_METADATA, self._servicer.received_client_metadata()))
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _SERVER_INITIAL_METADATA, received_initial_metadata))
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _SERVER_TRAILING_METADATA,
-            exception_context.exception.trailing_metadata()))
-    self.assertIs(_NON_OK_CODE, exception_context.exception.code())
-    self.assertEqual(_DETAILS, exception_context.exception.details())
+    def testCustomCodeExceptionUnaryUnary(self):
+        self._servicer.set_code(_NON_OK_CODE)
+        self._servicer.set_details(_DETAILS)
+        self._servicer.set_exception()
 
-  def testCustomCodeExceptionUnaryUnary(self):
-    self._servicer.set_code(_NON_OK_CODE)
-    self._servicer.set_details(_DETAILS)
-    self._servicer.set_exception()
+        with self.assertRaises(grpc.RpcError) as exception_context:
+            self._unary_unary.with_call(object(), metadata=_CLIENT_METADATA)
 
-    with self.assertRaises(grpc.RpcError) as exception_context:
-     self._unary_unary.with_call(object(), metadata=_CLIENT_METADATA)
+        self.assertTrue(
+            test_common.metadata_transmitted(
+                _CLIENT_METADATA, self._servicer.received_client_metadata()))
+        self.assertTrue(
+            test_common.metadata_transmitted(
+                _SERVER_INITIAL_METADATA,
+                exception_context.exception.initial_metadata()))
+        self.assertTrue(
+            test_common.metadata_transmitted(
+                _SERVER_TRAILING_METADATA,
+                exception_context.exception.trailing_metadata()))
+        self.assertIs(_NON_OK_CODE, exception_context.exception.code())
+        self.assertEqual(_DETAILS, exception_context.exception.details())
 
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _CLIENT_METADATA, self._servicer.received_client_metadata()))
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _SERVER_INITIAL_METADATA,
-            exception_context.exception.initial_metadata()))
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _SERVER_TRAILING_METADATA,
-            exception_context.exception.trailing_metadata()))
-    self.assertIs(_NON_OK_CODE, exception_context.exception.code())
-    self.assertEqual(_DETAILS, exception_context.exception.details())
+    def testCustomCodeExceptionUnaryStream(self):
+        self._servicer.set_code(_NON_OK_CODE)
+        self._servicer.set_details(_DETAILS)
+        self._servicer.set_exception()
 
-  def testCustomCodeExceptionUnaryStream(self):
-    self._servicer.set_code(_NON_OK_CODE)
-    self._servicer.set_details(_DETAILS)
-    self._servicer.set_exception()
+        call = self._unary_stream(
+            _SERIALIZED_REQUEST, metadata=_CLIENT_METADATA)
+        received_initial_metadata = call.initial_metadata()
+        with self.assertRaises(grpc.RpcError):
+            for _ in call:
+                pass
 
-    call = self._unary_stream(_SERIALIZED_REQUEST, metadata=_CLIENT_METADATA)
-    received_initial_metadata = call.initial_metadata()
-    with self.assertRaises(grpc.RpcError):
-      for _ in call:
-        pass
+        self.assertTrue(
+            test_common.metadata_transmitted(
+                _CLIENT_METADATA, self._servicer.received_client_metadata()))
+        self.assertTrue(
+            test_common.metadata_transmitted(_SERVER_INITIAL_METADATA,
+                                             received_initial_metadata))
+        self.assertTrue(
+            test_common.metadata_transmitted(_SERVER_TRAILING_METADATA,
+                                             call.trailing_metadata()))
+        self.assertIs(_NON_OK_CODE, call.code())
+        self.assertEqual(_DETAILS, call.details())
 
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _CLIENT_METADATA, self._servicer.received_client_metadata()))
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _SERVER_INITIAL_METADATA, received_initial_metadata))
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _SERVER_TRAILING_METADATA, call.trailing_metadata()))
-    self.assertIs(_NON_OK_CODE, call.code())
-    self.assertEqual(_DETAILS, call.details())
+    def testCustomCodeExceptionStreamUnary(self):
+        self._servicer.set_code(_NON_OK_CODE)
+        self._servicer.set_details(_DETAILS)
+        self._servicer.set_exception()
 
-  def testCustomCodeExceptionStreamUnary(self):
-    self._servicer.set_code(_NON_OK_CODE)
-    self._servicer.set_details(_DETAILS)
-    self._servicer.set_exception()
+        with self.assertRaises(grpc.RpcError) as exception_context:
+            self._stream_unary.with_call(
+                iter([_SERIALIZED_REQUEST] * test_constants.STREAM_LENGTH),
+                metadata=_CLIENT_METADATA)
 
-    with self.assertRaises(grpc.RpcError) as exception_context:
-      self._stream_unary.with_call(
-          iter([_SERIALIZED_REQUEST] * test_constants.STREAM_LENGTH),
-          metadata=_CLIENT_METADATA)
+        self.assertTrue(
+            test_common.metadata_transmitted(
+                _CLIENT_METADATA, self._servicer.received_client_metadata()))
+        self.assertTrue(
+            test_common.metadata_transmitted(
+                _SERVER_INITIAL_METADATA,
+                exception_context.exception.initial_metadata()))
+        self.assertTrue(
+            test_common.metadata_transmitted(
+                _SERVER_TRAILING_METADATA,
+                exception_context.exception.trailing_metadata()))
+        self.assertIs(_NON_OK_CODE, exception_context.exception.code())
+        self.assertEqual(_DETAILS, exception_context.exception.details())
 
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _CLIENT_METADATA, self._servicer.received_client_metadata()))
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _SERVER_INITIAL_METADATA,
-            exception_context.exception.initial_metadata()))
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _SERVER_TRAILING_METADATA,
-            exception_context.exception.trailing_metadata()))
-    self.assertIs(_NON_OK_CODE, exception_context.exception.code())
-    self.assertEqual(_DETAILS, exception_context.exception.details())
+    def testCustomCodeExceptionStreamStream(self):
+        self._servicer.set_code(_NON_OK_CODE)
+        self._servicer.set_details(_DETAILS)
+        self._servicer.set_exception()
 
-  def testCustomCodeExceptionStreamStream(self):
-    self._servicer.set_code(_NON_OK_CODE)
-    self._servicer.set_details(_DETAILS)
-    self._servicer.set_exception()
+        call = self._stream_stream(
+            iter([object()] * test_constants.STREAM_LENGTH),
+            metadata=_CLIENT_METADATA)
+        received_initial_metadata = call.initial_metadata()
+        with self.assertRaises(grpc.RpcError):
+            for _ in call:
+                pass
 
-    call = self._stream_stream(
-        iter([object()] * test_constants.STREAM_LENGTH),
-        metadata=_CLIENT_METADATA)
-    received_initial_metadata = call.initial_metadata()
-    with self.assertRaises(grpc.RpcError):
-      for _ in call:
-        pass
+        self.assertTrue(
+            test_common.metadata_transmitted(
+                _CLIENT_METADATA, self._servicer.received_client_metadata()))
+        self.assertTrue(
+            test_common.metadata_transmitted(_SERVER_INITIAL_METADATA,
+                                             received_initial_metadata))
+        self.assertTrue(
+            test_common.metadata_transmitted(_SERVER_TRAILING_METADATA,
+                                             call.trailing_metadata()))
+        self.assertIs(_NON_OK_CODE, call.code())
+        self.assertEqual(_DETAILS, call.details())
 
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _CLIENT_METADATA, self._servicer.received_client_metadata()))
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _SERVER_INITIAL_METADATA, received_initial_metadata))
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _SERVER_TRAILING_METADATA, call.trailing_metadata()))
-    self.assertIs(_NON_OK_CODE, call.code())
-    self.assertEqual(_DETAILS, call.details())
+    def testCustomCodeReturnNoneUnaryUnary(self):
+        self._servicer.set_code(_NON_OK_CODE)
+        self._servicer.set_details(_DETAILS)
+        self._servicer.set_return_none()
 
-  def testCustomCodeReturnNoneUnaryUnary(self):
-    self._servicer.set_code(_NON_OK_CODE)
-    self._servicer.set_details(_DETAILS)
-    self._servicer.set_return_none()
+        with self.assertRaises(grpc.RpcError) as exception_context:
+            self._unary_unary.with_call(object(), metadata=_CLIENT_METADATA)
 
-    with self.assertRaises(grpc.RpcError) as exception_context:
-      self._unary_unary.with_call(object(), metadata=_CLIENT_METADATA)
+        self.assertTrue(
+            test_common.metadata_transmitted(
+                _CLIENT_METADATA, self._servicer.received_client_metadata()))
+        self.assertTrue(
+            test_common.metadata_transmitted(
+                _SERVER_INITIAL_METADATA,
+                exception_context.exception.initial_metadata()))
+        self.assertTrue(
+            test_common.metadata_transmitted(
+                _SERVER_TRAILING_METADATA,
+                exception_context.exception.trailing_metadata()))
+        self.assertIs(_NON_OK_CODE, exception_context.exception.code())
+        self.assertEqual(_DETAILS, exception_context.exception.details())
 
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _CLIENT_METADATA, self._servicer.received_client_metadata()))
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _SERVER_INITIAL_METADATA,
-            exception_context.exception.initial_metadata()))
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _SERVER_TRAILING_METADATA,
-            exception_context.exception.trailing_metadata()))
-    self.assertIs(_NON_OK_CODE, exception_context.exception.code())
-    self.assertEqual(_DETAILS, exception_context.exception.details())
+    def testCustomCodeReturnNoneStreamUnary(self):
+        self._servicer.set_code(_NON_OK_CODE)
+        self._servicer.set_details(_DETAILS)
+        self._servicer.set_return_none()
 
-  def testCustomCodeReturnNoneStreamUnary(self):
-    self._servicer.set_code(_NON_OK_CODE)
-    self._servicer.set_details(_DETAILS)
-    self._servicer.set_return_none()
+        with self.assertRaises(grpc.RpcError) as exception_context:
+            self._stream_unary.with_call(
+                iter([_SERIALIZED_REQUEST] * test_constants.STREAM_LENGTH),
+                metadata=_CLIENT_METADATA)
 
-    with self.assertRaises(grpc.RpcError) as exception_context:
-      self._stream_unary.with_call(
-          iter([_SERIALIZED_REQUEST] * test_constants.STREAM_LENGTH),
-          metadata=_CLIENT_METADATA)
-
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _CLIENT_METADATA, self._servicer.received_client_metadata()))
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _SERVER_INITIAL_METADATA,
-            exception_context.exception.initial_metadata()))
-    self.assertTrue(
-        test_common.metadata_transmitted(
-            _SERVER_TRAILING_METADATA,
-            exception_context.exception.trailing_metadata()))
-    self.assertIs(_NON_OK_CODE, exception_context.exception.code())
-    self.assertEqual(_DETAILS, exception_context.exception.details())
+        self.assertTrue(
+            test_common.metadata_transmitted(
+                _CLIENT_METADATA, self._servicer.received_client_metadata()))
+        self.assertTrue(
+            test_common.metadata_transmitted(
+                _SERVER_INITIAL_METADATA,
+                exception_context.exception.initial_metadata()))
+        self.assertTrue(
+            test_common.metadata_transmitted(
+                _SERVER_TRAILING_METADATA,
+                exception_context.exception.trailing_metadata()))
+        self.assertIs(_NON_OK_CODE, exception_context.exception.code())
+        self.assertEqual(_DETAILS, exception_context.exception.details())
 
 
 if __name__ == '__main__':
-  unittest.main(verbosity=2)
+    unittest.main(verbosity=2)
diff --git a/src/python/grpcio_tests/tests/unit/_metadata_test.py b/src/python/grpcio_tests/tests/unit/_metadata_test.py
index caba53f..53fe7ba 100644
--- a/src/python/grpcio_tests/tests/unit/_metadata_test.py
+++ b/src/python/grpcio_tests/tests/unit/_metadata_test.py
@@ -51,166 +51,174 @@
 
 _USER_AGENT = 'Python-gRPC-{}'.format(_grpcio_metadata.__version__)
 
-_CLIENT_METADATA = (
-    ('client-md-key', 'client-md-key'),
-    ('client-md-key-bin', b'\x00\x01')
-)
+_CLIENT_METADATA = (('client-md-key', 'client-md-key'),
+                    ('client-md-key-bin', b'\x00\x01'))
 
 _SERVER_INITIAL_METADATA = (
     ('server-initial-md-key', 'server-initial-md-value'),
-    ('server-initial-md-key-bin', b'\x00\x02')
-)
+    ('server-initial-md-key-bin', b'\x00\x02'))
 
 _SERVER_TRAILING_METADATA = (
     ('server-trailing-md-key', 'server-trailing-md-value'),
-    ('server-trailing-md-key-bin', b'\x00\x03')
-)
+    ('server-trailing-md-key-bin', b'\x00\x03'))
 
 
 def user_agent(metadata):
-  for key, val in metadata:
-    if key == 'user-agent':
-      return val
-  raise KeyError('No user agent!')
+    for key, val in metadata:
+        if key == 'user-agent':
+            return val
+    raise KeyError('No user agent!')
 
 
 def validate_client_metadata(test, servicer_context):
-  test.assertTrue(test_common.metadata_transmitted(
-      _CLIENT_METADATA, servicer_context.invocation_metadata()))
-  test.assertTrue(user_agent(servicer_context.invocation_metadata())
-                  .startswith('primary-agent ' + _USER_AGENT))
-  test.assertTrue(user_agent(servicer_context.invocation_metadata())
-                  .endswith('secondary-agent'))
+    test.assertTrue(
+        test_common.metadata_transmitted(
+            _CLIENT_METADATA, servicer_context.invocation_metadata()))
+    test.assertTrue(
+        user_agent(servicer_context.invocation_metadata())
+        .startswith('primary-agent ' + _USER_AGENT))
+    test.assertTrue(
+        user_agent(servicer_context.invocation_metadata())
+        .endswith('secondary-agent'))
 
 
 def handle_unary_unary(test, request, servicer_context):
-  validate_client_metadata(test, servicer_context)
-  servicer_context.send_initial_metadata(_SERVER_INITIAL_METADATA)
-  servicer_context.set_trailing_metadata(_SERVER_TRAILING_METADATA)
-  return _RESPONSE
+    validate_client_metadata(test, servicer_context)
+    servicer_context.send_initial_metadata(_SERVER_INITIAL_METADATA)
+    servicer_context.set_trailing_metadata(_SERVER_TRAILING_METADATA)
+    return _RESPONSE
 
 
 def handle_unary_stream(test, request, servicer_context):
-  validate_client_metadata(test, servicer_context)
-  servicer_context.send_initial_metadata(_SERVER_INITIAL_METADATA)
-  servicer_context.set_trailing_metadata(_SERVER_TRAILING_METADATA)
-  for _ in range(test_constants.STREAM_LENGTH):
-    yield _RESPONSE
+    validate_client_metadata(test, servicer_context)
+    servicer_context.send_initial_metadata(_SERVER_INITIAL_METADATA)
+    servicer_context.set_trailing_metadata(_SERVER_TRAILING_METADATA)
+    for _ in range(test_constants.STREAM_LENGTH):
+        yield _RESPONSE
 
 
 def handle_stream_unary(test, request_iterator, servicer_context):
-  validate_client_metadata(test, servicer_context)
-  servicer_context.send_initial_metadata(_SERVER_INITIAL_METADATA)
-  servicer_context.set_trailing_metadata(_SERVER_TRAILING_METADATA)
-  # TODO(issue:#6891) We should be able to remove this loop
-  for request in request_iterator:
-    pass
-  return _RESPONSE
+    validate_client_metadata(test, servicer_context)
+    servicer_context.send_initial_metadata(_SERVER_INITIAL_METADATA)
+    servicer_context.set_trailing_metadata(_SERVER_TRAILING_METADATA)
+    # TODO(issue:#6891) We should be able to remove this loop
+    for request in request_iterator:
+        pass
+    return _RESPONSE
 
 
 def handle_stream_stream(test, request_iterator, servicer_context):
-  validate_client_metadata(test, servicer_context)
-  servicer_context.send_initial_metadata(_SERVER_INITIAL_METADATA)
-  servicer_context.set_trailing_metadata(_SERVER_TRAILING_METADATA)
-  # TODO(issue:#6891) We should be able to remove this loop,
-  # and replace with return; yield
-  for request in request_iterator:
-    yield _RESPONSE
+    validate_client_metadata(test, servicer_context)
+    servicer_context.send_initial_metadata(_SERVER_INITIAL_METADATA)
+    servicer_context.set_trailing_metadata(_SERVER_TRAILING_METADATA)
+    # TODO(issue:#6891) We should be able to remove this loop,
+    # and replace with return; yield
+    for request in request_iterator:
+        yield _RESPONSE
 
 
 class _MethodHandler(grpc.RpcMethodHandler):
 
-  def __init__(self, test, request_streaming, response_streaming):
-    self.request_streaming = request_streaming
-    self.response_streaming = response_streaming
-    self.request_deserializer = None
-    self.response_serializer = None
-    self.unary_unary = None
-    self.unary_stream = None
-    self.stream_unary = None
-    self.stream_stream = None
-    if self.request_streaming and self.response_streaming:
-      self.stream_stream = lambda x, y: handle_stream_stream(test, x, y)
-    elif self.request_streaming:
-      self.stream_unary = lambda x, y: handle_stream_unary(test, x, y)
-    elif self.response_streaming:
-      self.unary_stream = lambda x, y: handle_unary_stream(test, x, y)
-    else:
-      self.unary_unary = lambda x, y: handle_unary_unary(test, x, y)
+    def __init__(self, test, request_streaming, response_streaming):
+        self.request_streaming = request_streaming
+        self.response_streaming = response_streaming
+        self.request_deserializer = None
+        self.response_serializer = None
+        self.unary_unary = None
+        self.unary_stream = None
+        self.stream_unary = None
+        self.stream_stream = None
+        if self.request_streaming and self.response_streaming:
+            self.stream_stream = lambda x, y: handle_stream_stream(test, x, y)
+        elif self.request_streaming:
+            self.stream_unary = lambda x, y: handle_stream_unary(test, x, y)
+        elif self.response_streaming:
+            self.unary_stream = lambda x, y: handle_unary_stream(test, x, y)
+        else:
+            self.unary_unary = lambda x, y: handle_unary_unary(test, x, y)
 
 
 class _GenericHandler(grpc.GenericRpcHandler):
 
-  def __init__(self, test):
-    self._test = test
+    def __init__(self, test):
+        self._test = test
 
-  def service(self, handler_call_details):
-    if handler_call_details.method == _UNARY_UNARY:
-      return _MethodHandler(self._test, False, False)
-    elif handler_call_details.method == _UNARY_STREAM:
-      return _MethodHandler(self._test, False, True)
-    elif handler_call_details.method == _STREAM_UNARY:
-      return _MethodHandler(self._test, True, False)
-    elif handler_call_details.method == _STREAM_STREAM:
-      return _MethodHandler(self._test, True, True)
-    else:
-      return None
+    def service(self, handler_call_details):
+        if handler_call_details.method == _UNARY_UNARY:
+            return _MethodHandler(self._test, False, False)
+        elif handler_call_details.method == _UNARY_STREAM:
+            return _MethodHandler(self._test, False, True)
+        elif handler_call_details.method == _STREAM_UNARY:
+            return _MethodHandler(self._test, True, False)
+        elif handler_call_details.method == _STREAM_STREAM:
+            return _MethodHandler(self._test, True, True)
+        else:
+            return None
 
 
 class MetadataTest(unittest.TestCase):
 
-  def setUp(self):
-    self._server_pool = logging_pool.pool(test_constants.THREAD_CONCURRENCY)
-    self._server = grpc.server(
-        self._server_pool, handlers=(_GenericHandler(weakref.proxy(self)),))
-    port = self._server.add_insecure_port('[::]:0')
-    self._server.start()
-    self._channel = grpc.insecure_channel('localhost:%d' % port,
-                                          options=_CHANNEL_ARGS)
+    def setUp(self):
+        self._server_pool = logging_pool.pool(test_constants.THREAD_CONCURRENCY)
+        self._server = grpc.server(
+            self._server_pool, handlers=(_GenericHandler(weakref.proxy(self)),))
+        port = self._server.add_insecure_port('[::]:0')
+        self._server.start()
+        self._channel = grpc.insecure_channel(
+            'localhost:%d' % port, options=_CHANNEL_ARGS)
 
-  def tearDown(self):
-    self._server.stop(0)
+    def tearDown(self):
+        self._server.stop(0)
 
-  def testUnaryUnary(self):
-    multi_callable = self._channel.unary_unary(_UNARY_UNARY)
-    unused_response, call = multi_callable.with_call(
-        _REQUEST, metadata=_CLIENT_METADATA)
-    self.assertTrue(test_common.metadata_transmitted(
-        _SERVER_INITIAL_METADATA, call.initial_metadata()))
-    self.assertTrue(test_common.metadata_transmitted(
-        _SERVER_TRAILING_METADATA, call.trailing_metadata()))
+    def testUnaryUnary(self):
+        multi_callable = self._channel.unary_unary(_UNARY_UNARY)
+        unused_response, call = multi_callable.with_call(
+            _REQUEST, metadata=_CLIENT_METADATA)
+        self.assertTrue(
+            test_common.metadata_transmitted(_SERVER_INITIAL_METADATA,
+                                             call.initial_metadata()))
+        self.assertTrue(
+            test_common.metadata_transmitted(_SERVER_TRAILING_METADATA,
+                                             call.trailing_metadata()))
 
-  def testUnaryStream(self):
-    multi_callable = self._channel.unary_stream(_UNARY_STREAM)
-    call = multi_callable(_REQUEST, metadata=_CLIENT_METADATA)
-    self.assertTrue(test_common.metadata_transmitted(
-        _SERVER_INITIAL_METADATA, call.initial_metadata()))
-    for _ in call:
-      pass
-    self.assertTrue(test_common.metadata_transmitted(
-        _SERVER_TRAILING_METADATA, call.trailing_metadata()))
+    def testUnaryStream(self):
+        multi_callable = self._channel.unary_stream(_UNARY_STREAM)
+        call = multi_callable(_REQUEST, metadata=_CLIENT_METADATA)
+        self.assertTrue(
+            test_common.metadata_transmitted(_SERVER_INITIAL_METADATA,
+                                             call.initial_metadata()))
+        for _ in call:
+            pass
+        self.assertTrue(
+            test_common.metadata_transmitted(_SERVER_TRAILING_METADATA,
+                                             call.trailing_metadata()))
 
-  def testStreamUnary(self):
-    multi_callable = self._channel.stream_unary(_STREAM_UNARY)
-    unused_response, call = multi_callable.with_call(
-        iter([_REQUEST] * test_constants.STREAM_LENGTH),
-        metadata=_CLIENT_METADATA)
-    self.assertTrue(test_common.metadata_transmitted(
-        _SERVER_INITIAL_METADATA, call.initial_metadata()))
-    self.assertTrue(test_common.metadata_transmitted(
-        _SERVER_TRAILING_METADATA, call.trailing_metadata()))
+    def testStreamUnary(self):
+        multi_callable = self._channel.stream_unary(_STREAM_UNARY)
+        unused_response, call = multi_callable.with_call(
+            iter([_REQUEST] * test_constants.STREAM_LENGTH),
+            metadata=_CLIENT_METADATA)
+        self.assertTrue(
+            test_common.metadata_transmitted(_SERVER_INITIAL_METADATA,
+                                             call.initial_metadata()))
+        self.assertTrue(
+            test_common.metadata_transmitted(_SERVER_TRAILING_METADATA,
+                                             call.trailing_metadata()))
 
-  def testStreamStream(self):
-    multi_callable = self._channel.stream_stream(_STREAM_STREAM)
-    call = multi_callable(iter([_REQUEST] * test_constants.STREAM_LENGTH),
-                          metadata=_CLIENT_METADATA)
-    self.assertTrue(test_common.metadata_transmitted(
-        _SERVER_INITIAL_METADATA, call.initial_metadata()))
-    for _ in call:
-      pass
-    self.assertTrue(test_common.metadata_transmitted(
-        _SERVER_TRAILING_METADATA, call.trailing_metadata()))
+    def testStreamStream(self):
+        multi_callable = self._channel.stream_stream(_STREAM_STREAM)
+        call = multi_callable(
+            iter([_REQUEST] * test_constants.STREAM_LENGTH),
+            metadata=_CLIENT_METADATA)
+        self.assertTrue(
+            test_common.metadata_transmitted(_SERVER_INITIAL_METADATA,
+                                             call.initial_metadata()))
+        for _ in call:
+            pass
+        self.assertTrue(
+            test_common.metadata_transmitted(_SERVER_TRAILING_METADATA,
+                                             call.trailing_metadata()))
 
 
 if __name__ == '__main__':
-  unittest.main(verbosity=2)
+    unittest.main(verbosity=2)
diff --git a/src/python/grpcio_tests/tests/unit/_rpc_test.py b/src/python/grpcio_tests/tests/unit/_rpc_test.py
index eb00156..2b1c85a 100644
--- a/src/python/grpcio_tests/tests/unit/_rpc_test.py
+++ b/src/python/grpcio_tests/tests/unit/_rpc_test.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Test of RPCs made against gRPC Python's application-layer API."""
 
 import itertools
@@ -53,742 +52,802 @@
 
 class _Callback(object):
 
-  def __init__(self):
-    self._condition = threading.Condition()
-    self._value = None
-    self._called = False
+    def __init__(self):
+        self._condition = threading.Condition()
+        self._value = None
+        self._called = False
 
-  def __call__(self, value):
-    with self._condition:
-      self._value = value
-      self._called = True
-      self._condition.notify_all()
+    def __call__(self, value):
+        with self._condition:
+            self._value = value
+            self._called = True
+            self._condition.notify_all()
 
-  def value(self):
-    with self._condition:
-      while not self._called:
-        self._condition.wait()
-      return self._value
+    def value(self):
+        with self._condition:
+            while not self._called:
+                self._condition.wait()
+            return self._value
 
 
 class _Handler(object):
 
-  def __init__(self, control):
-    self._control = control
+    def __init__(self, control):
+        self._control = control
 
-  def handle_unary_unary(self, request, servicer_context):
-    self._control.control()
-    if servicer_context is not None:
-      servicer_context.set_trailing_metadata((('testkey', 'testvalue',),))
-    return request
+    def handle_unary_unary(self, request, servicer_context):
+        self._control.control()
+        if servicer_context is not None:
+            servicer_context.set_trailing_metadata(((
+                'testkey',
+                'testvalue',),))
+            # TODO(https://github.com/grpc/grpc/issues/8483): test the values
+            # returned by these methods rather than only "smoke" testing that
+            # the return after having been called.
+            servicer_context.is_active()
+            servicer_context.time_remaining()
+        return request
 
-  def handle_unary_stream(self, request, servicer_context):
-    for _ in range(test_constants.STREAM_LENGTH):
-      self._control.control()
-      yield request
-    self._control.control()
-    if servicer_context is not None:
-      servicer_context.set_trailing_metadata((('testkey', 'testvalue',),))
+    def handle_unary_stream(self, request, servicer_context):
+        for _ in range(test_constants.STREAM_LENGTH):
+            self._control.control()
+            yield request
+        self._control.control()
+        if servicer_context is not None:
+            servicer_context.set_trailing_metadata(((
+                'testkey',
+                'testvalue',),))
 
-  def handle_stream_unary(self, request_iterator, servicer_context):
-    if servicer_context is not None:
-      servicer_context.invocation_metadata()
-    self._control.control()
-    response_elements = []
-    for request in request_iterator:
-      self._control.control()
-      response_elements.append(request)
-    self._control.control()
-    if servicer_context is not None:
-      servicer_context.set_trailing_metadata((('testkey', 'testvalue',),))
-    return b''.join(response_elements)
+    def handle_stream_unary(self, request_iterator, servicer_context):
+        if servicer_context is not None:
+            servicer_context.invocation_metadata()
+        self._control.control()
+        response_elements = []
+        for request in request_iterator:
+            self._control.control()
+            response_elements.append(request)
+        self._control.control()
+        if servicer_context is not None:
+            servicer_context.set_trailing_metadata(((
+                'testkey',
+                'testvalue',),))
+        return b''.join(response_elements)
 
-  def handle_stream_stream(self, request_iterator, servicer_context):
-    self._control.control()
-    if servicer_context is not None:
-      servicer_context.set_trailing_metadata((('testkey', 'testvalue',),))
-    for request in request_iterator:
-      self._control.control()
-      yield request
-    self._control.control()
+    def handle_stream_stream(self, request_iterator, servicer_context):
+        self._control.control()
+        if servicer_context is not None:
+            servicer_context.set_trailing_metadata(((
+                'testkey',
+                'testvalue',),))
+        for request in request_iterator:
+            self._control.control()
+            yield request
+        self._control.control()
 
 
 class _MethodHandler(grpc.RpcMethodHandler):
 
-  def __init__(
-      self, request_streaming, response_streaming, request_deserializer,
-      response_serializer, unary_unary, unary_stream, stream_unary,
-      stream_stream):
-    self.request_streaming = request_streaming
-    self.response_streaming = response_streaming
-    self.request_deserializer = request_deserializer
-    self.response_serializer = response_serializer
-    self.unary_unary = unary_unary
-    self.unary_stream = unary_stream
-    self.stream_unary = stream_unary
-    self.stream_stream = stream_stream
+    def __init__(self, request_streaming, response_streaming,
+                 request_deserializer, response_serializer, unary_unary,
+                 unary_stream, stream_unary, stream_stream):
+        self.request_streaming = request_streaming
+        self.response_streaming = response_streaming
+        self.request_deserializer = request_deserializer
+        self.response_serializer = response_serializer
+        self.unary_unary = unary_unary
+        self.unary_stream = unary_stream
+        self.stream_unary = stream_unary
+        self.stream_stream = stream_stream
 
 
 class _GenericHandler(grpc.GenericRpcHandler):
 
-  def __init__(self, handler):
-    self._handler = handler
+    def __init__(self, handler):
+        self._handler = handler
 
-  def service(self, handler_call_details):
-    if handler_call_details.method == _UNARY_UNARY:
-      return _MethodHandler(
-          False, False, None, None, self._handler.handle_unary_unary, None,
-          None, None)
-    elif handler_call_details.method == _UNARY_STREAM:
-      return _MethodHandler(
-        False, True, _DESERIALIZE_REQUEST, _SERIALIZE_RESPONSE, None,
-        self._handler.handle_unary_stream, None, None)
-    elif handler_call_details.method == _STREAM_UNARY:
-      return _MethodHandler(
-          True, False, _DESERIALIZE_REQUEST, _SERIALIZE_RESPONSE, None, None,
-          self._handler.handle_stream_unary, None)
-    elif handler_call_details.method == _STREAM_STREAM:
-      return _MethodHandler(
-          True, True, None, None, None, None, None,
-          self._handler.handle_stream_stream)
-    else:
-      return None
+    def service(self, handler_call_details):
+        if handler_call_details.method == _UNARY_UNARY:
+            return _MethodHandler(False, False, None, None,
+                                  self._handler.handle_unary_unary, None, None,
+                                  None)
+        elif handler_call_details.method == _UNARY_STREAM:
+            return _MethodHandler(False, True, _DESERIALIZE_REQUEST,
+                                  _SERIALIZE_RESPONSE, None,
+                                  self._handler.handle_unary_stream, None, None)
+        elif handler_call_details.method == _STREAM_UNARY:
+            return _MethodHandler(True, False, _DESERIALIZE_REQUEST,
+                                  _SERIALIZE_RESPONSE, None, None,
+                                  self._handler.handle_stream_unary, None)
+        elif handler_call_details.method == _STREAM_STREAM:
+            return _MethodHandler(True, True, None, None, None, None, None,
+                                  self._handler.handle_stream_stream)
+        else:
+            return None
 
 
 def _unary_unary_multi_callable(channel):
-  return channel.unary_unary(_UNARY_UNARY)
+    return channel.unary_unary(_UNARY_UNARY)
 
 
 def _unary_stream_multi_callable(channel):
-  return channel.unary_stream(
-      _UNARY_STREAM,
-      request_serializer=_SERIALIZE_REQUEST,
-      response_deserializer=_DESERIALIZE_RESPONSE)
+    return channel.unary_stream(
+        _UNARY_STREAM,
+        request_serializer=_SERIALIZE_REQUEST,
+        response_deserializer=_DESERIALIZE_RESPONSE)
 
 
 def _stream_unary_multi_callable(channel):
-  return channel.stream_unary(
-      _STREAM_UNARY,
-      request_serializer=_SERIALIZE_REQUEST,
-      response_deserializer=_DESERIALIZE_RESPONSE)
+    return channel.stream_unary(
+        _STREAM_UNARY,
+        request_serializer=_SERIALIZE_REQUEST,
+        response_deserializer=_DESERIALIZE_RESPONSE)
 
 
 def _stream_stream_multi_callable(channel):
-  return channel.stream_stream(_STREAM_STREAM)
+    return channel.stream_stream(_STREAM_STREAM)
 
 
 class RPCTest(unittest.TestCase):
 
-  def setUp(self):
-    self._control = test_control.PauseFailControl()
-    self._handler = _Handler(self._control)
-    self._server_pool = logging_pool.pool(test_constants.THREAD_CONCURRENCY)
+    def setUp(self):
+        self._control = test_control.PauseFailControl()
+        self._handler = _Handler(self._control)
+        self._server_pool = logging_pool.pool(test_constants.THREAD_CONCURRENCY)
 
-    self._server = grpc.server(self._server_pool)
-    port = self._server.add_insecure_port('[::]:0')
-    self._server.add_generic_rpc_handlers((_GenericHandler(self._handler),))
-    self._server.start()
+        self._server = grpc.server(self._server_pool)
+        port = self._server.add_insecure_port('[::]:0')
+        self._server.add_generic_rpc_handlers((_GenericHandler(self._handler),))
+        self._server.start()
 
-    self._channel = grpc.insecure_channel('localhost:%d' % port)
+        self._channel = grpc.insecure_channel('localhost:%d' % port)
 
-  def tearDown(self):
-    self._server.stop(None)
-    self._server_pool.shutdown(wait=True)
+    def tearDown(self):
+        self._server.stop(None)
+        self._server_pool.shutdown(wait=True)
 
-  def testUnrecognizedMethod(self):
-    request = b'abc'
+    def testUnrecognizedMethod(self):
+        request = b'abc'
 
-    with self.assertRaises(grpc.RpcError) as exception_context:
-      self._channel.unary_unary('NoSuchMethod')(request)
+        with self.assertRaises(grpc.RpcError) as exception_context:
+            self._channel.unary_unary('NoSuchMethod')(request)
 
-    self.assertEqual(
-        grpc.StatusCode.UNIMPLEMENTED, exception_context.exception.code())
+        self.assertEqual(grpc.StatusCode.UNIMPLEMENTED,
+                         exception_context.exception.code())
 
-  def testSuccessfulUnaryRequestBlockingUnaryResponse(self):
-    request = b'\x07\x08'
-    expected_response = self._handler.handle_unary_unary(request, None)
+    def testSuccessfulUnaryRequestBlockingUnaryResponse(self):
+        request = b'\x07\x08'
+        expected_response = self._handler.handle_unary_unary(request, None)
 
-    multi_callable = _unary_unary_multi_callable(self._channel)
-    response = multi_callable(
-        request, metadata=(
-            ('test', 'SuccessfulUnaryRequestBlockingUnaryResponse'),))
-
-    self.assertEqual(expected_response, response)
-
-  def testSuccessfulUnaryRequestBlockingUnaryResponseWithCall(self):
-    request = b'\x07\x08'
-    expected_response = self._handler.handle_unary_unary(request, None)
-
-    multi_callable = _unary_unary_multi_callable(self._channel)
-    response, call = multi_callable.with_call(
-        request, metadata=(
-            ('test', 'SuccessfulUnaryRequestBlockingUnaryResponseWithCall'),))
-
-    self.assertEqual(expected_response, response)
-    self.assertIs(grpc.StatusCode.OK, call.code())
-
-  def testSuccessfulUnaryRequestFutureUnaryResponse(self):
-    request = b'\x07\x08'
-    expected_response = self._handler.handle_unary_unary(request, None)
-
-    multi_callable = _unary_unary_multi_callable(self._channel)
-    response_future = multi_callable.future(
-        request, metadata=(
-            ('test', 'SuccessfulUnaryRequestFutureUnaryResponse'),))
-    response = response_future.result()
-
-    self.assertIsInstance(response_future, grpc.Future)
-    self.assertIsInstance(response_future, grpc.Call)
-    self.assertEqual(expected_response, response)
-    self.assertIsNone(response_future.exception())
-    self.assertIsNone(response_future.traceback())
-
-  def testSuccessfulUnaryRequestStreamResponse(self):
-    request = b'\x37\x58'
-    expected_responses = tuple(self._handler.handle_unary_stream(request, None))
-
-    multi_callable = _unary_stream_multi_callable(self._channel)
-    response_iterator = multi_callable(
-        request,
-        metadata=(('test', 'SuccessfulUnaryRequestStreamResponse'),))
-    responses = tuple(response_iterator)
-
-    self.assertSequenceEqual(expected_responses, responses)
-
-  def testSuccessfulStreamRequestBlockingUnaryResponse(self):
-    requests = tuple(b'\x07\x08' for _ in range(test_constants.STREAM_LENGTH))
-    expected_response = self._handler.handle_stream_unary(iter(requests), None)
-    request_iterator = iter(requests)
-
-    multi_callable = _stream_unary_multi_callable(self._channel)
-    response = multi_callable(
-        request_iterator,
-        metadata=(('test', 'SuccessfulStreamRequestBlockingUnaryResponse'),))
-
-    self.assertEqual(expected_response, response)
-
-  def testSuccessfulStreamRequestBlockingUnaryResponseWithCall(self):
-    requests = tuple(b'\x07\x08' for _ in range(test_constants.STREAM_LENGTH))
-    expected_response = self._handler.handle_stream_unary(iter(requests), None)
-    request_iterator = iter(requests)
-
-    multi_callable = _stream_unary_multi_callable(self._channel)
-    response, call = multi_callable.with_call(
-        request_iterator,
-        metadata=(
-            ('test', 'SuccessfulStreamRequestBlockingUnaryResponseWithCall'),
-        ))
-
-    self.assertEqual(expected_response, response)
-    self.assertIs(grpc.StatusCode.OK, call.code())
-
-  def testSuccessfulStreamRequestFutureUnaryResponse(self):
-    requests = tuple(b'\x07\x08' for _ in range(test_constants.STREAM_LENGTH))
-    expected_response = self._handler.handle_stream_unary(iter(requests), None)
-    request_iterator = iter(requests)
-
-    multi_callable = _stream_unary_multi_callable(self._channel)
-    response_future = multi_callable.future(
-        request_iterator,
-        metadata=(
-            ('test', 'SuccessfulStreamRequestFutureUnaryResponse'),))
-    response = response_future.result()
-
-    self.assertEqual(expected_response, response)
-    self.assertIsNone(response_future.exception())
-    self.assertIsNone(response_future.traceback())
-
-  def testSuccessfulStreamRequestStreamResponse(self):
-    requests = tuple(b'\x77\x58' for _ in range(test_constants.STREAM_LENGTH))
-    expected_responses = tuple(
-        self._handler.handle_stream_stream(iter(requests), None))
-    request_iterator = iter(requests)
-
-    multi_callable = _stream_stream_multi_callable(self._channel)
-    response_iterator = multi_callable(
-        request_iterator,
-        metadata=(('test', 'SuccessfulStreamRequestStreamResponse'),))
-    responses = tuple(response_iterator)
-
-    self.assertSequenceEqual(expected_responses, responses)
-
-  def testSequentialInvocations(self):
-    first_request = b'\x07\x08'
-    second_request = b'\x0809'
-    expected_first_response = self._handler.handle_unary_unary(
-        first_request, None)
-    expected_second_response = self._handler.handle_unary_unary(
-        second_request, None)
-
-    multi_callable = _unary_unary_multi_callable(self._channel)
-    first_response = multi_callable(
-        first_request, metadata=(('test', 'SequentialInvocations'),))
-    second_response = multi_callable(
-        second_request, metadata=(('test', 'SequentialInvocations'),))
-
-    self.assertEqual(expected_first_response, first_response)
-    self.assertEqual(expected_second_response, second_response)
-
-  def testConcurrentBlockingInvocations(self):
-    pool = logging_pool.pool(test_constants.THREAD_CONCURRENCY)
-    requests = tuple(b'\x07\x08' for _ in range(test_constants.STREAM_LENGTH))
-    expected_response = self._handler.handle_stream_unary(iter(requests), None)
-    expected_responses = [expected_response] * test_constants.THREAD_CONCURRENCY
-    response_futures = [None] * test_constants.THREAD_CONCURRENCY
-
-    multi_callable = _stream_unary_multi_callable(self._channel)
-    for index in range(test_constants.THREAD_CONCURRENCY):
-      request_iterator = iter(requests)
-      response_future = pool.submit(
-          multi_callable, request_iterator,
-          metadata=(('test', 'ConcurrentBlockingInvocations'),))
-      response_futures[index] = response_future
-    responses = tuple(
-        response_future.result() for response_future in response_futures)
-
-    pool.shutdown(wait=True)
-    self.assertSequenceEqual(expected_responses, responses)
-
-  def testConcurrentFutureInvocations(self):
-    requests = tuple(b'\x07\x08' for _ in range(test_constants.STREAM_LENGTH))
-    expected_response = self._handler.handle_stream_unary(iter(requests), None)
-    expected_responses = [expected_response] * test_constants.THREAD_CONCURRENCY
-    response_futures = [None] * test_constants.THREAD_CONCURRENCY
-
-    multi_callable = _stream_unary_multi_callable(self._channel)
-    for index in range(test_constants.THREAD_CONCURRENCY):
-      request_iterator = iter(requests)
-      response_future = multi_callable.future(
-          request_iterator,
-          metadata=(('test', 'ConcurrentFutureInvocations'),))
-      response_futures[index] = response_future
-    responses = tuple(
-        response_future.result() for response_future in response_futures)
-
-    self.assertSequenceEqual(expected_responses, responses)
-
-  def testWaitingForSomeButNotAllConcurrentFutureInvocations(self):
-    pool = logging_pool.pool(test_constants.THREAD_CONCURRENCY)
-    request = b'\x67\x68'
-    expected_response = self._handler.handle_unary_unary(request, None)
-    response_futures = [None] * test_constants.THREAD_CONCURRENCY
-    lock = threading.Lock()
-    test_is_running_cell = [True]
-    def wrap_future(future):
-      def wrap():
-        try:
-          return future.result()
-        except grpc.RpcError:
-          with lock:
-            if test_is_running_cell[0]:
-              raise
-          return None
-      return wrap
-
-    multi_callable = _unary_unary_multi_callable(self._channel)
-    for index in range(test_constants.THREAD_CONCURRENCY):
-      inner_response_future = multi_callable.future(
-          request,
-          metadata=(
-              ('test',
-               'WaitingForSomeButNotAllConcurrentFutureInvocations'),))
-      outer_response_future = pool.submit(wrap_future(inner_response_future))
-      response_futures[index] = outer_response_future
-
-    some_completed_response_futures_iterator = itertools.islice(
-        futures.as_completed(response_futures),
-        test_constants.THREAD_CONCURRENCY // 2)
-    for response_future in some_completed_response_futures_iterator:
-      self.assertEqual(expected_response, response_future.result())
-    with lock:
-      test_is_running_cell[0] = False
-
-  def testConsumingOneStreamResponseUnaryRequest(self):
-    request = b'\x57\x38'
-
-    multi_callable = _unary_stream_multi_callable(self._channel)
-    response_iterator = multi_callable(
-        request,
-        metadata=(
-            ('test', 'ConsumingOneStreamResponseUnaryRequest'),))
-    next(response_iterator)
-
-  def testConsumingSomeButNotAllStreamResponsesUnaryRequest(self):
-    request = b'\x57\x38'
-
-    multi_callable = _unary_stream_multi_callable(self._channel)
-    response_iterator = multi_callable(
-        request,
-        metadata=(
-            ('test', 'ConsumingSomeButNotAllStreamResponsesUnaryRequest'),))
-    for _ in range(test_constants.STREAM_LENGTH // 2):
-      next(response_iterator)
-
-  def testConsumingSomeButNotAllStreamResponsesStreamRequest(self):
-    requests = tuple(b'\x67\x88' for _ in range(test_constants.STREAM_LENGTH))
-    request_iterator = iter(requests)
-
-    multi_callable = _stream_stream_multi_callable(self._channel)
-    response_iterator = multi_callable(
-        request_iterator,
-        metadata=(
-            ('test', 'ConsumingSomeButNotAllStreamResponsesStreamRequest'),))
-    for _ in range(test_constants.STREAM_LENGTH // 2):
-      next(response_iterator)
-
-  def testConsumingTooManyStreamResponsesStreamRequest(self):
-    requests = tuple(b'\x67\x88' for _ in range(test_constants.STREAM_LENGTH))
-    request_iterator = iter(requests)
-
-    multi_callable = _stream_stream_multi_callable(self._channel)
-    response_iterator = multi_callable(
-        request_iterator,
-        metadata=(
-            ('test', 'ConsumingTooManyStreamResponsesStreamRequest'),))
-    for _ in range(test_constants.STREAM_LENGTH):
-      next(response_iterator)
-    for _ in range(test_constants.STREAM_LENGTH):
-      with self.assertRaises(StopIteration):
-        next(response_iterator)
-
-    self.assertIsNotNone(response_iterator.initial_metadata())
-    self.assertIs(grpc.StatusCode.OK, response_iterator.code())
-    self.assertIsNotNone(response_iterator.details())
-    self.assertIsNotNone(response_iterator.trailing_metadata())
-
-  def testCancelledUnaryRequestUnaryResponse(self):
-    request = b'\x07\x17'
-
-    multi_callable = _unary_unary_multi_callable(self._channel)
-    with self._control.pause():
-      response_future = multi_callable.future(
-          request,
-          metadata=(('test', 'CancelledUnaryRequestUnaryResponse'),))
-      response_future.cancel()
-
-    self.assertTrue(response_future.cancelled())
-    with self.assertRaises(grpc.FutureCancelledError):
-      response_future.result()
-    with self.assertRaises(grpc.FutureCancelledError):
-      response_future.exception()
-    with self.assertRaises(grpc.FutureCancelledError):
-      response_future.traceback()
-    self.assertIs(grpc.StatusCode.CANCELLED, response_future.code())
-
-  def testCancelledUnaryRequestStreamResponse(self):
-    request = b'\x07\x19'
-
-    multi_callable = _unary_stream_multi_callable(self._channel)
-    with self._control.pause():
-      response_iterator = multi_callable(
-          request,
-          metadata=(('test', 'CancelledUnaryRequestStreamResponse'),))
-      self._control.block_until_paused()
-      response_iterator.cancel()
-
-    with self.assertRaises(grpc.RpcError) as exception_context:
-      next(response_iterator)
-    self.assertIs(grpc.StatusCode.CANCELLED, exception_context.exception.code())
-    self.assertIsNotNone(response_iterator.initial_metadata())
-    self.assertIs(grpc.StatusCode.CANCELLED, response_iterator.code())
-    self.assertIsNotNone(response_iterator.details())
-    self.assertIsNotNone(response_iterator.trailing_metadata())
-
-  def testCancelledStreamRequestUnaryResponse(self):
-    requests = tuple(b'\x07\x08' for _ in range(test_constants.STREAM_LENGTH))
-    request_iterator = iter(requests)
-
-    multi_callable = _stream_unary_multi_callable(self._channel)
-    with self._control.pause():
-      response_future = multi_callable.future(
-          request_iterator,
-          metadata=(('test', 'CancelledStreamRequestUnaryResponse'),))
-      self._control.block_until_paused()
-      response_future.cancel()
-
-    self.assertTrue(response_future.cancelled())
-    with self.assertRaises(grpc.FutureCancelledError):
-      response_future.result()
-    with self.assertRaises(grpc.FutureCancelledError):
-      response_future.exception()
-    with self.assertRaises(grpc.FutureCancelledError):
-      response_future.traceback()
-    self.assertIsNotNone(response_future.initial_metadata())
-    self.assertIs(grpc.StatusCode.CANCELLED, response_future.code())
-    self.assertIsNotNone(response_future.details())
-    self.assertIsNotNone(response_future.trailing_metadata())
-
-  def testCancelledStreamRequestStreamResponse(self):
-    requests = tuple(b'\x07\x08' for _ in range(test_constants.STREAM_LENGTH))
-    request_iterator = iter(requests)
-
-    multi_callable = _stream_stream_multi_callable(self._channel)
-    with self._control.pause():
-      response_iterator = multi_callable(
-          request_iterator,
-          metadata=(('test', 'CancelledStreamRequestStreamResponse'),))
-      response_iterator.cancel()
-
-    with self.assertRaises(grpc.RpcError):
-      next(response_iterator)
-    self.assertIsNotNone(response_iterator.initial_metadata())
-    self.assertIs(grpc.StatusCode.CANCELLED, response_iterator.code())
-    self.assertIsNotNone(response_iterator.details())
-    self.assertIsNotNone(response_iterator.trailing_metadata())
-
-  def testExpiredUnaryRequestBlockingUnaryResponse(self):
-    request = b'\x07\x17'
-
-    multi_callable = _unary_unary_multi_callable(self._channel)
-    with self._control.pause():
-      with self.assertRaises(grpc.RpcError) as exception_context:
-        multi_callable.with_call(
-            request, timeout=test_constants.SHORT_TIMEOUT,
-            metadata=(('test', 'ExpiredUnaryRequestBlockingUnaryResponse'),))
-
-    self.assertIsInstance(exception_context.exception, grpc.Call)
-    self.assertIsNotNone(exception_context.exception.initial_metadata())
-    self.assertIs(
-        grpc.StatusCode.DEADLINE_EXCEEDED, exception_context.exception.code())
-    self.assertIsNotNone(exception_context.exception.details())
-    self.assertIsNotNone(exception_context.exception.trailing_metadata())
-
-  def testExpiredUnaryRequestFutureUnaryResponse(self):
-    request = b'\x07\x17'
-    callback = _Callback()
-
-    multi_callable = _unary_unary_multi_callable(self._channel)
-    with self._control.pause():
-      response_future = multi_callable.future(
-          request, timeout=test_constants.SHORT_TIMEOUT,
-          metadata=(('test', 'ExpiredUnaryRequestFutureUnaryResponse'),))
-      response_future.add_done_callback(callback)
-      value_passed_to_callback = callback.value()
-
-    self.assertIs(response_future, value_passed_to_callback)
-    self.assertIsNotNone(response_future.initial_metadata())
-    self.assertIs(grpc.StatusCode.DEADLINE_EXCEEDED, response_future.code())
-    self.assertIsNotNone(response_future.details())
-    self.assertIsNotNone(response_future.trailing_metadata())
-    with self.assertRaises(grpc.RpcError) as exception_context:
-      response_future.result()
-    self.assertIs(
-        grpc.StatusCode.DEADLINE_EXCEEDED, exception_context.exception.code())
-    self.assertIsInstance(response_future.exception(), grpc.RpcError)
-    self.assertIsNotNone(response_future.traceback())
-    self.assertIs(
-        grpc.StatusCode.DEADLINE_EXCEEDED, response_future.exception().code())
-
-  def testExpiredUnaryRequestStreamResponse(self):
-    request = b'\x07\x19'
-
-    multi_callable = _unary_stream_multi_callable(self._channel)
-    with self._control.pause():
-      with self.assertRaises(grpc.RpcError) as exception_context:
-        response_iterator = multi_callable(
-            request, timeout=test_constants.SHORT_TIMEOUT,
-            metadata=(('test', 'ExpiredUnaryRequestStreamResponse'),))
-        next(response_iterator)
-
-    self.assertIs(
-        grpc.StatusCode.DEADLINE_EXCEEDED, exception_context.exception.code())
-    self.assertIs(grpc.StatusCode.DEADLINE_EXCEEDED, response_iterator.code())
-
-  def testExpiredStreamRequestBlockingUnaryResponse(self):
-    requests = tuple(b'\x07\x08' for _ in range(test_constants.STREAM_LENGTH))
-    request_iterator = iter(requests)
-
-    multi_callable = _stream_unary_multi_callable(self._channel)
-    with self._control.pause():
-      with self.assertRaises(grpc.RpcError) as exception_context:
-        multi_callable(
-            request_iterator, timeout=test_constants.SHORT_TIMEOUT,
-            metadata=(('test', 'ExpiredStreamRequestBlockingUnaryResponse'),))
-
-    self.assertIsInstance(exception_context.exception, grpc.RpcError)
-    self.assertIsInstance(exception_context.exception, grpc.Call)
-    self.assertIsNotNone(exception_context.exception.initial_metadata())
-    self.assertIs(
-        grpc.StatusCode.DEADLINE_EXCEEDED, exception_context.exception.code())
-    self.assertIsNotNone(exception_context.exception.details())
-    self.assertIsNotNone(exception_context.exception.trailing_metadata())
-
-  def testExpiredStreamRequestFutureUnaryResponse(self):
-    requests = tuple(b'\x07\x18' for _ in range(test_constants.STREAM_LENGTH))
-    request_iterator = iter(requests)
-    callback = _Callback()
-
-    multi_callable = _stream_unary_multi_callable(self._channel)
-    with self._control.pause():
-      response_future = multi_callable.future(
-          request_iterator, timeout=test_constants.SHORT_TIMEOUT,
-          metadata=(('test', 'ExpiredStreamRequestFutureUnaryResponse'),))
-      with self.assertRaises(grpc.FutureTimeoutError):
-        response_future.result(timeout=test_constants.SHORT_TIMEOUT / 2.0)
-      response_future.add_done_callback(callback)
-      value_passed_to_callback = callback.value()
-
-    with self.assertRaises(grpc.RpcError) as exception_context:
-      response_future.result()
-    self.assertIs(grpc.StatusCode.DEADLINE_EXCEEDED, response_future.code())
-    self.assertIs(
-        grpc.StatusCode.DEADLINE_EXCEEDED, exception_context.exception.code())
-    self.assertIsInstance(response_future.exception(), grpc.RpcError)
-    self.assertIsNotNone(response_future.traceback())
-    self.assertIs(response_future, value_passed_to_callback)
-    self.assertIsNotNone(response_future.initial_metadata())
-    self.assertIs(grpc.StatusCode.DEADLINE_EXCEEDED, response_future.code())
-    self.assertIsNotNone(response_future.details())
-    self.assertIsNotNone(response_future.trailing_metadata())
-
-  def testExpiredStreamRequestStreamResponse(self):
-    requests = tuple(b'\x67\x18' for _ in range(test_constants.STREAM_LENGTH))
-    request_iterator = iter(requests)
-
-    multi_callable = _stream_stream_multi_callable(self._channel)
-    with self._control.pause():
-      with self.assertRaises(grpc.RpcError) as exception_context:
-        response_iterator = multi_callable(
-            request_iterator, timeout=test_constants.SHORT_TIMEOUT,
-            metadata=(('test', 'ExpiredStreamRequestStreamResponse'),))
-        next(response_iterator)
-
-    self.assertIs(
-        grpc.StatusCode.DEADLINE_EXCEEDED, exception_context.exception.code())
-    self.assertIs(grpc.StatusCode.DEADLINE_EXCEEDED, response_iterator.code())
-
-  def testFailedUnaryRequestBlockingUnaryResponse(self):
-    request = b'\x37\x17'
-
-    multi_callable = _unary_unary_multi_callable(self._channel)
-    with self._control.fail():
-      with self.assertRaises(grpc.RpcError) as exception_context:
-        multi_callable.with_call(
+        multi_callable = _unary_unary_multi_callable(self._channel)
+        response = multi_callable(
             request,
-            metadata=(('test', 'FailedUnaryRequestBlockingUnaryResponse'),))
+            metadata=(('test', 'SuccessfulUnaryRequestBlockingUnaryResponse'),))
 
-    self.assertIs(grpc.StatusCode.UNKNOWN, exception_context.exception.code())
+        self.assertEqual(expected_response, response)
 
-  def testFailedUnaryRequestFutureUnaryResponse(self):
-    request = b'\x37\x17'
-    callback = _Callback()
+    def testSuccessfulUnaryRequestBlockingUnaryResponseWithCall(self):
+        request = b'\x07\x08'
+        expected_response = self._handler.handle_unary_unary(request, None)
 
-    multi_callable = _unary_unary_multi_callable(self._channel)
-    with self._control.fail():
-      response_future = multi_callable.future(
-          request,
-          metadata=(('test', 'FailedUnaryRequestFutureUnaryResponse'),))
-      response_future.add_done_callback(callback)
-      value_passed_to_callback = callback.value()
+        multi_callable = _unary_unary_multi_callable(self._channel)
+        response, call = multi_callable.with_call(
+            request,
+            metadata=(('test',
+                       'SuccessfulUnaryRequestBlockingUnaryResponseWithCall'),))
 
-    self.assertIsInstance(response_future, grpc.Future)
-    self.assertIsInstance(response_future, grpc.Call)
-    with self.assertRaises(grpc.RpcError) as exception_context:
-      response_future.result()
-    self.assertIs(
-        grpc.StatusCode.UNKNOWN, exception_context.exception.code())
-    self.assertIsInstance(response_future.exception(), grpc.RpcError)
-    self.assertIsNotNone(response_future.traceback())
-    self.assertIs(grpc.StatusCode.UNKNOWN, response_future.exception().code())
-    self.assertIs(response_future, value_passed_to_callback)
+        self.assertEqual(expected_response, response)
+        self.assertIs(grpc.StatusCode.OK, call.code())
 
-  def testFailedUnaryRequestStreamResponse(self):
-    request = b'\x37\x17'
+    def testSuccessfulUnaryRequestFutureUnaryResponse(self):
+        request = b'\x07\x08'
+        expected_response = self._handler.handle_unary_unary(request, None)
 
-    multi_callable = _unary_stream_multi_callable(self._channel)
-    with self.assertRaises(grpc.RpcError) as exception_context:
-      with self._control.fail():
+        multi_callable = _unary_unary_multi_callable(self._channel)
+        response_future = multi_callable.future(
+            request,
+            metadata=(('test', 'SuccessfulUnaryRequestFutureUnaryResponse'),))
+        response = response_future.result()
+
+        self.assertIsInstance(response_future, grpc.Future)
+        self.assertIsInstance(response_future, grpc.Call)
+        self.assertEqual(expected_response, response)
+        self.assertIsNone(response_future.exception())
+        self.assertIsNone(response_future.traceback())
+
+    def testSuccessfulUnaryRequestStreamResponse(self):
+        request = b'\x37\x58'
+        expected_responses = tuple(
+            self._handler.handle_unary_stream(request, None))
+
+        multi_callable = _unary_stream_multi_callable(self._channel)
         response_iterator = multi_callable(
             request,
-            metadata=(('test', 'FailedUnaryRequestStreamResponse'),))
-        next(response_iterator)
+            metadata=(('test', 'SuccessfulUnaryRequestStreamResponse'),))
+        responses = tuple(response_iterator)
 
-    self.assertIs(grpc.StatusCode.UNKNOWN, exception_context.exception.code())
+        self.assertSequenceEqual(expected_responses, responses)
 
-  def testFailedStreamRequestBlockingUnaryResponse(self):
-    requests = tuple(b'\x47\x58' for _ in range(test_constants.STREAM_LENGTH))
-    request_iterator = iter(requests)
+    def testSuccessfulStreamRequestBlockingUnaryResponse(self):
+        requests = tuple(b'\x07\x08'
+                         for _ in range(test_constants.STREAM_LENGTH))
+        expected_response = self._handler.handle_stream_unary(
+            iter(requests), None)
+        request_iterator = iter(requests)
 
-    multi_callable = _stream_unary_multi_callable(self._channel)
-    with self._control.fail():
-      with self.assertRaises(grpc.RpcError) as exception_context:
-        multi_callable(
+        multi_callable = _stream_unary_multi_callable(self._channel)
+        response = multi_callable(
             request_iterator,
-            metadata=(('test', 'FailedStreamRequestBlockingUnaryResponse'),))
+            metadata=(
+                ('test', 'SuccessfulStreamRequestBlockingUnaryResponse'),))
 
-    self.assertIs(grpc.StatusCode.UNKNOWN, exception_context.exception.code())
+        self.assertEqual(expected_response, response)
 
-  def testFailedStreamRequestFutureUnaryResponse(self):
-    requests = tuple(b'\x07\x18' for _ in range(test_constants.STREAM_LENGTH))
-    request_iterator = iter(requests)
-    callback = _Callback()
+    def testSuccessfulStreamRequestBlockingUnaryResponseWithCall(self):
+        requests = tuple(b'\x07\x08'
+                         for _ in range(test_constants.STREAM_LENGTH))
+        expected_response = self._handler.handle_stream_unary(
+            iter(requests), None)
+        request_iterator = iter(requests)
 
-    multi_callable = _stream_unary_multi_callable(self._channel)
-    with self._control.fail():
-      response_future = multi_callable.future(
-          request_iterator,
-          metadata=(('test', 'FailedStreamRequestFutureUnaryResponse'),))
-      response_future.add_done_callback(callback)
-      value_passed_to_callback = callback.value()
+        multi_callable = _stream_unary_multi_callable(self._channel)
+        response, call = multi_callable.with_call(
+            request_iterator,
+            metadata=(
+                ('test',
+                 'SuccessfulStreamRequestBlockingUnaryResponseWithCall'),))
 
-    with self.assertRaises(grpc.RpcError) as exception_context:
-      response_future.result()
-    self.assertIs(grpc.StatusCode.UNKNOWN, response_future.code())
-    self.assertIs(
-        grpc.StatusCode.UNKNOWN, exception_context.exception.code())
-    self.assertIsInstance(response_future.exception(), grpc.RpcError)
-    self.assertIsNotNone(response_future.traceback())
-    self.assertIs(response_future, value_passed_to_callback)
+        self.assertEqual(expected_response, response)
+        self.assertIs(grpc.StatusCode.OK, call.code())
 
-  def testFailedStreamRequestStreamResponse(self):
-    requests = tuple(b'\x67\x88' for _ in range(test_constants.STREAM_LENGTH))
-    request_iterator = iter(requests)
+    def testSuccessfulStreamRequestFutureUnaryResponse(self):
+        requests = tuple(b'\x07\x08'
+                         for _ in range(test_constants.STREAM_LENGTH))
+        expected_response = self._handler.handle_stream_unary(
+            iter(requests), None)
+        request_iterator = iter(requests)
 
-    multi_callable = _stream_stream_multi_callable(self._channel)
-    with self._control.fail():
-      with self.assertRaises(grpc.RpcError) as exception_context:
+        multi_callable = _stream_unary_multi_callable(self._channel)
+        response_future = multi_callable.future(
+            request_iterator,
+            metadata=(('test', 'SuccessfulStreamRequestFutureUnaryResponse'),))
+        response = response_future.result()
+
+        self.assertEqual(expected_response, response)
+        self.assertIsNone(response_future.exception())
+        self.assertIsNone(response_future.traceback())
+
+    def testSuccessfulStreamRequestStreamResponse(self):
+        requests = tuple(b'\x77\x58'
+                         for _ in range(test_constants.STREAM_LENGTH))
+        expected_responses = tuple(
+            self._handler.handle_stream_stream(iter(requests), None))
+        request_iterator = iter(requests)
+
+        multi_callable = _stream_stream_multi_callable(self._channel)
         response_iterator = multi_callable(
             request_iterator,
-            metadata=(('test', 'FailedStreamRequestStreamResponse'),))
-        tuple(response_iterator)
+            metadata=(('test', 'SuccessfulStreamRequestStreamResponse'),))
+        responses = tuple(response_iterator)
 
-    self.assertIs(grpc.StatusCode.UNKNOWN, exception_context.exception.code())
-    self.assertIs(grpc.StatusCode.UNKNOWN, response_iterator.code())
+        self.assertSequenceEqual(expected_responses, responses)
 
-  def testIgnoredUnaryRequestFutureUnaryResponse(self):
-    request = b'\x37\x17'
+    def testSequentialInvocations(self):
+        first_request = b'\x07\x08'
+        second_request = b'\x0809'
+        expected_first_response = self._handler.handle_unary_unary(
+            first_request, None)
+        expected_second_response = self._handler.handle_unary_unary(
+            second_request, None)
 
-    multi_callable = _unary_unary_multi_callable(self._channel)
-    multi_callable.future(
-        request,
-        metadata=(('test', 'IgnoredUnaryRequestFutureUnaryResponse'),))
+        multi_callable = _unary_unary_multi_callable(self._channel)
+        first_response = multi_callable(
+            first_request, metadata=(('test', 'SequentialInvocations'),))
+        second_response = multi_callable(
+            second_request, metadata=(('test', 'SequentialInvocations'),))
 
-  def testIgnoredUnaryRequestStreamResponse(self):
-    request = b'\x37\x17'
+        self.assertEqual(expected_first_response, first_response)
+        self.assertEqual(expected_second_response, second_response)
 
-    multi_callable = _unary_stream_multi_callable(self._channel)
-    multi_callable(
-        request,
-        metadata=(('test', 'IgnoredUnaryRequestStreamResponse'),))
+    def testConcurrentBlockingInvocations(self):
+        pool = logging_pool.pool(test_constants.THREAD_CONCURRENCY)
+        requests = tuple(b'\x07\x08'
+                         for _ in range(test_constants.STREAM_LENGTH))
+        expected_response = self._handler.handle_stream_unary(
+            iter(requests), None)
+        expected_responses = [expected_response
+                             ] * test_constants.THREAD_CONCURRENCY
+        response_futures = [None] * test_constants.THREAD_CONCURRENCY
 
-  def testIgnoredStreamRequestFutureUnaryResponse(self):
-    requests = tuple(b'\x07\x18' for _ in range(test_constants.STREAM_LENGTH))
-    request_iterator = iter(requests)
+        multi_callable = _stream_unary_multi_callable(self._channel)
+        for index in range(test_constants.THREAD_CONCURRENCY):
+            request_iterator = iter(requests)
+            response_future = pool.submit(
+                multi_callable,
+                request_iterator,
+                metadata=(('test', 'ConcurrentBlockingInvocations'),))
+            response_futures[index] = response_future
+        responses = tuple(response_future.result()
+                          for response_future in response_futures)
 
-    multi_callable = _stream_unary_multi_callable(self._channel)
-    multi_callable.future(
-        request_iterator,
-        metadata=(('test', 'IgnoredStreamRequestFutureUnaryResponse'),))
+        pool.shutdown(wait=True)
+        self.assertSequenceEqual(expected_responses, responses)
 
-  def testIgnoredStreamRequestStreamResponse(self):
-    requests = tuple(b'\x67\x88' for _ in range(test_constants.STREAM_LENGTH))
-    request_iterator = iter(requests)
+    def testConcurrentFutureInvocations(self):
+        requests = tuple(b'\x07\x08'
+                         for _ in range(test_constants.STREAM_LENGTH))
+        expected_response = self._handler.handle_stream_unary(
+            iter(requests), None)
+        expected_responses = [expected_response
+                             ] * test_constants.THREAD_CONCURRENCY
+        response_futures = [None] * test_constants.THREAD_CONCURRENCY
 
-    multi_callable = _stream_stream_multi_callable(self._channel)
-    multi_callable(
-        request_iterator,
-        metadata=(('test', 'IgnoredStreamRequestStreamResponse'),))
+        multi_callable = _stream_unary_multi_callable(self._channel)
+        for index in range(test_constants.THREAD_CONCURRENCY):
+            request_iterator = iter(requests)
+            response_future = multi_callable.future(
+                request_iterator,
+                metadata=(('test', 'ConcurrentFutureInvocations'),))
+            response_futures[index] = response_future
+        responses = tuple(response_future.result()
+                          for response_future in response_futures)
+
+        self.assertSequenceEqual(expected_responses, responses)
+
+    def testWaitingForSomeButNotAllConcurrentFutureInvocations(self):
+        pool = logging_pool.pool(test_constants.THREAD_CONCURRENCY)
+        request = b'\x67\x68'
+        expected_response = self._handler.handle_unary_unary(request, None)
+        response_futures = [None] * test_constants.THREAD_CONCURRENCY
+        lock = threading.Lock()
+        test_is_running_cell = [True]
+
+        def wrap_future(future):
+
+            def wrap():
+                try:
+                    return future.result()
+                except grpc.RpcError:
+                    with lock:
+                        if test_is_running_cell[0]:
+                            raise
+                    return None
+
+            return wrap
+
+        multi_callable = _unary_unary_multi_callable(self._channel)
+        for index in range(test_constants.THREAD_CONCURRENCY):
+            inner_response_future = multi_callable.future(
+                request,
+                metadata=(
+                    ('test',
+                     'WaitingForSomeButNotAllConcurrentFutureInvocations'),))
+            outer_response_future = pool.submit(
+                wrap_future(inner_response_future))
+            response_futures[index] = outer_response_future
+
+        some_completed_response_futures_iterator = itertools.islice(
+            futures.as_completed(response_futures),
+            test_constants.THREAD_CONCURRENCY // 2)
+        for response_future in some_completed_response_futures_iterator:
+            self.assertEqual(expected_response, response_future.result())
+        with lock:
+            test_is_running_cell[0] = False
+
+    def testConsumingOneStreamResponseUnaryRequest(self):
+        request = b'\x57\x38'
+
+        multi_callable = _unary_stream_multi_callable(self._channel)
+        response_iterator = multi_callable(
+            request,
+            metadata=(('test', 'ConsumingOneStreamResponseUnaryRequest'),))
+        next(response_iterator)
+
+    def testConsumingSomeButNotAllStreamResponsesUnaryRequest(self):
+        request = b'\x57\x38'
+
+        multi_callable = _unary_stream_multi_callable(self._channel)
+        response_iterator = multi_callable(
+            request,
+            metadata=(
+                ('test', 'ConsumingSomeButNotAllStreamResponsesUnaryRequest'),))
+        for _ in range(test_constants.STREAM_LENGTH // 2):
+            next(response_iterator)
+
+    def testConsumingSomeButNotAllStreamResponsesStreamRequest(self):
+        requests = tuple(b'\x67\x88'
+                         for _ in range(test_constants.STREAM_LENGTH))
+        request_iterator = iter(requests)
+
+        multi_callable = _stream_stream_multi_callable(self._channel)
+        response_iterator = multi_callable(
+            request_iterator,
+            metadata=(('test',
+                       'ConsumingSomeButNotAllStreamResponsesStreamRequest'),))
+        for _ in range(test_constants.STREAM_LENGTH // 2):
+            next(response_iterator)
+
+    def testConsumingTooManyStreamResponsesStreamRequest(self):
+        requests = tuple(b'\x67\x88'
+                         for _ in range(test_constants.STREAM_LENGTH))
+        request_iterator = iter(requests)
+
+        multi_callable = _stream_stream_multi_callable(self._channel)
+        response_iterator = multi_callable(
+            request_iterator,
+            metadata=(
+                ('test', 'ConsumingTooManyStreamResponsesStreamRequest'),))
+        for _ in range(test_constants.STREAM_LENGTH):
+            next(response_iterator)
+        for _ in range(test_constants.STREAM_LENGTH):
+            with self.assertRaises(StopIteration):
+                next(response_iterator)
+
+        self.assertIsNotNone(response_iterator.initial_metadata())
+        self.assertIs(grpc.StatusCode.OK, response_iterator.code())
+        self.assertIsNotNone(response_iterator.details())
+        self.assertIsNotNone(response_iterator.trailing_metadata())
+
+    def testCancelledUnaryRequestUnaryResponse(self):
+        request = b'\x07\x17'
+
+        multi_callable = _unary_unary_multi_callable(self._channel)
+        with self._control.pause():
+            response_future = multi_callable.future(
+                request,
+                metadata=(('test', 'CancelledUnaryRequestUnaryResponse'),))
+            response_future.cancel()
+
+        self.assertTrue(response_future.cancelled())
+        with self.assertRaises(grpc.FutureCancelledError):
+            response_future.result()
+        with self.assertRaises(grpc.FutureCancelledError):
+            response_future.exception()
+        with self.assertRaises(grpc.FutureCancelledError):
+            response_future.traceback()
+        self.assertIs(grpc.StatusCode.CANCELLED, response_future.code())
+
+    def testCancelledUnaryRequestStreamResponse(self):
+        request = b'\x07\x19'
+
+        multi_callable = _unary_stream_multi_callable(self._channel)
+        with self._control.pause():
+            response_iterator = multi_callable(
+                request,
+                metadata=(('test', 'CancelledUnaryRequestStreamResponse'),))
+            self._control.block_until_paused()
+            response_iterator.cancel()
+
+        with self.assertRaises(grpc.RpcError) as exception_context:
+            next(response_iterator)
+        self.assertIs(grpc.StatusCode.CANCELLED,
+                      exception_context.exception.code())
+        self.assertIsNotNone(response_iterator.initial_metadata())
+        self.assertIs(grpc.StatusCode.CANCELLED, response_iterator.code())
+        self.assertIsNotNone(response_iterator.details())
+        self.assertIsNotNone(response_iterator.trailing_metadata())
+
+    def testCancelledStreamRequestUnaryResponse(self):
+        requests = tuple(b'\x07\x08'
+                         for _ in range(test_constants.STREAM_LENGTH))
+        request_iterator = iter(requests)
+
+        multi_callable = _stream_unary_multi_callable(self._channel)
+        with self._control.pause():
+            response_future = multi_callable.future(
+                request_iterator,
+                metadata=(('test', 'CancelledStreamRequestUnaryResponse'),))
+            self._control.block_until_paused()
+            response_future.cancel()
+
+        self.assertTrue(response_future.cancelled())
+        with self.assertRaises(grpc.FutureCancelledError):
+            response_future.result()
+        with self.assertRaises(grpc.FutureCancelledError):
+            response_future.exception()
+        with self.assertRaises(grpc.FutureCancelledError):
+            response_future.traceback()
+        self.assertIsNotNone(response_future.initial_metadata())
+        self.assertIs(grpc.StatusCode.CANCELLED, response_future.code())
+        self.assertIsNotNone(response_future.details())
+        self.assertIsNotNone(response_future.trailing_metadata())
+
+    def testCancelledStreamRequestStreamResponse(self):
+        requests = tuple(b'\x07\x08'
+                         for _ in range(test_constants.STREAM_LENGTH))
+        request_iterator = iter(requests)
+
+        multi_callable = _stream_stream_multi_callable(self._channel)
+        with self._control.pause():
+            response_iterator = multi_callable(
+                request_iterator,
+                metadata=(('test', 'CancelledStreamRequestStreamResponse'),))
+            response_iterator.cancel()
+
+        with self.assertRaises(grpc.RpcError):
+            next(response_iterator)
+        self.assertIsNotNone(response_iterator.initial_metadata())
+        self.assertIs(grpc.StatusCode.CANCELLED, response_iterator.code())
+        self.assertIsNotNone(response_iterator.details())
+        self.assertIsNotNone(response_iterator.trailing_metadata())
+
+    def testExpiredUnaryRequestBlockingUnaryResponse(self):
+        request = b'\x07\x17'
+
+        multi_callable = _unary_unary_multi_callable(self._channel)
+        with self._control.pause():
+            with self.assertRaises(grpc.RpcError) as exception_context:
+                multi_callable.with_call(
+                    request,
+                    timeout=test_constants.SHORT_TIMEOUT,
+                    metadata=(
+                        ('test', 'ExpiredUnaryRequestBlockingUnaryResponse'),))
+
+        self.assertIsInstance(exception_context.exception, grpc.Call)
+        self.assertIsNotNone(exception_context.exception.initial_metadata())
+        self.assertIs(grpc.StatusCode.DEADLINE_EXCEEDED,
+                      exception_context.exception.code())
+        self.assertIsNotNone(exception_context.exception.details())
+        self.assertIsNotNone(exception_context.exception.trailing_metadata())
+
+    def testExpiredUnaryRequestFutureUnaryResponse(self):
+        request = b'\x07\x17'
+        callback = _Callback()
+
+        multi_callable = _unary_unary_multi_callable(self._channel)
+        with self._control.pause():
+            response_future = multi_callable.future(
+                request,
+                timeout=test_constants.SHORT_TIMEOUT,
+                metadata=(('test', 'ExpiredUnaryRequestFutureUnaryResponse'),))
+            response_future.add_done_callback(callback)
+            value_passed_to_callback = callback.value()
+
+        self.assertIs(response_future, value_passed_to_callback)
+        self.assertIsNotNone(response_future.initial_metadata())
+        self.assertIs(grpc.StatusCode.DEADLINE_EXCEEDED, response_future.code())
+        self.assertIsNotNone(response_future.details())
+        self.assertIsNotNone(response_future.trailing_metadata())
+        with self.assertRaises(grpc.RpcError) as exception_context:
+            response_future.result()
+        self.assertIs(grpc.StatusCode.DEADLINE_EXCEEDED,
+                      exception_context.exception.code())
+        self.assertIsInstance(response_future.exception(), grpc.RpcError)
+        self.assertIsNotNone(response_future.traceback())
+        self.assertIs(grpc.StatusCode.DEADLINE_EXCEEDED,
+                      response_future.exception().code())
+
+    def testExpiredUnaryRequestStreamResponse(self):
+        request = b'\x07\x19'
+
+        multi_callable = _unary_stream_multi_callable(self._channel)
+        with self._control.pause():
+            with self.assertRaises(grpc.RpcError) as exception_context:
+                response_iterator = multi_callable(
+                    request,
+                    timeout=test_constants.SHORT_TIMEOUT,
+                    metadata=(('test', 'ExpiredUnaryRequestStreamResponse'),))
+                next(response_iterator)
+
+        self.assertIs(grpc.StatusCode.DEADLINE_EXCEEDED,
+                      exception_context.exception.code())
+        self.assertIs(grpc.StatusCode.DEADLINE_EXCEEDED,
+                      response_iterator.code())
+
+    def testExpiredStreamRequestBlockingUnaryResponse(self):
+        requests = tuple(b'\x07\x08'
+                         for _ in range(test_constants.STREAM_LENGTH))
+        request_iterator = iter(requests)
+
+        multi_callable = _stream_unary_multi_callable(self._channel)
+        with self._control.pause():
+            with self.assertRaises(grpc.RpcError) as exception_context:
+                multi_callable(
+                    request_iterator,
+                    timeout=test_constants.SHORT_TIMEOUT,
+                    metadata=(
+                        ('test', 'ExpiredStreamRequestBlockingUnaryResponse'),))
+
+        self.assertIsInstance(exception_context.exception, grpc.RpcError)
+        self.assertIsInstance(exception_context.exception, grpc.Call)
+        self.assertIsNotNone(exception_context.exception.initial_metadata())
+        self.assertIs(grpc.StatusCode.DEADLINE_EXCEEDED,
+                      exception_context.exception.code())
+        self.assertIsNotNone(exception_context.exception.details())
+        self.assertIsNotNone(exception_context.exception.trailing_metadata())
+
+    def testExpiredStreamRequestFutureUnaryResponse(self):
+        requests = tuple(b'\x07\x18'
+                         for _ in range(test_constants.STREAM_LENGTH))
+        request_iterator = iter(requests)
+        callback = _Callback()
+
+        multi_callable = _stream_unary_multi_callable(self._channel)
+        with self._control.pause():
+            response_future = multi_callable.future(
+                request_iterator,
+                timeout=test_constants.SHORT_TIMEOUT,
+                metadata=(('test', 'ExpiredStreamRequestFutureUnaryResponse'),))
+            with self.assertRaises(grpc.FutureTimeoutError):
+                response_future.result(timeout=test_constants.SHORT_TIMEOUT /
+                                       2.0)
+            response_future.add_done_callback(callback)
+            value_passed_to_callback = callback.value()
+
+        with self.assertRaises(grpc.RpcError) as exception_context:
+            response_future.result()
+        self.assertIs(grpc.StatusCode.DEADLINE_EXCEEDED, response_future.code())
+        self.assertIs(grpc.StatusCode.DEADLINE_EXCEEDED,
+                      exception_context.exception.code())
+        self.assertIsInstance(response_future.exception(), grpc.RpcError)
+        self.assertIsNotNone(response_future.traceback())
+        self.assertIs(response_future, value_passed_to_callback)
+        self.assertIsNotNone(response_future.initial_metadata())
+        self.assertIs(grpc.StatusCode.DEADLINE_EXCEEDED, response_future.code())
+        self.assertIsNotNone(response_future.details())
+        self.assertIsNotNone(response_future.trailing_metadata())
+
+    def testExpiredStreamRequestStreamResponse(self):
+        requests = tuple(b'\x67\x18'
+                         for _ in range(test_constants.STREAM_LENGTH))
+        request_iterator = iter(requests)
+
+        multi_callable = _stream_stream_multi_callable(self._channel)
+        with self._control.pause():
+            with self.assertRaises(grpc.RpcError) as exception_context:
+                response_iterator = multi_callable(
+                    request_iterator,
+                    timeout=test_constants.SHORT_TIMEOUT,
+                    metadata=(('test', 'ExpiredStreamRequestStreamResponse'),))
+                next(response_iterator)
+
+        self.assertIs(grpc.StatusCode.DEADLINE_EXCEEDED,
+                      exception_context.exception.code())
+        self.assertIs(grpc.StatusCode.DEADLINE_EXCEEDED,
+                      response_iterator.code())
+
+    def testFailedUnaryRequestBlockingUnaryResponse(self):
+        request = b'\x37\x17'
+
+        multi_callable = _unary_unary_multi_callable(self._channel)
+        with self._control.fail():
+            with self.assertRaises(grpc.RpcError) as exception_context:
+                multi_callable.with_call(
+                    request,
+                    metadata=(
+                        ('test', 'FailedUnaryRequestBlockingUnaryResponse'),))
+
+        self.assertIs(grpc.StatusCode.UNKNOWN,
+                      exception_context.exception.code())
+
+    def testFailedUnaryRequestFutureUnaryResponse(self):
+        request = b'\x37\x17'
+        callback = _Callback()
+
+        multi_callable = _unary_unary_multi_callable(self._channel)
+        with self._control.fail():
+            response_future = multi_callable.future(
+                request,
+                metadata=(('test', 'FailedUnaryRequestFutureUnaryResponse'),))
+            response_future.add_done_callback(callback)
+            value_passed_to_callback = callback.value()
+
+        self.assertIsInstance(response_future, grpc.Future)
+        self.assertIsInstance(response_future, grpc.Call)
+        with self.assertRaises(grpc.RpcError) as exception_context:
+            response_future.result()
+        self.assertIs(grpc.StatusCode.UNKNOWN,
+                      exception_context.exception.code())
+        self.assertIsInstance(response_future.exception(), grpc.RpcError)
+        self.assertIsNotNone(response_future.traceback())
+        self.assertIs(grpc.StatusCode.UNKNOWN,
+                      response_future.exception().code())
+        self.assertIs(response_future, value_passed_to_callback)
+
+    def testFailedUnaryRequestStreamResponse(self):
+        request = b'\x37\x17'
+
+        multi_callable = _unary_stream_multi_callable(self._channel)
+        with self.assertRaises(grpc.RpcError) as exception_context:
+            with self._control.fail():
+                response_iterator = multi_callable(
+                    request,
+                    metadata=(('test', 'FailedUnaryRequestStreamResponse'),))
+                next(response_iterator)
+
+        self.assertIs(grpc.StatusCode.UNKNOWN,
+                      exception_context.exception.code())
+
+    def testFailedStreamRequestBlockingUnaryResponse(self):
+        requests = tuple(b'\x47\x58'
+                         for _ in range(test_constants.STREAM_LENGTH))
+        request_iterator = iter(requests)
+
+        multi_callable = _stream_unary_multi_callable(self._channel)
+        with self._control.fail():
+            with self.assertRaises(grpc.RpcError) as exception_context:
+                multi_callable(
+                    request_iterator,
+                    metadata=(
+                        ('test', 'FailedStreamRequestBlockingUnaryResponse'),))
+
+        self.assertIs(grpc.StatusCode.UNKNOWN,
+                      exception_context.exception.code())
+
+    def testFailedStreamRequestFutureUnaryResponse(self):
+        requests = tuple(b'\x07\x18'
+                         for _ in range(test_constants.STREAM_LENGTH))
+        request_iterator = iter(requests)
+        callback = _Callback()
+
+        multi_callable = _stream_unary_multi_callable(self._channel)
+        with self._control.fail():
+            response_future = multi_callable.future(
+                request_iterator,
+                metadata=(('test', 'FailedStreamRequestFutureUnaryResponse'),))
+            response_future.add_done_callback(callback)
+            value_passed_to_callback = callback.value()
+
+        with self.assertRaises(grpc.RpcError) as exception_context:
+            response_future.result()
+        self.assertIs(grpc.StatusCode.UNKNOWN, response_future.code())
+        self.assertIs(grpc.StatusCode.UNKNOWN,
+                      exception_context.exception.code())
+        self.assertIsInstance(response_future.exception(), grpc.RpcError)
+        self.assertIsNotNone(response_future.traceback())
+        self.assertIs(response_future, value_passed_to_callback)
+
+    def testFailedStreamRequestStreamResponse(self):
+        requests = tuple(b'\x67\x88'
+                         for _ in range(test_constants.STREAM_LENGTH))
+        request_iterator = iter(requests)
+
+        multi_callable = _stream_stream_multi_callable(self._channel)
+        with self._control.fail():
+            with self.assertRaises(grpc.RpcError) as exception_context:
+                response_iterator = multi_callable(
+                    request_iterator,
+                    metadata=(('test', 'FailedStreamRequestStreamResponse'),))
+                tuple(response_iterator)
+
+        self.assertIs(grpc.StatusCode.UNKNOWN,
+                      exception_context.exception.code())
+        self.assertIs(grpc.StatusCode.UNKNOWN, response_iterator.code())
+
+    def testIgnoredUnaryRequestFutureUnaryResponse(self):
+        request = b'\x37\x17'
+
+        multi_callable = _unary_unary_multi_callable(self._channel)
+        multi_callable.future(
+            request,
+            metadata=(('test', 'IgnoredUnaryRequestFutureUnaryResponse'),))
+
+    def testIgnoredUnaryRequestStreamResponse(self):
+        request = b'\x37\x17'
+
+        multi_callable = _unary_stream_multi_callable(self._channel)
+        multi_callable(
+            request, metadata=(('test', 'IgnoredUnaryRequestStreamResponse'),))
+
+    def testIgnoredStreamRequestFutureUnaryResponse(self):
+        requests = tuple(b'\x07\x18'
+                         for _ in range(test_constants.STREAM_LENGTH))
+        request_iterator = iter(requests)
+
+        multi_callable = _stream_unary_multi_callable(self._channel)
+        multi_callable.future(
+            request_iterator,
+            metadata=(('test', 'IgnoredStreamRequestFutureUnaryResponse'),))
+
+    def testIgnoredStreamRequestStreamResponse(self):
+        requests = tuple(b'\x67\x88'
+                         for _ in range(test_constants.STREAM_LENGTH))
+        request_iterator = iter(requests)
+
+        multi_callable = _stream_stream_multi_callable(self._channel)
+        multi_callable(
+            request_iterator,
+            metadata=(('test', 'IgnoredStreamRequestStreamResponse'),))
 
 
 if __name__ == '__main__':
-  unittest.main(verbosity=2)
+    unittest.main(verbosity=2)
diff --git a/src/python/grpcio_tests/tests/unit/_sanity/__init__.py b/src/python/grpcio_tests/tests/unit/_sanity/__init__.py
index 2f88fa0..100a624 100644
--- a/src/python/grpcio_tests/tests/unit/_sanity/__init__.py
+++ b/src/python/grpcio_tests/tests/unit/_sanity/__init__.py
@@ -26,5 +26,3 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
diff --git a/src/python/grpcio_tests/tests/unit/_sanity/_sanity_test.py b/src/python/grpcio_tests/tests/unit/_sanity/_sanity_test.py
index e9fdf21..0fbe6a2 100644
--- a/src/python/grpcio_tests/tests/unit/_sanity/_sanity_test.py
+++ b/src/python/grpcio_tests/tests/unit/_sanity/_sanity_test.py
@@ -38,21 +38,23 @@
 
 class Sanity(unittest.TestCase):
 
-  def testTestsJsonUpToDate(self):
-    """Autodiscovers all test suites and checks that tests.json is up to date"""
-    loader = tests.Loader()
-    loader.loadTestsFromNames(['tests'])
-    test_suite_names = [
-        test_case_class.id().rsplit('.', 1)[0]
-        for test_case_class in tests._loader.iterate_suite_cases(loader.suite)]
-    test_suite_names = sorted(set(test_suite_names))
+    def testTestsJsonUpToDate(self):
+        """Autodiscovers all test suites and checks that tests.json is up to date"""
+        loader = tests.Loader()
+        loader.loadTestsFromNames(['tests'])
+        test_suite_names = [
+            test_case_class.id().rsplit('.', 1)[0]
+            for test_case_class in tests._loader.iterate_suite_cases(
+                loader.suite)
+        ]
+        test_suite_names = sorted(set(test_suite_names))
 
-    tests_json_string = pkg_resources.resource_string('tests', 'tests.json')
-    if six.PY3:
-      tests_json_string = tests_json_string.decode()
-    tests_json = json.loads(tests_json_string)
-    self.assertListEqual(test_suite_names, tests_json)
+        tests_json_string = pkg_resources.resource_string('tests', 'tests.json')
+        if six.PY3:
+            tests_json_string = tests_json_string.decode()
+        tests_json = json.loads(tests_json_string)
+        self.assertListEqual(test_suite_names, tests_json)
 
 
 if __name__ == '__main__':
-  unittest.main(verbosity=2)
+    unittest.main(verbosity=2)
diff --git a/src/python/grpcio_tests/tests/unit/_thread_cleanup_test.py b/src/python/grpcio_tests/tests/unit/_thread_cleanup_test.py
index 3e4f317..be3522f 100644
--- a/src/python/grpcio_tests/tests/unit/_thread_cleanup_test.py
+++ b/src/python/grpcio_tests/tests/unit/_thread_cleanup_test.py
@@ -40,78 +40,89 @@
 
 
 def cleanup(timeout):
-  if timeout is not None:
-    time.sleep(timeout)
-  else:
-    time.sleep(_LONG_TIME)
+    if timeout is not None:
+        time.sleep(timeout)
+    else:
+        time.sleep(_LONG_TIME)
 
 
 def slow_cleanup(timeout):
-  # Don't respect timeout
-  time.sleep(_LONG_TIME)
+    # Don't respect timeout
+    time.sleep(_LONG_TIME)
 
 
 class CleanupThreadTest(unittest.TestCase):
 
-  def testTargetInvocation(self):
-    event = threading.Event()
-    def target(arg1, arg2, arg3=None):
-      self.assertEqual('arg1', arg1)
-      self.assertEqual('arg2', arg2)
-      self.assertEqual('arg3', arg3)
-      event.set()
+    def testTargetInvocation(self):
+        event = threading.Event()
 
-    cleanup_thread = _common.CleanupThread(behavior=lambda x: None,
-                              target=target, name='test-name',
-                              args=('arg1', 'arg2'), kwargs={'arg3': 'arg3'})
-    cleanup_thread.start()
-    cleanup_thread.join()
-    self.assertEqual(cleanup_thread.name, 'test-name')
-    self.assertTrue(event.is_set())
+        def target(arg1, arg2, arg3=None):
+            self.assertEqual('arg1', arg1)
+            self.assertEqual('arg2', arg2)
+            self.assertEqual('arg3', arg3)
+            event.set()
 
-  def testJoinNoTimeout(self):
-    cleanup_thread = _common.CleanupThread(behavior=cleanup)
-    cleanup_thread.start()
-    start_time = time.time()
-    cleanup_thread.join()
-    end_time = time.time()
-    self.assertAlmostEqual(_LONG_TIME, end_time - start_time, delta=_EPSILON)
+        cleanup_thread = _common.CleanupThread(
+            behavior=lambda x: None,
+            target=target,
+            name='test-name',
+            args=('arg1', 'arg2'),
+            kwargs={'arg3': 'arg3'})
+        cleanup_thread.start()
+        cleanup_thread.join()
+        self.assertEqual(cleanup_thread.name, 'test-name')
+        self.assertTrue(event.is_set())
 
-  def testJoinTimeout(self):
-    cleanup_thread = _common.CleanupThread(behavior=cleanup)
-    cleanup_thread.start()
-    start_time = time.time()
-    cleanup_thread.join(_SHORT_TIME)
-    end_time = time.time()
-    self.assertAlmostEqual(_SHORT_TIME, end_time - start_time, delta=_EPSILON)
+    def testJoinNoTimeout(self):
+        cleanup_thread = _common.CleanupThread(behavior=cleanup)
+        cleanup_thread.start()
+        start_time = time.time()
+        cleanup_thread.join()
+        end_time = time.time()
+        self.assertAlmostEqual(
+            _LONG_TIME, end_time - start_time, delta=_EPSILON)
 
-  def testJoinTimeoutSlowBehavior(self):
-    cleanup_thread = _common.CleanupThread(behavior=slow_cleanup)
-    cleanup_thread.start()
-    start_time = time.time()
-    cleanup_thread.join(_SHORT_TIME)
-    end_time = time.time()
-    self.assertAlmostEqual(_LONG_TIME, end_time - start_time, delta=_EPSILON)
+    def testJoinTimeout(self):
+        cleanup_thread = _common.CleanupThread(behavior=cleanup)
+        cleanup_thread.start()
+        start_time = time.time()
+        cleanup_thread.join(_SHORT_TIME)
+        end_time = time.time()
+        self.assertAlmostEqual(
+            _SHORT_TIME, end_time - start_time, delta=_EPSILON)
 
-  def testJoinTimeoutSlowTarget(self):
-    event = threading.Event()
-    def target():
-      event.wait(_LONG_TIME)
-    cleanup_thread = _common.CleanupThread(behavior=cleanup, target=target)
-    cleanup_thread.start()
-    start_time = time.time()
-    cleanup_thread.join(_SHORT_TIME)
-    end_time = time.time()
-    self.assertAlmostEqual(_SHORT_TIME, end_time - start_time, delta=_EPSILON)
-    event.set()
+    def testJoinTimeoutSlowBehavior(self):
+        cleanup_thread = _common.CleanupThread(behavior=slow_cleanup)
+        cleanup_thread.start()
+        start_time = time.time()
+        cleanup_thread.join(_SHORT_TIME)
+        end_time = time.time()
+        self.assertAlmostEqual(
+            _LONG_TIME, end_time - start_time, delta=_EPSILON)
 
-  def testJoinZeroTimeout(self):
-    cleanup_thread = _common.CleanupThread(behavior=cleanup)
-    cleanup_thread.start()
-    start_time = time.time()
-    cleanup_thread.join(0)
-    end_time = time.time()
-    self.assertAlmostEqual(0, end_time - start_time, delta=_EPSILON)
+    def testJoinTimeoutSlowTarget(self):
+        event = threading.Event()
+
+        def target():
+            event.wait(_LONG_TIME)
+
+        cleanup_thread = _common.CleanupThread(behavior=cleanup, target=target)
+        cleanup_thread.start()
+        start_time = time.time()
+        cleanup_thread.join(_SHORT_TIME)
+        end_time = time.time()
+        self.assertAlmostEqual(
+            _SHORT_TIME, end_time - start_time, delta=_EPSILON)
+        event.set()
+
+    def testJoinZeroTimeout(self):
+        cleanup_thread = _common.CleanupThread(behavior=cleanup)
+        cleanup_thread.start()
+        start_time = time.time()
+        cleanup_thread.join(0)
+        end_time = time.time()
+        self.assertAlmostEqual(0, end_time - start_time, delta=_EPSILON)
+
 
 if __name__ == '__main__':
-  unittest.main(verbosity=2)
+    unittest.main(verbosity=2)
diff --git a/src/python/grpcio_tests/tests/unit/_thread_pool.py b/src/python/grpcio_tests/tests/unit/_thread_pool.py
index f13cc2f..fad2e1c 100644
--- a/src/python/grpcio_tests/tests/unit/_thread_pool.py
+++ b/src/python/grpcio_tests/tests/unit/_thread_pool.py
@@ -32,17 +32,18 @@
 
 
 class RecordingThreadPool(futures.Executor):
-  """A thread pool that records if used."""
-  def __init__(self, max_workers):
-    self._tp_executor = futures.ThreadPoolExecutor(max_workers=max_workers)
-    self._lock = threading.Lock()
-    self._was_used = False
+    """A thread pool that records if used."""
 
-  def submit(self, fn, *args, **kwargs):
-    with self._lock:
-      self._was_used = True
-    self._tp_executor.submit(fn, *args, **kwargs)
+    def __init__(self, max_workers):
+        self._tp_executor = futures.ThreadPoolExecutor(max_workers=max_workers)
+        self._lock = threading.Lock()
+        self._was_used = False
 
-  def was_used(self):
-    with self._lock:
-      return self._was_used
+    def submit(self, fn, *args, **kwargs):
+        with self._lock:
+            self._was_used = True
+        self._tp_executor.submit(fn, *args, **kwargs)
+
+    def was_used(self):
+        with self._lock:
+            return self._was_used
diff --git a/src/python/grpcio_tests/tests/unit/beta/__init__.py b/src/python/grpcio_tests/tests/unit/beta/__init__.py
index 7086519..b893988 100644
--- a/src/python/grpcio_tests/tests/unit/beta/__init__.py
+++ b/src/python/grpcio_tests/tests/unit/beta/__init__.py
@@ -26,5 +26,3 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
diff --git a/src/python/grpcio_tests/tests/unit/beta/_beta_features_test.py b/src/python/grpcio_tests/tests/unit/beta/_beta_features_test.py
index 3a9701b..b5fdac2 100644
--- a/src/python/grpcio_tests/tests/unit/beta/_beta_features_test.py
+++ b/src/python/grpcio_tests/tests/unit/beta/_beta_features_test.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Tests Face interface compliance of the gRPC Python Beta API."""
 
 import threading
@@ -57,290 +56,303 @@
 
 class _Servicer(object):
 
-  def __init__(self):
-    self._condition = threading.Condition()
-    self._peer = None
-    self._serviced = False
+    def __init__(self):
+        self._condition = threading.Condition()
+        self._peer = None
+        self._serviced = False
 
-  def unary_unary(self, request, context):
-    with self._condition:
-      self._request = request
-      self._peer = context.protocol_context().peer()
-      self._invocation_metadata = context.invocation_metadata()
-      context.protocol_context().disable_next_response_compression()
-      self._serviced = True
-      self._condition.notify_all()
-      return _RESPONSE
+    def unary_unary(self, request, context):
+        with self._condition:
+            self._request = request
+            self._peer = context.protocol_context().peer()
+            self._invocation_metadata = context.invocation_metadata()
+            context.protocol_context().disable_next_response_compression()
+            self._serviced = True
+            self._condition.notify_all()
+            return _RESPONSE
 
-  def unary_stream(self, request, context):
-    with self._condition:
-      self._request = request
-      self._peer = context.protocol_context().peer()
-      self._invocation_metadata = context.invocation_metadata()
-      context.protocol_context().disable_next_response_compression()
-      self._serviced = True
-      self._condition.notify_all()
-      return
-      yield
+    def unary_stream(self, request, context):
+        with self._condition:
+            self._request = request
+            self._peer = context.protocol_context().peer()
+            self._invocation_metadata = context.invocation_metadata()
+            context.protocol_context().disable_next_response_compression()
+            self._serviced = True
+            self._condition.notify_all()
+            return
+            yield
 
-  def stream_unary(self, request_iterator, context):
-    for request in request_iterator:
-      self._request = request
-    with self._condition:
-      self._peer = context.protocol_context().peer()
-      self._invocation_metadata = context.invocation_metadata()
-      context.protocol_context().disable_next_response_compression()
-      self._serviced = True
-      self._condition.notify_all()
-      return _RESPONSE
+    def stream_unary(self, request_iterator, context):
+        for request in request_iterator:
+            self._request = request
+        with self._condition:
+            self._peer = context.protocol_context().peer()
+            self._invocation_metadata = context.invocation_metadata()
+            context.protocol_context().disable_next_response_compression()
+            self._serviced = True
+            self._condition.notify_all()
+            return _RESPONSE
 
-  def stream_stream(self, request_iterator, context):
-    for request in request_iterator:
-      with self._condition:
-        self._peer = context.protocol_context().peer()
-        context.protocol_context().disable_next_response_compression()
-        yield _RESPONSE
-    with self._condition:
-      self._invocation_metadata = context.invocation_metadata()
-      self._serviced = True
-      self._condition.notify_all()
+    def stream_stream(self, request_iterator, context):
+        for request in request_iterator:
+            with self._condition:
+                self._peer = context.protocol_context().peer()
+                context.protocol_context().disable_next_response_compression()
+                yield _RESPONSE
+        with self._condition:
+            self._invocation_metadata = context.invocation_metadata()
+            self._serviced = True
+            self._condition.notify_all()
 
-  def peer(self):
-    with self._condition:
-      return self._peer
+    def peer(self):
+        with self._condition:
+            return self._peer
 
-  def block_until_serviced(self):
-    with self._condition:
-      while not self._serviced:
-        self._condition.wait()
+    def block_until_serviced(self):
+        with self._condition:
+            while not self._serviced:
+                self._condition.wait()
 
 
 class _BlockingIterator(object):
 
-  def __init__(self, upstream):
-    self._condition = threading.Condition()
-    self._upstream = upstream
-    self._allowed = []
+    def __init__(self, upstream):
+        self._condition = threading.Condition()
+        self._upstream = upstream
+        self._allowed = []
 
-  def __iter__(self):
-    return self
+    def __iter__(self):
+        return self
 
-  def __next__(self):
-    return self.next()
+    def __next__(self):
+        return self.next()
 
-  def next(self):
-    with self._condition:
-      while True:
-        if self._allowed is None:
-          raise StopIteration()
-        elif self._allowed:
-          return self._allowed.pop(0)
-        else:
-          self._condition.wait()
+    def next(self):
+        with self._condition:
+            while True:
+                if self._allowed is None:
+                    raise StopIteration()
+                elif self._allowed:
+                    return self._allowed.pop(0)
+                else:
+                    self._condition.wait()
 
-  def allow(self):
-    with self._condition:
-      try:
-        self._allowed.append(next(self._upstream))
-      except StopIteration:
-        self._allowed = None
-      self._condition.notify_all()
+    def allow(self):
+        with self._condition:
+            try:
+                self._allowed.append(next(self._upstream))
+            except StopIteration:
+                self._allowed = None
+            self._condition.notify_all()
 
 
 def _metadata_plugin(context, callback):
-  callback([(_PER_RPC_CREDENTIALS_METADATA_KEY,
-             _PER_RPC_CREDENTIALS_METADATA_VALUE)], None)
+    callback([(_PER_RPC_CREDENTIALS_METADATA_KEY,
+               _PER_RPC_CREDENTIALS_METADATA_VALUE)], None)
 
 
 class BetaFeaturesTest(unittest.TestCase):
 
-  def setUp(self):
-    self._servicer = _Servicer()
-    method_implementations = {
-        (_GROUP, _UNARY_UNARY):
+    def setUp(self):
+        self._servicer = _Servicer()
+        method_implementations = {
+            (_GROUP, _UNARY_UNARY):
             utilities.unary_unary_inline(self._servicer.unary_unary),
-        (_GROUP, _UNARY_STREAM):
+            (_GROUP, _UNARY_STREAM):
             utilities.unary_stream_inline(self._servicer.unary_stream),
-        (_GROUP, _STREAM_UNARY):
+            (_GROUP, _STREAM_UNARY):
             utilities.stream_unary_inline(self._servicer.stream_unary),
-        (_GROUP, _STREAM_STREAM):
+            (_GROUP, _STREAM_STREAM):
             utilities.stream_stream_inline(self._servicer.stream_stream),
-    }
+        }
 
-    cardinalities = {
-        _UNARY_UNARY: cardinality.Cardinality.UNARY_UNARY,
-        _UNARY_STREAM: cardinality.Cardinality.UNARY_STREAM,
-        _STREAM_UNARY: cardinality.Cardinality.STREAM_UNARY,
-        _STREAM_STREAM: cardinality.Cardinality.STREAM_STREAM,
-    }
+        cardinalities = {
+            _UNARY_UNARY: cardinality.Cardinality.UNARY_UNARY,
+            _UNARY_STREAM: cardinality.Cardinality.UNARY_STREAM,
+            _STREAM_UNARY: cardinality.Cardinality.STREAM_UNARY,
+            _STREAM_STREAM: cardinality.Cardinality.STREAM_STREAM,
+        }
 
-    server_options = implementations.server_options(
-        thread_pool_size=test_constants.POOL_SIZE)
-    self._server = implementations.server(
-        method_implementations, options=server_options)
-    server_credentials = implementations.ssl_server_credentials(
-        [(resources.private_key(), resources.certificate_chain(),),])
-    port = self._server.add_secure_port('[::]:0', server_credentials)
-    self._server.start()
-    self._channel_credentials = implementations.ssl_channel_credentials(
-        resources.test_root_certificates())
-    self._call_credentials = implementations.metadata_call_credentials(
-        _metadata_plugin)
-    channel = test_utilities.not_really_secure_channel(
-        'localhost', port, self._channel_credentials, _SERVER_HOST_OVERRIDE)
-    stub_options = implementations.stub_options(
-        thread_pool_size=test_constants.POOL_SIZE)
-    self._dynamic_stub = implementations.dynamic_stub(
-        channel, _GROUP, cardinalities, options=stub_options)
+        server_options = implementations.server_options(
+            thread_pool_size=test_constants.POOL_SIZE)
+        self._server = implementations.server(
+            method_implementations, options=server_options)
+        server_credentials = implementations.ssl_server_credentials([(
+            resources.private_key(),
+            resources.certificate_chain(),),])
+        port = self._server.add_secure_port('[::]:0', server_credentials)
+        self._server.start()
+        self._channel_credentials = implementations.ssl_channel_credentials(
+            resources.test_root_certificates())
+        self._call_credentials = implementations.metadata_call_credentials(
+            _metadata_plugin)
+        channel = test_utilities.not_really_secure_channel(
+            'localhost', port, self._channel_credentials, _SERVER_HOST_OVERRIDE)
+        stub_options = implementations.stub_options(
+            thread_pool_size=test_constants.POOL_SIZE)
+        self._dynamic_stub = implementations.dynamic_stub(
+            channel, _GROUP, cardinalities, options=stub_options)
 
-  def tearDown(self):
-    self._dynamic_stub = None
-    self._server.stop(test_constants.SHORT_TIMEOUT).wait()
+    def tearDown(self):
+        self._dynamic_stub = None
+        self._server.stop(test_constants.SHORT_TIMEOUT).wait()
 
-  def test_unary_unary(self):
-    call_options = interfaces.grpc_call_options(
-        disable_compression=True, credentials=self._call_credentials)
-    response = getattr(self._dynamic_stub, _UNARY_UNARY)(
-        _REQUEST, test_constants.LONG_TIMEOUT, protocol_options=call_options)
-    self.assertEqual(_RESPONSE, response)
-    self.assertIsNotNone(self._servicer.peer())
-    invocation_metadata = [(metadatum.key, metadatum.value) for metadatum in
-                           self._servicer._invocation_metadata]
-    self.assertIn(
-        (_PER_RPC_CREDENTIALS_METADATA_KEY,
-         _PER_RPC_CREDENTIALS_METADATA_VALUE),
-        invocation_metadata)
+    def test_unary_unary(self):
+        call_options = interfaces.grpc_call_options(
+            disable_compression=True, credentials=self._call_credentials)
+        response = getattr(self._dynamic_stub, _UNARY_UNARY)(
+            _REQUEST,
+            test_constants.LONG_TIMEOUT,
+            protocol_options=call_options)
+        self.assertEqual(_RESPONSE, response)
+        self.assertIsNotNone(self._servicer.peer())
+        invocation_metadata = [
+            (metadatum.key, metadatum.value)
+            for metadatum in self._servicer._invocation_metadata
+        ]
+        self.assertIn((_PER_RPC_CREDENTIALS_METADATA_KEY,
+                       _PER_RPC_CREDENTIALS_METADATA_VALUE),
+                      invocation_metadata)
 
-  def test_unary_stream(self):
-    call_options = interfaces.grpc_call_options(
-        disable_compression=True, credentials=self._call_credentials)
-    response_iterator = getattr(self._dynamic_stub, _UNARY_STREAM)(
-        _REQUEST, test_constants.LONG_TIMEOUT, protocol_options=call_options)
-    self._servicer.block_until_serviced()
-    self.assertIsNotNone(self._servicer.peer())
-    invocation_metadata = [(metadatum.key, metadatum.value) for metadatum in
-                           self._servicer._invocation_metadata]
-    self.assertIn(
-        (_PER_RPC_CREDENTIALS_METADATA_KEY,
-         _PER_RPC_CREDENTIALS_METADATA_VALUE),
-        invocation_metadata)
+    def test_unary_stream(self):
+        call_options = interfaces.grpc_call_options(
+            disable_compression=True, credentials=self._call_credentials)
+        response_iterator = getattr(self._dynamic_stub, _UNARY_STREAM)(
+            _REQUEST,
+            test_constants.LONG_TIMEOUT,
+            protocol_options=call_options)
+        self._servicer.block_until_serviced()
+        self.assertIsNotNone(self._servicer.peer())
+        invocation_metadata = [
+            (metadatum.key, metadatum.value)
+            for metadatum in self._servicer._invocation_metadata
+        ]
+        self.assertIn((_PER_RPC_CREDENTIALS_METADATA_KEY,
+                       _PER_RPC_CREDENTIALS_METADATA_VALUE),
+                      invocation_metadata)
 
-  def test_stream_unary(self):
-    call_options = interfaces.grpc_call_options(
-        credentials=self._call_credentials)
-    request_iterator = _BlockingIterator(iter((_REQUEST,)))
-    response_future = getattr(self._dynamic_stub, _STREAM_UNARY).future(
-        request_iterator, test_constants.LONG_TIMEOUT,
-        protocol_options=call_options)
-    response_future.protocol_context().disable_next_request_compression()
-    request_iterator.allow()
-    response_future.protocol_context().disable_next_request_compression()
-    request_iterator.allow()
-    self._servicer.block_until_serviced()
-    self.assertIsNotNone(self._servicer.peer())
-    self.assertEqual(_RESPONSE, response_future.result())
-    invocation_metadata = [(metadatum.key, metadatum.value) for metadatum in
-                           self._servicer._invocation_metadata]
-    self.assertIn(
-        (_PER_RPC_CREDENTIALS_METADATA_KEY,
-         _PER_RPC_CREDENTIALS_METADATA_VALUE),
-        invocation_metadata)
+    def test_stream_unary(self):
+        call_options = interfaces.grpc_call_options(
+            credentials=self._call_credentials)
+        request_iterator = _BlockingIterator(iter((_REQUEST,)))
+        response_future = getattr(self._dynamic_stub, _STREAM_UNARY).future(
+            request_iterator,
+            test_constants.LONG_TIMEOUT,
+            protocol_options=call_options)
+        response_future.protocol_context().disable_next_request_compression()
+        request_iterator.allow()
+        response_future.protocol_context().disable_next_request_compression()
+        request_iterator.allow()
+        self._servicer.block_until_serviced()
+        self.assertIsNotNone(self._servicer.peer())
+        self.assertEqual(_RESPONSE, response_future.result())
+        invocation_metadata = [
+            (metadatum.key, metadatum.value)
+            for metadatum in self._servicer._invocation_metadata
+        ]
+        self.assertIn((_PER_RPC_CREDENTIALS_METADATA_KEY,
+                       _PER_RPC_CREDENTIALS_METADATA_VALUE),
+                      invocation_metadata)
 
-  def test_stream_stream(self):
-    call_options = interfaces.grpc_call_options(
-        credentials=self._call_credentials)
-    request_iterator = _BlockingIterator(iter((_REQUEST,)))
-    response_iterator = getattr(self._dynamic_stub, _STREAM_STREAM)(
-        request_iterator, test_constants.SHORT_TIMEOUT,
-        protocol_options=call_options)
-    response_iterator.protocol_context().disable_next_request_compression()
-    request_iterator.allow()
-    response = next(response_iterator)
-    response_iterator.protocol_context().disable_next_request_compression()
-    request_iterator.allow()
-    self._servicer.block_until_serviced()
-    self.assertIsNotNone(self._servicer.peer())
-    self.assertEqual(_RESPONSE, response)
-    invocation_metadata = [(metadatum.key, metadatum.value) for metadatum in
-                           self._servicer._invocation_metadata]
-    self.assertIn(
-        (_PER_RPC_CREDENTIALS_METADATA_KEY,
-         _PER_RPC_CREDENTIALS_METADATA_VALUE),
-        invocation_metadata)
+    def test_stream_stream(self):
+        call_options = interfaces.grpc_call_options(
+            credentials=self._call_credentials)
+        request_iterator = _BlockingIterator(iter((_REQUEST,)))
+        response_iterator = getattr(self._dynamic_stub, _STREAM_STREAM)(
+            request_iterator,
+            test_constants.SHORT_TIMEOUT,
+            protocol_options=call_options)
+        response_iterator.protocol_context().disable_next_request_compression()
+        request_iterator.allow()
+        response = next(response_iterator)
+        response_iterator.protocol_context().disable_next_request_compression()
+        request_iterator.allow()
+        self._servicer.block_until_serviced()
+        self.assertIsNotNone(self._servicer.peer())
+        self.assertEqual(_RESPONSE, response)
+        invocation_metadata = [
+            (metadatum.key, metadatum.value)
+            for metadatum in self._servicer._invocation_metadata
+        ]
+        self.assertIn((_PER_RPC_CREDENTIALS_METADATA_KEY,
+                       _PER_RPC_CREDENTIALS_METADATA_VALUE),
+                      invocation_metadata)
 
 
 class ContextManagementAndLifecycleTest(unittest.TestCase):
 
-  def setUp(self):
-    self._servicer = _Servicer()
-    self._method_implementations = {
-        (_GROUP, _UNARY_UNARY):
+    def setUp(self):
+        self._servicer = _Servicer()
+        self._method_implementations = {
+            (_GROUP, _UNARY_UNARY):
             utilities.unary_unary_inline(self._servicer.unary_unary),
-        (_GROUP, _UNARY_STREAM):
+            (_GROUP, _UNARY_STREAM):
             utilities.unary_stream_inline(self._servicer.unary_stream),
-        (_GROUP, _STREAM_UNARY):
+            (_GROUP, _STREAM_UNARY):
             utilities.stream_unary_inline(self._servicer.stream_unary),
-        (_GROUP, _STREAM_STREAM):
+            (_GROUP, _STREAM_STREAM):
             utilities.stream_stream_inline(self._servicer.stream_stream),
-    }
+        }
 
-    self._cardinalities = {
-        _UNARY_UNARY: cardinality.Cardinality.UNARY_UNARY,
-        _UNARY_STREAM: cardinality.Cardinality.UNARY_STREAM,
-        _STREAM_UNARY: cardinality.Cardinality.STREAM_UNARY,
-        _STREAM_STREAM: cardinality.Cardinality.STREAM_STREAM,
-    }
+        self._cardinalities = {
+            _UNARY_UNARY: cardinality.Cardinality.UNARY_UNARY,
+            _UNARY_STREAM: cardinality.Cardinality.UNARY_STREAM,
+            _STREAM_UNARY: cardinality.Cardinality.STREAM_UNARY,
+            _STREAM_STREAM: cardinality.Cardinality.STREAM_STREAM,
+        }
 
-    self._server_options = implementations.server_options(
-        thread_pool_size=test_constants.POOL_SIZE)
-    self._server_credentials = implementations.ssl_server_credentials(
-        [(resources.private_key(), resources.certificate_chain(),),])
-    self._channel_credentials = implementations.ssl_channel_credentials(
-        resources.test_root_certificates())
-    self._stub_options = implementations.stub_options(
-        thread_pool_size=test_constants.POOL_SIZE)
+        self._server_options = implementations.server_options(
+            thread_pool_size=test_constants.POOL_SIZE)
+        self._server_credentials = implementations.ssl_server_credentials([(
+            resources.private_key(),
+            resources.certificate_chain(),),])
+        self._channel_credentials = implementations.ssl_channel_credentials(
+            resources.test_root_certificates())
+        self._stub_options = implementations.stub_options(
+            thread_pool_size=test_constants.POOL_SIZE)
 
-  def test_stub_context(self):
-    server = implementations.server(
-        self._method_implementations, options=self._server_options)
-    port = server.add_secure_port('[::]:0', self._server_credentials)
-    server.start()
+    def test_stub_context(self):
+        server = implementations.server(
+            self._method_implementations, options=self._server_options)
+        port = server.add_secure_port('[::]:0', self._server_credentials)
+        server.start()
 
-    channel = test_utilities.not_really_secure_channel(
-        'localhost', port, self._channel_credentials, _SERVER_HOST_OVERRIDE)
-    dynamic_stub = implementations.dynamic_stub(
-        channel, _GROUP, self._cardinalities, options=self._stub_options)
-    for _ in range(100):
-      with dynamic_stub:
-        pass
-    for _ in range(10):
-      with dynamic_stub:
-        call_options = interfaces.grpc_call_options(
-            disable_compression=True)
-        response = getattr(dynamic_stub, _UNARY_UNARY)(
-            _REQUEST, test_constants.LONG_TIMEOUT,
-            protocol_options=call_options)
-        self.assertEqual(_RESPONSE, response)
-        self.assertIsNotNone(self._servicer.peer())
+        channel = test_utilities.not_really_secure_channel(
+            'localhost', port, self._channel_credentials, _SERVER_HOST_OVERRIDE)
+        dynamic_stub = implementations.dynamic_stub(
+            channel, _GROUP, self._cardinalities, options=self._stub_options)
+        for _ in range(100):
+            with dynamic_stub:
+                pass
+        for _ in range(10):
+            with dynamic_stub:
+                call_options = interfaces.grpc_call_options(
+                    disable_compression=True)
+                response = getattr(dynamic_stub, _UNARY_UNARY)(
+                    _REQUEST,
+                    test_constants.LONG_TIMEOUT,
+                    protocol_options=call_options)
+                self.assertEqual(_RESPONSE, response)
+                self.assertIsNotNone(self._servicer.peer())
 
-    server.stop(test_constants.SHORT_TIMEOUT).wait()
+        server.stop(test_constants.SHORT_TIMEOUT).wait()
 
-  def test_server_lifecycle(self):
-    for _ in range(100):
-      server = implementations.server(
-          self._method_implementations, options=self._server_options)
-      port = server.add_secure_port('[::]:0', self._server_credentials)
-      server.start()
-      server.stop(test_constants.SHORT_TIMEOUT).wait()
-    for _ in range(100):
-      server = implementations.server(
-          self._method_implementations, options=self._server_options)
-      server.add_secure_port('[::]:0', self._server_credentials)
-      server.add_insecure_port('[::]:0')
-      with server:
-        server.stop(test_constants.SHORT_TIMEOUT)
-      server.stop(test_constants.SHORT_TIMEOUT)
+    def test_server_lifecycle(self):
+        for _ in range(100):
+            server = implementations.server(
+                self._method_implementations, options=self._server_options)
+            port = server.add_secure_port('[::]:0', self._server_credentials)
+            server.start()
+            server.stop(test_constants.SHORT_TIMEOUT).wait()
+        for _ in range(100):
+            server = implementations.server(
+                self._method_implementations, options=self._server_options)
+            server.add_secure_port('[::]:0', self._server_credentials)
+            server.add_insecure_port('[::]:0')
+            with server:
+                server.stop(test_constants.SHORT_TIMEOUT)
+            server.stop(test_constants.SHORT_TIMEOUT)
 
 
 if __name__ == '__main__':
-  unittest.main(verbosity=2)
+    unittest.main(verbosity=2)
diff --git a/src/python/grpcio_tests/tests/unit/beta/_connectivity_channel_test.py b/src/python/grpcio_tests/tests/unit/beta/_connectivity_channel_test.py
index 5d826a2..49d683b 100644
--- a/src/python/grpcio_tests/tests/unit/beta/_connectivity_channel_test.py
+++ b/src/python/grpcio_tests/tests/unit/beta/_connectivity_channel_test.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Tests of grpc.beta._connectivity_channel."""
 
 import unittest
@@ -36,13 +35,13 @@
 
 class ConnectivityStatesTest(unittest.TestCase):
 
-  def testBetaConnectivityStates(self):
-    self.assertIsNotNone(interfaces.ChannelConnectivity.IDLE)
-    self.assertIsNotNone(interfaces.ChannelConnectivity.CONNECTING)
-    self.assertIsNotNone(interfaces.ChannelConnectivity.READY)
-    self.assertIsNotNone(interfaces.ChannelConnectivity.TRANSIENT_FAILURE)
-    self.assertIsNotNone(interfaces.ChannelConnectivity.FATAL_FAILURE)
+    def testBetaConnectivityStates(self):
+        self.assertIsNotNone(interfaces.ChannelConnectivity.IDLE)
+        self.assertIsNotNone(interfaces.ChannelConnectivity.CONNECTING)
+        self.assertIsNotNone(interfaces.ChannelConnectivity.READY)
+        self.assertIsNotNone(interfaces.ChannelConnectivity.TRANSIENT_FAILURE)
+        self.assertIsNotNone(interfaces.ChannelConnectivity.FATAL_FAILURE)
 
 
 if __name__ == '__main__':
-  unittest.main(verbosity=2)
+    unittest.main(verbosity=2)
diff --git a/src/python/grpcio_tests/tests/unit/beta/_face_interface_test.py b/src/python/grpcio_tests/tests/unit/beta/_face_interface_test.py
index 3a67516..f421442 100644
--- a/src/python/grpcio_tests/tests/unit/beta/_face_interface_test.py
+++ b/src/python/grpcio_tests/tests/unit/beta/_face_interface_test.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Tests Face interface compliance of the gRPC Python Beta API."""
 
 import collections
@@ -47,94 +46,97 @@
 
 
 class _SerializationBehaviors(
-    collections.namedtuple(
-        '_SerializationBehaviors',
-        ('request_serializers', 'request_deserializers', 'response_serializers',
-         'response_deserializers',))):
-  pass
+        collections.namedtuple('_SerializationBehaviors', (
+            'request_serializers',
+            'request_deserializers',
+            'response_serializers',
+            'response_deserializers',))):
+    pass
 
 
 def _serialization_behaviors_from_test_methods(test_methods):
-  request_serializers = {}
-  request_deserializers = {}
-  response_serializers = {}
-  response_deserializers = {}
-  for (group, method), test_method in six.iteritems(test_methods):
-    request_serializers[group, method] = test_method.serialize_request
-    request_deserializers[group, method] = test_method.deserialize_request
-    response_serializers[group, method] = test_method.serialize_response
-    response_deserializers[group, method] = test_method.deserialize_response
-  return _SerializationBehaviors(
-      request_serializers, request_deserializers, response_serializers,
-      response_deserializers)
+    request_serializers = {}
+    request_deserializers = {}
+    response_serializers = {}
+    response_deserializers = {}
+    for (group, method), test_method in six.iteritems(test_methods):
+        request_serializers[group, method] = test_method.serialize_request
+        request_deserializers[group, method] = test_method.deserialize_request
+        response_serializers[group, method] = test_method.serialize_response
+        response_deserializers[group, method] = test_method.deserialize_response
+    return _SerializationBehaviors(request_serializers, request_deserializers,
+                                   response_serializers, response_deserializers)
 
 
 class _Implementation(test_interfaces.Implementation):
 
-  def instantiate(
-      self, methods, method_implementations, multi_method_implementation):
-    serialization_behaviors = _serialization_behaviors_from_test_methods(
-        methods)
-    # TODO(nathaniel): Add a "groups" attribute to _digest.TestServiceDigest.
-    service = next(iter(methods))[0]
-    # TODO(nathaniel): Add a "cardinalities_by_group" attribute to
-    # _digest.TestServiceDigest.
-    cardinalities = {
-        method: method_object.cardinality()
-        for (group, method), method_object in six.iteritems(methods)}
+    def instantiate(self, methods, method_implementations,
+                    multi_method_implementation):
+        serialization_behaviors = _serialization_behaviors_from_test_methods(
+            methods)
+        # TODO(nathaniel): Add a "groups" attribute to _digest.TestServiceDigest.
+        service = next(iter(methods))[0]
+        # TODO(nathaniel): Add a "cardinalities_by_group" attribute to
+        # _digest.TestServiceDigest.
+        cardinalities = {
+            method: method_object.cardinality()
+            for (group, method), method_object in six.iteritems(methods)
+        }
 
-    server_options = implementations.server_options(
-        request_deserializers=serialization_behaviors.request_deserializers,
-        response_serializers=serialization_behaviors.response_serializers,
-        thread_pool_size=test_constants.POOL_SIZE)
-    server = implementations.server(
-        method_implementations, options=server_options)
-    server_credentials = implementations.ssl_server_credentials(
-        [(resources.private_key(), resources.certificate_chain(),),])
-    port = server.add_secure_port('[::]:0', server_credentials)
-    server.start()
-    channel_credentials = implementations.ssl_channel_credentials(
-        resources.test_root_certificates())
-    channel = test_utilities.not_really_secure_channel(
-        'localhost', port, channel_credentials, _SERVER_HOST_OVERRIDE)
-    stub_options = implementations.stub_options(
-        request_serializers=serialization_behaviors.request_serializers,
-        response_deserializers=serialization_behaviors.response_deserializers,
-        thread_pool_size=test_constants.POOL_SIZE)
-    generic_stub = implementations.generic_stub(channel, options=stub_options)
-    dynamic_stub = implementations.dynamic_stub(
-        channel, service, cardinalities, options=stub_options)
-    return generic_stub, {service: dynamic_stub}, server
+        server_options = implementations.server_options(
+            request_deserializers=serialization_behaviors.request_deserializers,
+            response_serializers=serialization_behaviors.response_serializers,
+            thread_pool_size=test_constants.POOL_SIZE)
+        server = implementations.server(
+            method_implementations, options=server_options)
+        server_credentials = implementations.ssl_server_credentials([(
+            resources.private_key(),
+            resources.certificate_chain(),),])
+        port = server.add_secure_port('[::]:0', server_credentials)
+        server.start()
+        channel_credentials = implementations.ssl_channel_credentials(
+            resources.test_root_certificates())
+        channel = test_utilities.not_really_secure_channel(
+            'localhost', port, channel_credentials, _SERVER_HOST_OVERRIDE)
+        stub_options = implementations.stub_options(
+            request_serializers=serialization_behaviors.request_serializers,
+            response_deserializers=serialization_behaviors.
+            response_deserializers,
+            thread_pool_size=test_constants.POOL_SIZE)
+        generic_stub = implementations.generic_stub(
+            channel, options=stub_options)
+        dynamic_stub = implementations.dynamic_stub(
+            channel, service, cardinalities, options=stub_options)
+        return generic_stub, {service: dynamic_stub}, server
 
-  def destantiate(self, memo):
-    memo.stop(test_constants.SHORT_TIMEOUT).wait()
+    def destantiate(self, memo):
+        memo.stop(test_constants.SHORT_TIMEOUT).wait()
 
-  def invocation_metadata(self):
-    return grpc_test_common.INVOCATION_INITIAL_METADATA
+    def invocation_metadata(self):
+        return grpc_test_common.INVOCATION_INITIAL_METADATA
 
-  def initial_metadata(self):
-    return grpc_test_common.SERVICE_INITIAL_METADATA
+    def initial_metadata(self):
+        return grpc_test_common.SERVICE_INITIAL_METADATA
 
-  def terminal_metadata(self):
-    return grpc_test_common.SERVICE_TERMINAL_METADATA
+    def terminal_metadata(self):
+        return grpc_test_common.SERVICE_TERMINAL_METADATA
 
-  def code(self):
-    return interfaces.StatusCode.OK
+    def code(self):
+        return interfaces.StatusCode.OK
 
-  def details(self):
-    return grpc_test_common.DETAILS
+    def details(self):
+        return grpc_test_common.DETAILS
 
-  def metadata_transmitted(self, original_metadata, transmitted_metadata):
-    return original_metadata is None or grpc_test_common.metadata_transmitted(
-        original_metadata, transmitted_metadata)
+    def metadata_transmitted(self, original_metadata, transmitted_metadata):
+        return original_metadata is None or grpc_test_common.metadata_transmitted(
+            original_metadata, transmitted_metadata)
 
 
 def load_tests(loader, tests, pattern):
-  return unittest.TestSuite(
-      tests=tuple(
-          loader.loadTestsFromTestCase(test_case_class)
-          for test_case_class in test_cases.test_cases(_Implementation())))
+    return unittest.TestSuite(tests=tuple(
+        loader.loadTestsFromTestCase(test_case_class)
+        for test_case_class in test_cases.test_cases(_Implementation())))
 
 
 if __name__ == '__main__':
-  unittest.main(verbosity=2)
+    unittest.main(verbosity=2)
diff --git a/src/python/grpcio_tests/tests/unit/beta/_implementations_test.py b/src/python/grpcio_tests/tests/unit/beta/_implementations_test.py
index 127f93e..69bb5cc 100644
--- a/src/python/grpcio_tests/tests/unit/beta/_implementations_test.py
+++ b/src/python/grpcio_tests/tests/unit/beta/_implementations_test.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Tests the implementations module of the gRPC Python Beta API."""
 
 import datetime
@@ -40,31 +39,32 @@
 
 class ChannelCredentialsTest(unittest.TestCase):
 
-  def test_runtime_provided_root_certificates(self):
-    channel_credentials = implementations.ssl_channel_credentials()
-    self.assertIsInstance(
-        channel_credentials, implementations.ChannelCredentials)
-  
-  def test_application_provided_root_certificates(self):
-    channel_credentials = implementations.ssl_channel_credentials(
-        resources.test_root_certificates())
-    self.assertIsInstance(
-        channel_credentials, implementations.ChannelCredentials)
+    def test_runtime_provided_root_certificates(self):
+        channel_credentials = implementations.ssl_channel_credentials()
+        self.assertIsInstance(channel_credentials,
+                              implementations.ChannelCredentials)
+
+    def test_application_provided_root_certificates(self):
+        channel_credentials = implementations.ssl_channel_credentials(
+            resources.test_root_certificates())
+        self.assertIsInstance(channel_credentials,
+                              implementations.ChannelCredentials)
 
 
 class CallCredentialsTest(unittest.TestCase):
 
-  def test_google_call_credentials(self):
-    creds = oauth2client_client.GoogleCredentials(
-        'token', 'client_id', 'secret', 'refresh_token',
-        datetime.datetime(2008, 6, 24), 'https://refresh.uri.com/',
-        'user_agent')
-    call_creds = implementations.google_call_credentials(creds)
-    self.assertIsInstance(call_creds, implementations.CallCredentials)
+    def test_google_call_credentials(self):
+        creds = oauth2client_client.GoogleCredentials(
+            'token', 'client_id', 'secret', 'refresh_token',
+            datetime.datetime(2008, 6, 24), 'https://refresh.uri.com/',
+            'user_agent')
+        call_creds = implementations.google_call_credentials(creds)
+        self.assertIsInstance(call_creds, implementations.CallCredentials)
 
-  def test_access_token_call_credentials(self):
-    call_creds = implementations.access_token_call_credentials('token')
-    self.assertIsInstance(call_creds, implementations.CallCredentials)
+    def test_access_token_call_credentials(self):
+        call_creds = implementations.access_token_call_credentials('token')
+        self.assertIsInstance(call_creds, implementations.CallCredentials)
+
 
 if __name__ == '__main__':
-  unittest.main(verbosity=2)
+    unittest.main(verbosity=2)
diff --git a/src/python/grpcio_tests/tests/unit/beta/_not_found_test.py b/src/python/grpcio_tests/tests/unit/beta/_not_found_test.py
index 37b8c49..ce7b91e 100644
--- a/src/python/grpcio_tests/tests/unit/beta/_not_found_test.py
+++ b/src/python/grpcio_tests/tests/unit/beta/_not_found_test.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Tests of RPC-method-not-found behavior."""
 
 import unittest
@@ -39,37 +38,38 @@
 
 class NotFoundTest(unittest.TestCase):
 
-  def setUp(self):
-    self._server = implementations.server({})
-    port = self._server.add_insecure_port('[::]:0')
-    channel = implementations.insecure_channel('localhost', port)
-    self._generic_stub = implementations.generic_stub(channel)
-    self._server.start()
+    def setUp(self):
+        self._server = implementations.server({})
+        port = self._server.add_insecure_port('[::]:0')
+        channel = implementations.insecure_channel('localhost', port)
+        self._generic_stub = implementations.generic_stub(channel)
+        self._server.start()
 
-  def tearDown(self):
-    self._server.stop(0).wait()
-    self._generic_stub = None
+    def tearDown(self):
+        self._server.stop(0).wait()
+        self._generic_stub = None
 
-  def test_blocking_unary_unary_not_found(self):
-    with self.assertRaises(face.LocalError) as exception_assertion_context:
-      self._generic_stub.blocking_unary_unary(
-          'groop', 'meffod', b'abc', test_constants.LONG_TIMEOUT,
-          with_call=True)
-    self.assertIs(
-        exception_assertion_context.exception.code,
-        interfaces.StatusCode.UNIMPLEMENTED)
+    def test_blocking_unary_unary_not_found(self):
+        with self.assertRaises(face.LocalError) as exception_assertion_context:
+            self._generic_stub.blocking_unary_unary(
+                'groop',
+                'meffod',
+                b'abc',
+                test_constants.LONG_TIMEOUT,
+                with_call=True)
+        self.assertIs(exception_assertion_context.exception.code,
+                      interfaces.StatusCode.UNIMPLEMENTED)
 
-  def test_future_stream_unary_not_found(self):
-    rpc_future = self._generic_stub.future_stream_unary(
-        'grupe', 'mevvod', [b'def'], test_constants.LONG_TIMEOUT)
-    with self.assertRaises(face.LocalError) as exception_assertion_context:
-      rpc_future.result()
-    self.assertIs(
-        exception_assertion_context.exception.code,
-        interfaces.StatusCode.UNIMPLEMENTED)
-    self.assertIs(
-        rpc_future.exception().code, interfaces.StatusCode.UNIMPLEMENTED)
+    def test_future_stream_unary_not_found(self):
+        rpc_future = self._generic_stub.future_stream_unary(
+            'grupe', 'mevvod', iter([b'def']), test_constants.LONG_TIMEOUT)
+        with self.assertRaises(face.LocalError) as exception_assertion_context:
+            rpc_future.result()
+        self.assertIs(exception_assertion_context.exception.code,
+                      interfaces.StatusCode.UNIMPLEMENTED)
+        self.assertIs(rpc_future.exception().code,
+                      interfaces.StatusCode.UNIMPLEMENTED)
 
 
 if __name__ == '__main__':
-  unittest.main(verbosity=2)
+    unittest.main(verbosity=2)
diff --git a/src/python/grpcio_tests/tests/unit/beta/_utilities_test.py b/src/python/grpcio_tests/tests/unit/beta/_utilities_test.py
index 9cce96c..e8e62c3 100644
--- a/src/python/grpcio_tests/tests/unit/beta/_utilities_test.py
+++ b/src/python/grpcio_tests/tests/unit/beta/_utilities_test.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Tests of grpc.beta.utilities."""
 
 import threading
@@ -41,68 +40,68 @@
 
 class _Callback(object):
 
-  def __init__(self):
-    self._condition = threading.Condition()
-    self._value = None
+    def __init__(self):
+        self._condition = threading.Condition()
+        self._value = None
 
-  def accept_value(self, value):
-    with self._condition:
-      self._value = value
-      self._condition.notify_all()
+    def accept_value(self, value):
+        with self._condition:
+            self._value = value
+            self._condition.notify_all()
 
-  def block_until_called(self):
-    with self._condition:
-      while self._value is None:
-        self._condition.wait()
-      return self._value
+    def block_until_called(self):
+        with self._condition:
+            while self._value is None:
+                self._condition.wait()
+            return self._value
 
 
 class ChannelConnectivityTest(unittest.TestCase):
 
-  def test_lonely_channel_connectivity(self):
-    channel = implementations.insecure_channel('localhost', 12345)
-    callback = _Callback()
+    def test_lonely_channel_connectivity(self):
+        channel = implementations.insecure_channel('localhost', 12345)
+        callback = _Callback()
 
-    ready_future = utilities.channel_ready_future(channel)
-    ready_future.add_done_callback(callback.accept_value)
-    with self.assertRaises(future.TimeoutError):
-      ready_future.result(timeout=test_constants.SHORT_TIMEOUT)
-    self.assertFalse(ready_future.cancelled())
-    self.assertFalse(ready_future.done())
-    self.assertTrue(ready_future.running())
-    ready_future.cancel()
-    value_passed_to_callback = callback.block_until_called()
-    self.assertIs(ready_future, value_passed_to_callback)
-    self.assertTrue(ready_future.cancelled())
-    self.assertTrue(ready_future.done())
-    self.assertFalse(ready_future.running())
+        ready_future = utilities.channel_ready_future(channel)
+        ready_future.add_done_callback(callback.accept_value)
+        with self.assertRaises(future.TimeoutError):
+            ready_future.result(timeout=test_constants.SHORT_TIMEOUT)
+        self.assertFalse(ready_future.cancelled())
+        self.assertFalse(ready_future.done())
+        self.assertTrue(ready_future.running())
+        ready_future.cancel()
+        value_passed_to_callback = callback.block_until_called()
+        self.assertIs(ready_future, value_passed_to_callback)
+        self.assertTrue(ready_future.cancelled())
+        self.assertTrue(ready_future.done())
+        self.assertFalse(ready_future.running())
 
-  def test_immediately_connectable_channel_connectivity(self):
-    server = implementations.server({})
-    port = server.add_insecure_port('[::]:0')
-    server.start()
-    channel = implementations.insecure_channel('localhost', port)
-    callback = _Callback()
+    def test_immediately_connectable_channel_connectivity(self):
+        server = implementations.server({})
+        port = server.add_insecure_port('[::]:0')
+        server.start()
+        channel = implementations.insecure_channel('localhost', port)
+        callback = _Callback()
 
-    try:
-      ready_future = utilities.channel_ready_future(channel)
-      ready_future.add_done_callback(callback.accept_value)
-      self.assertIsNone(
-          ready_future.result(timeout=test_constants.LONG_TIMEOUT))
-      value_passed_to_callback = callback.block_until_called()
-      self.assertIs(ready_future, value_passed_to_callback)
-      self.assertFalse(ready_future.cancelled())
-      self.assertTrue(ready_future.done())
-      self.assertFalse(ready_future.running())
-      # Cancellation after maturity has no effect.
-      ready_future.cancel()
-      self.assertFalse(ready_future.cancelled())
-      self.assertTrue(ready_future.done())
-      self.assertFalse(ready_future.running())
-    finally:
-      ready_future.cancel()
-      server.stop(0)
+        try:
+            ready_future = utilities.channel_ready_future(channel)
+            ready_future.add_done_callback(callback.accept_value)
+            self.assertIsNone(
+                ready_future.result(timeout=test_constants.LONG_TIMEOUT))
+            value_passed_to_callback = callback.block_until_called()
+            self.assertIs(ready_future, value_passed_to_callback)
+            self.assertFalse(ready_future.cancelled())
+            self.assertTrue(ready_future.done())
+            self.assertFalse(ready_future.running())
+            # Cancellation after maturity has no effect.
+            ready_future.cancel()
+            self.assertFalse(ready_future.cancelled())
+            self.assertTrue(ready_future.done())
+            self.assertFalse(ready_future.running())
+        finally:
+            ready_future.cancel()
+            server.stop(0)
 
 
 if __name__ == '__main__':
-  unittest.main(verbosity=2)
+    unittest.main(verbosity=2)
diff --git a/src/python/grpcio_tests/tests/unit/beta/test_utilities.py b/src/python/grpcio_tests/tests/unit/beta/test_utilities.py
index 692da9c..f542420 100644
--- a/src/python/grpcio_tests/tests/unit/beta/test_utilities.py
+++ b/src/python/grpcio_tests/tests/unit/beta/test_utilities.py
@@ -26,16 +26,15 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Test-appropriate entry points into the gRPC Python Beta API."""
 
 import grpc
 from grpc.beta import implementations
 
 
-def not_really_secure_channel(
-    host, port, channel_credentials, server_host_override):
-  """Creates an insecure Channel to a remote host.
+def not_really_secure_channel(host, port, channel_credentials,
+                              server_host_override):
+    """Creates an insecure Channel to a remote host.
 
   Args:
     host: The name of the remote host to which to connect.
@@ -48,8 +47,8 @@
     An implementations.Channel to the remote host through which RPCs may be
       conducted.
   """
-  target = '%s:%d' % (host, port)
-  channel = grpc.secure_channel(
-      target, channel_credentials,
-      (('grpc.ssl_target_name_override', server_host_override,),))
-  return implementations.Channel(channel)
+    target = '%s:%d' % (host, port)
+    channel = grpc.secure_channel(target, channel_credentials, ((
+        'grpc.ssl_target_name_override',
+        server_host_override,),))
+    return implementations.Channel(channel)
diff --git a/src/python/grpcio_tests/tests/unit/framework/__init__.py b/src/python/grpcio_tests/tests/unit/framework/__init__.py
index 7086519..b893988 100644
--- a/src/python/grpcio_tests/tests/unit/framework/__init__.py
+++ b/src/python/grpcio_tests/tests/unit/framework/__init__.py
@@ -26,5 +26,3 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
diff --git a/src/python/grpcio_tests/tests/unit/framework/common/__init__.py b/src/python/grpcio_tests/tests/unit/framework/common/__init__.py
index 7086519..b893988 100644
--- a/src/python/grpcio_tests/tests/unit/framework/common/__init__.py
+++ b/src/python/grpcio_tests/tests/unit/framework/common/__init__.py
@@ -26,5 +26,3 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
diff --git a/src/python/grpcio_tests/tests/unit/framework/common/test_constants.py b/src/python/grpcio_tests/tests/unit/framework/common/test_constants.py
index b6682d3..905483c 100644
--- a/src/python/grpcio_tests/tests/unit/framework/common/test_constants.py
+++ b/src/python/grpcio_tests/tests/unit/framework/common/test_constants.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Constants shared among tests throughout RPC Framework."""
 
 # Value for maximum duration in seconds that a test is allowed for its actual
diff --git a/src/python/grpcio_tests/tests/unit/framework/common/test_control.py b/src/python/grpcio_tests/tests/unit/framework/common/test_control.py
index 088e2f8..af08731 100644
--- a/src/python/grpcio_tests/tests/unit/framework/common/test_control.py
+++ b/src/python/grpcio_tests/tests/unit/framework/common/test_control.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Code for instructing systems under test to block or fail."""
 
 import abc
@@ -37,7 +36,7 @@
 
 
 class Defect(Exception):
-  """Simulates a programming defect raised into in a system under test.
+    """Simulates a programming defect raised into in a system under test.
 
   Use of a standard exception type is too easily misconstrued as an actual
   defect in either the test infrastructure or the system under test.
@@ -45,7 +44,7 @@
 
 
 class Control(six.with_metaclass(abc.ABCMeta)):
-  """An object that accepts program control from a system under test.
+    """An object that accepts program control from a system under test.
 
   Systems under test passed a Control should call its control() method
   frequently during execution. The control() method may block, raise an
@@ -53,61 +52,61 @@
   the system under test to simulate hanging, failing, or functioning.
   """
 
-  @abc.abstractmethod
-  def control(self):
-    """Potentially does anything."""
-    raise NotImplementedError()
+    @abc.abstractmethod
+    def control(self):
+        """Potentially does anything."""
+        raise NotImplementedError()
 
 
 class PauseFailControl(Control):
-  """A Control that can be used to pause or fail code under control.
+    """A Control that can be used to pause or fail code under control.
 
   This object is only safe for use from two threads: one of the system under
   test calling control and the other from the test system calling pause,
   block_until_paused, and fail.
   """
 
-  def __init__(self):
-    self._condition = threading.Condition()
-    self._pause = False
-    self._paused = False
-    self._fail = False
+    def __init__(self):
+        self._condition = threading.Condition()
+        self._pause = False
+        self._paused = False
+        self._fail = False
 
-  def control(self):
-    with self._condition:
-      if self._fail:
-        raise Defect()
+    def control(self):
+        with self._condition:
+            if self._fail:
+                raise Defect()
 
-      while self._pause:
-        self._paused = True
-        self._condition.notify_all()
-        self._condition.wait()
-      self._paused = False
+            while self._pause:
+                self._paused = True
+                self._condition.notify_all()
+                self._condition.wait()
+            self._paused = False
 
-  @contextlib.contextmanager
-  def pause(self):
-    """Pauses code under control while controlling code is in context."""
-    with self._condition:
-      self._pause = True
-    yield
-    with self._condition:
-      self._pause = False
-      self._condition.notify_all()
+    @contextlib.contextmanager
+    def pause(self):
+        """Pauses code under control while controlling code is in context."""
+        with self._condition:
+            self._pause = True
+        yield
+        with self._condition:
+            self._pause = False
+            self._condition.notify_all()
 
-  def block_until_paused(self):
-    """Blocks controlling code until code under control is paused.
+    def block_until_paused(self):
+        """Blocks controlling code until code under control is paused.
 
     May only be called within the context of a pause call.
     """
-    with self._condition:
-      while not self._paused:
-        self._condition.wait()
+        with self._condition:
+            while not self._paused:
+                self._condition.wait()
 
-  @contextlib.contextmanager
-  def fail(self):
-    """Fails code under control while controlling code is in context."""
-    with self._condition:
-      self._fail = True
-    yield
-    with self._condition:
-      self._fail = False
+    @contextlib.contextmanager
+    def fail(self):
+        """Fails code under control while controlling code is in context."""
+        with self._condition:
+            self._fail = True
+        yield
+        with self._condition:
+            self._fail = False
diff --git a/src/python/grpcio_tests/tests/unit/framework/common/test_coverage.py b/src/python/grpcio_tests/tests/unit/framework/common/test_coverage.py
index ea2d281..13ceec3 100644
--- a/src/python/grpcio_tests/tests/unit/framework/common/test_coverage.py
+++ b/src/python/grpcio_tests/tests/unit/framework/common/test_coverage.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Governs coverage for tests of RPCs throughout RPC Framework."""
 
 import abc
@@ -38,80 +37,80 @@
 
 
 class Coverage(six.with_metaclass(abc.ABCMeta)):
-  """Specification of test coverage."""
+    """Specification of test coverage."""
 
-  @abc.abstractmethod
-  def testSuccessfulUnaryRequestUnaryResponse(self):
-    raise NotImplementedError()
+    @abc.abstractmethod
+    def testSuccessfulUnaryRequestUnaryResponse(self):
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def testSuccessfulUnaryRequestStreamResponse(self):
-    raise NotImplementedError()
+    @abc.abstractmethod
+    def testSuccessfulUnaryRequestStreamResponse(self):
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def testSuccessfulStreamRequestUnaryResponse(self):
-    raise NotImplementedError()
+    @abc.abstractmethod
+    def testSuccessfulStreamRequestUnaryResponse(self):
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def testSuccessfulStreamRequestStreamResponse(self):
-    raise NotImplementedError()
+    @abc.abstractmethod
+    def testSuccessfulStreamRequestStreamResponse(self):
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def testSequentialInvocations(self):
-    raise NotImplementedError()
+    @abc.abstractmethod
+    def testSequentialInvocations(self):
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def testParallelInvocations(self):
-    raise NotImplementedError()
+    @abc.abstractmethod
+    def testParallelInvocations(self):
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def testWaitingForSomeButNotAllParallelInvocations(self):
-    raise NotImplementedError()
+    @abc.abstractmethod
+    def testWaitingForSomeButNotAllParallelInvocations(self):
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def testCancelledUnaryRequestUnaryResponse(self):
-    raise NotImplementedError()
+    @abc.abstractmethod
+    def testCancelledUnaryRequestUnaryResponse(self):
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def testCancelledUnaryRequestStreamResponse(self):
-    raise NotImplementedError()
+    @abc.abstractmethod
+    def testCancelledUnaryRequestStreamResponse(self):
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def testCancelledStreamRequestUnaryResponse(self):
-    raise NotImplementedError()
+    @abc.abstractmethod
+    def testCancelledStreamRequestUnaryResponse(self):
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def testCancelledStreamRequestStreamResponse(self):
-    raise NotImplementedError()
+    @abc.abstractmethod
+    def testCancelledStreamRequestStreamResponse(self):
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def testExpiredUnaryRequestUnaryResponse(self):
-    raise NotImplementedError()
+    @abc.abstractmethod
+    def testExpiredUnaryRequestUnaryResponse(self):
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def testExpiredUnaryRequestStreamResponse(self):
-    raise NotImplementedError()
+    @abc.abstractmethod
+    def testExpiredUnaryRequestStreamResponse(self):
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def testExpiredStreamRequestUnaryResponse(self):
-    raise NotImplementedError()
+    @abc.abstractmethod
+    def testExpiredStreamRequestUnaryResponse(self):
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def testExpiredStreamRequestStreamResponse(self):
-    raise NotImplementedError()
+    @abc.abstractmethod
+    def testExpiredStreamRequestStreamResponse(self):
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def testFailedUnaryRequestUnaryResponse(self):
-    raise NotImplementedError()
+    @abc.abstractmethod
+    def testFailedUnaryRequestUnaryResponse(self):
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def testFailedUnaryRequestStreamResponse(self):
-    raise NotImplementedError()
+    @abc.abstractmethod
+    def testFailedUnaryRequestStreamResponse(self):
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def testFailedStreamRequestUnaryResponse(self):
-    raise NotImplementedError()
+    @abc.abstractmethod
+    def testFailedStreamRequestUnaryResponse(self):
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def testFailedStreamRequestStreamResponse(self):
-    raise NotImplementedError()
+    @abc.abstractmethod
+    def testFailedStreamRequestStreamResponse(self):
+        raise NotImplementedError()
diff --git a/src/python/grpcio_tests/tests/unit/framework/foundation/__init__.py b/src/python/grpcio_tests/tests/unit/framework/foundation/__init__.py
index 7086519..b893988 100644
--- a/src/python/grpcio_tests/tests/unit/framework/foundation/__init__.py
+++ b/src/python/grpcio_tests/tests/unit/framework/foundation/__init__.py
@@ -26,5 +26,3 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
diff --git a/src/python/grpcio_tests/tests/unit/framework/foundation/_logging_pool_test.py b/src/python/grpcio_tests/tests/unit/framework/foundation/_logging_pool_test.py
index 330e445..19e8cbd 100644
--- a/src/python/grpcio_tests/tests/unit/framework/foundation/_logging_pool_test.py
+++ b/src/python/grpcio_tests/tests/unit/framework/foundation/_logging_pool_test.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Tests for grpc.framework.foundation.logging_pool."""
 
 import threading
@@ -39,50 +38,51 @@
 
 class _CallableObject(object):
 
-  def __init__(self):
-    self._lock = threading.Lock()
-    self._passed_values = []
+    def __init__(self):
+        self._lock = threading.Lock()
+        self._passed_values = []
 
-  def __call__(self, value):
-    with self._lock:
-      self._passed_values.append(value)
+    def __call__(self, value):
+        with self._lock:
+            self._passed_values.append(value)
 
-  def passed_values(self):
-    with self._lock:
-      return tuple(self._passed_values)
+    def passed_values(self):
+        with self._lock:
+            return tuple(self._passed_values)
 
 
 class LoggingPoolTest(unittest.TestCase):
 
-  def testUpAndDown(self):
-    pool = logging_pool.pool(_POOL_SIZE)
-    pool.shutdown(wait=True)
+    def testUpAndDown(self):
+        pool = logging_pool.pool(_POOL_SIZE)
+        pool.shutdown(wait=True)
 
-    with logging_pool.pool(_POOL_SIZE) as pool:
-      self.assertIsNotNone(pool)
+        with logging_pool.pool(_POOL_SIZE) as pool:
+            self.assertIsNotNone(pool)
 
-  def testTaskExecuted(self):
-    test_list = []
+    def testTaskExecuted(self):
+        test_list = []
 
-    with logging_pool.pool(_POOL_SIZE) as pool:
-      pool.submit(lambda: test_list.append(object())).result()
+        with logging_pool.pool(_POOL_SIZE) as pool:
+            pool.submit(lambda: test_list.append(object())).result()
 
-    self.assertTrue(test_list)
+        self.assertTrue(test_list)
 
-  def testException(self):
-    with logging_pool.pool(_POOL_SIZE) as pool:
-      raised_exception = pool.submit(lambda: 1/0).exception()
+    def testException(self):
+        with logging_pool.pool(_POOL_SIZE) as pool:
+            raised_exception = pool.submit(lambda: 1 / 0).exception()
 
-    self.assertIsNotNone(raised_exception)
+        self.assertIsNotNone(raised_exception)
 
-  def testCallableObjectExecuted(self):
-    callable_object = _CallableObject()
-    passed_object = object()
-    with logging_pool.pool(_POOL_SIZE) as pool:
-      future = pool.submit(callable_object, passed_object)
-    self.assertIsNone(future.result())
-    self.assertSequenceEqual((passed_object,), callable_object.passed_values())
+    def testCallableObjectExecuted(self):
+        callable_object = _CallableObject()
+        passed_object = object()
+        with logging_pool.pool(_POOL_SIZE) as pool:
+            future = pool.submit(callable_object, passed_object)
+        self.assertIsNone(future.result())
+        self.assertSequenceEqual((passed_object,),
+                                 callable_object.passed_values())
 
 
 if __name__ == '__main__':
-  unittest.main(verbosity=2)
+    unittest.main(verbosity=2)
diff --git a/src/python/grpcio_tests/tests/unit/framework/foundation/stream_testing.py b/src/python/grpcio_tests/tests/unit/framework/foundation/stream_testing.py
index 098a53d..2929e4d 100644
--- a/src/python/grpcio_tests/tests/unit/framework/foundation/stream_testing.py
+++ b/src/python/grpcio_tests/tests/unit/framework/foundation/stream_testing.py
@@ -26,48 +26,47 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Utilities for testing stream-related code."""
 
 from grpc.framework.foundation import stream
 
 
 class TestConsumer(stream.Consumer):
-  """A stream.Consumer instrumented for testing.
+    """A stream.Consumer instrumented for testing.
 
   Attributes:
     calls: A sequence of value-termination pairs describing the history of calls
       made on this object.
   """
 
-  def __init__(self):
-    self.calls = []
+    def __init__(self):
+        self.calls = []
 
-  def consume(self, value):
-    """See stream.Consumer.consume for specification."""
-    self.calls.append((value, False))
+    def consume(self, value):
+        """See stream.Consumer.consume for specification."""
+        self.calls.append((value, False))
 
-  def terminate(self):
-    """See stream.Consumer.terminate for specification."""
-    self.calls.append((None, True))
+    def terminate(self):
+        """See stream.Consumer.terminate for specification."""
+        self.calls.append((None, True))
 
-  def consume_and_terminate(self, value):
-    """See stream.Consumer.consume_and_terminate for specification."""
-    self.calls.append((value, True))
+    def consume_and_terminate(self, value):
+        """See stream.Consumer.consume_and_terminate for specification."""
+        self.calls.append((value, True))
 
-  def is_legal(self):
-    """Reports whether or not a legal sequence of calls has been made."""
-    terminated = False
-    for value, terminal in self.calls:
-      if terminated:
-        return False
-      elif terminal:
-        terminated = True
-      elif value is None:
-        return False
-    else:  # pylint: disable=useless-else-on-loop
-      return True
+    def is_legal(self):
+        """Reports whether or not a legal sequence of calls has been made."""
+        terminated = False
+        for value, terminal in self.calls:
+            if terminated:
+                return False
+            elif terminal:
+                terminated = True
+            elif value is None:
+                return False
+        else:  # pylint: disable=useless-else-on-loop
+            return True
 
-  def values(self):
-    """Returns the sequence of values that have been passed to this Consumer."""
-    return [value for value, _ in self.calls if value]
+    def values(self):
+        """Returns the sequence of values that have been passed to this Consumer."""
+        return [value for value, _ in self.calls if value]
diff --git a/src/python/grpcio_tests/tests/unit/framework/interfaces/__init__.py b/src/python/grpcio_tests/tests/unit/framework/interfaces/__init__.py
index 7086519..b893988 100644
--- a/src/python/grpcio_tests/tests/unit/framework/interfaces/__init__.py
+++ b/src/python/grpcio_tests/tests/unit/framework/interfaces/__init__.py
@@ -26,5 +26,3 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
diff --git a/src/python/grpcio_tests/tests/unit/framework/interfaces/face/_3069_test_constant.py b/src/python/grpcio_tests/tests/unit/framework/interfaces/face/_3069_test_constant.py
index 1ea356c..2aec25c 100644
--- a/src/python/grpcio_tests/tests/unit/framework/interfaces/face/_3069_test_constant.py
+++ b/src/python/grpcio_tests/tests/unit/framework/interfaces/face/_3069_test_constant.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """A test constant working around issue 3069."""
 
 # test_constants is referenced from specification in this module.
diff --git a/src/python/grpcio_tests/tests/unit/framework/interfaces/face/__init__.py b/src/python/grpcio_tests/tests/unit/framework/interfaces/face/__init__.py
index 7086519..b893988 100644
--- a/src/python/grpcio_tests/tests/unit/framework/interfaces/face/__init__.py
+++ b/src/python/grpcio_tests/tests/unit/framework/interfaces/face/__init__.py
@@ -26,5 +26,3 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
diff --git a/src/python/grpcio_tests/tests/unit/framework/interfaces/face/_blocking_invocation_inline_service.py b/src/python/grpcio_tests/tests/unit/framework/interfaces/face/_blocking_invocation_inline_service.py
index e338aaa..a79834f 100644
--- a/src/python/grpcio_tests/tests/unit/framework/interfaces/face/_blocking_invocation_inline_service.py
+++ b/src/python/grpcio_tests/tests/unit/framework/interfaces/face/_blocking_invocation_inline_service.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Test code for the Face layer of RPC Framework."""
 
 from __future__ import division
@@ -50,246 +49,254 @@
 from tests.unit.framework.interfaces.face import test_interfaces  # pylint: disable=unused-import
 
 
-class TestCase(six.with_metaclass(abc.ABCMeta, test_coverage.Coverage, unittest.TestCase)):
-  """A test of the Face layer of RPC Framework.
+class TestCase(
+        six.with_metaclass(abc.ABCMeta, test_coverage.Coverage,
+                           unittest.TestCase)):
+    """A test of the Face layer of RPC Framework.
 
   Concrete subclasses must have an "implementation" attribute of type
   test_interfaces.Implementation and an "invoker_constructor" attribute of type
   _invocation.InvokerConstructor.
   """
 
-  NAME = 'BlockingInvocationInlineServiceTest'
+    NAME = 'BlockingInvocationInlineServiceTest'
 
-  def setUp(self):
-    """See unittest.TestCase.setUp for full specification.
+    def setUp(self):
+        """See unittest.TestCase.setUp for full specification.
 
     Overriding implementations must call this implementation.
     """
-    self._control = test_control.PauseFailControl()
-    self._digest = _digest.digest(
-        _stock_service.STOCK_TEST_SERVICE, self._control, None)
+        self._control = test_control.PauseFailControl()
+        self._digest = _digest.digest(_stock_service.STOCK_TEST_SERVICE,
+                                      self._control, None)
 
-    generic_stub, dynamic_stubs, self._memo = self.implementation.instantiate(
-        self._digest.methods, self._digest.inline_method_implementations, None)
-    self._invoker = self.invoker_constructor.construct_invoker(
-        generic_stub, dynamic_stubs, self._digest.methods)
+        generic_stub, dynamic_stubs, self._memo = self.implementation.instantiate(
+            self._digest.methods, self._digest.inline_method_implementations,
+            None)
+        self._invoker = self.invoker_constructor.construct_invoker(
+            generic_stub, dynamic_stubs, self._digest.methods)
 
-  def tearDown(self):
-    """See unittest.TestCase.tearDown for full specification.
+    def tearDown(self):
+        """See unittest.TestCase.tearDown for full specification.
 
     Overriding implementations must call this implementation.
     """
-    self._invoker = None
-    self.implementation.destantiate(self._memo)
+        self._invoker = None
+        self.implementation.destantiate(self._memo)
 
-  def testSuccessfulUnaryRequestUnaryResponse(self):
-    for (group, method), test_messages_sequence in (
-        six.iteritems(self._digest.unary_unary_messages_sequences)):
-      for test_messages in test_messages_sequence:
-        request = test_messages.request()
+    def testSuccessfulUnaryRequestUnaryResponse(self):
+        for (group, method), test_messages_sequence in (
+                six.iteritems(self._digest.unary_unary_messages_sequences)):
+            for test_messages in test_messages_sequence:
+                request = test_messages.request()
 
-        response, call = self._invoker.blocking(group, method)(
-            request, test_constants.LONG_TIMEOUT, with_call=True)
+                response, call = self._invoker.blocking(group, method)(
+                    request, test_constants.LONG_TIMEOUT, with_call=True)
 
-        test_messages.verify(request, response, self)
+                test_messages.verify(request, response, self)
 
-  def testSuccessfulUnaryRequestStreamResponse(self):
-    for (group, method), test_messages_sequence in (
-        six.iteritems(self._digest.unary_stream_messages_sequences)):
-      for test_messages in test_messages_sequence:
-        request = test_messages.request()
+    def testSuccessfulUnaryRequestStreamResponse(self):
+        for (group, method), test_messages_sequence in (
+                six.iteritems(self._digest.unary_stream_messages_sequences)):
+            for test_messages in test_messages_sequence:
+                request = test_messages.request()
 
-        response_iterator = self._invoker.blocking(group, method)(
-            request, test_constants.LONG_TIMEOUT)
-        responses = list(response_iterator)
+                response_iterator = self._invoker.blocking(group, method)(
+                    request, test_constants.LONG_TIMEOUT)
+                responses = list(response_iterator)
 
-        test_messages.verify(request, responses, self)
+                test_messages.verify(request, responses, self)
 
-  def testSuccessfulStreamRequestUnaryResponse(self):
-    for (group, method), test_messages_sequence in (
-        six.iteritems(self._digest.stream_unary_messages_sequences)):
-      for test_messages in test_messages_sequence:
-        requests = test_messages.requests()
+    def testSuccessfulStreamRequestUnaryResponse(self):
+        for (group, method), test_messages_sequence in (
+                six.iteritems(self._digest.stream_unary_messages_sequences)):
+            for test_messages in test_messages_sequence:
+                requests = test_messages.requests()
 
-        response, call = self._invoker.blocking(group, method)(
-            iter(requests), test_constants.LONG_TIMEOUT, with_call=True)
+                response, call = self._invoker.blocking(group, method)(
+                    iter(requests), test_constants.LONG_TIMEOUT, with_call=True)
 
-        test_messages.verify(requests, response, self)
+                test_messages.verify(requests, response, self)
 
-  def testSuccessfulStreamRequestStreamResponse(self):
-    for (group, method), test_messages_sequence in (
-        six.iteritems(self._digest.stream_stream_messages_sequences)):
-      for test_messages in test_messages_sequence:
-        requests = test_messages.requests()
+    def testSuccessfulStreamRequestStreamResponse(self):
+        for (group, method), test_messages_sequence in (
+                six.iteritems(self._digest.stream_stream_messages_sequences)):
+            for test_messages in test_messages_sequence:
+                requests = test_messages.requests()
 
-        response_iterator = self._invoker.blocking(group, method)(
-            iter(requests), test_constants.LONG_TIMEOUT)
-        responses = list(response_iterator)
+                response_iterator = self._invoker.blocking(group, method)(
+                    iter(requests), test_constants.LONG_TIMEOUT)
+                responses = list(response_iterator)
 
-        test_messages.verify(requests, responses, self)
+                test_messages.verify(requests, responses, self)
 
-  def testSequentialInvocations(self):
-    for (group, method), test_messages_sequence in (
-        six.iteritems(self._digest.unary_unary_messages_sequences)):
-      for test_messages in test_messages_sequence:
-        first_request = test_messages.request()
-        second_request = test_messages.request()
+    def testSequentialInvocations(self):
+        for (group, method), test_messages_sequence in (
+                six.iteritems(self._digest.unary_unary_messages_sequences)):
+            for test_messages in test_messages_sequence:
+                first_request = test_messages.request()
+                second_request = test_messages.request()
 
-        first_response = self._invoker.blocking(group, method)(
-            first_request, test_constants.LONG_TIMEOUT)
+                first_response = self._invoker.blocking(group, method)(
+                    first_request, test_constants.LONG_TIMEOUT)
 
-        test_messages.verify(first_request, first_response, self)
+                test_messages.verify(first_request, first_response, self)
 
-        second_response = self._invoker.blocking(group, method)(
-            second_request, test_constants.LONG_TIMEOUT)
+                second_response = self._invoker.blocking(group, method)(
+                    second_request, test_constants.LONG_TIMEOUT)
 
-        test_messages.verify(second_request, second_response, self)
+                test_messages.verify(second_request, second_response, self)
 
-  def testParallelInvocations(self):
-    pool = logging_pool.pool(test_constants.THREAD_CONCURRENCY)
-    for (group, method), test_messages_sequence in (
-        six.iteritems(self._digest.unary_unary_messages_sequences)):
-      for test_messages in test_messages_sequence:
-        requests = []
-        response_futures = []
-        for _ in range(test_constants.THREAD_CONCURRENCY):
-          request = test_messages.request()
-          response_future = pool.submit(
-              self._invoker.blocking(group, method), request,
-              test_constants.LONG_TIMEOUT)
-          requests.append(request)
-          response_futures.append(response_future)
+    def testParallelInvocations(self):
+        pool = logging_pool.pool(test_constants.THREAD_CONCURRENCY)
+        for (group, method), test_messages_sequence in (
+                six.iteritems(self._digest.unary_unary_messages_sequences)):
+            for test_messages in test_messages_sequence:
+                requests = []
+                response_futures = []
+                for _ in range(test_constants.THREAD_CONCURRENCY):
+                    request = test_messages.request()
+                    response_future = pool.submit(
+                        self._invoker.blocking(group, method), request,
+                        test_constants.LONG_TIMEOUT)
+                    requests.append(request)
+                    response_futures.append(response_future)
 
-        responses = [
-            response_future.result() for response_future in response_futures]
+                responses = [
+                    response_future.result()
+                    for response_future in response_futures
+                ]
 
-        for request, response in zip(requests, responses):
-          test_messages.verify(request, response, self)
-    pool.shutdown(wait=True)
+                for request, response in zip(requests, responses):
+                    test_messages.verify(request, response, self)
+        pool.shutdown(wait=True)
 
-  def testWaitingForSomeButNotAllParallelInvocations(self):
-    pool = logging_pool.pool(test_constants.THREAD_CONCURRENCY)
-    for (group, method), test_messages_sequence in (
-        six.iteritems(self._digest.unary_unary_messages_sequences)):
-      for test_messages in test_messages_sequence:
-        requests = []
-        response_futures_to_indices = {}
-        for index in range(test_constants.THREAD_CONCURRENCY):
-          request = test_messages.request()
-          response_future = pool.submit(
-              self._invoker.blocking(group, method), request,
-              test_constants.LONG_TIMEOUT)
-          requests.append(request)
-          response_futures_to_indices[response_future] = index
+    def testWaitingForSomeButNotAllParallelInvocations(self):
+        pool = logging_pool.pool(test_constants.THREAD_CONCURRENCY)
+        for (group, method), test_messages_sequence in (
+                six.iteritems(self._digest.unary_unary_messages_sequences)):
+            for test_messages in test_messages_sequence:
+                requests = []
+                response_futures_to_indices = {}
+                for index in range(test_constants.THREAD_CONCURRENCY):
+                    request = test_messages.request()
+                    response_future = pool.submit(
+                        self._invoker.blocking(group, method), request,
+                        test_constants.LONG_TIMEOUT)
+                    requests.append(request)
+                    response_futures_to_indices[response_future] = index
 
-        some_completed_response_futures_iterator = itertools.islice(
-            futures.as_completed(response_futures_to_indices),
-            test_constants.THREAD_CONCURRENCY // 2)
-        for response_future in some_completed_response_futures_iterator:
-          index = response_futures_to_indices[response_future]
-          test_messages.verify(requests[index], response_future.result(), self)
-    pool.shutdown(wait=True)
+                some_completed_response_futures_iterator = itertools.islice(
+                    futures.as_completed(response_futures_to_indices),
+                    test_constants.THREAD_CONCURRENCY // 2)
+                for response_future in some_completed_response_futures_iterator:
+                    index = response_futures_to_indices[response_future]
+                    test_messages.verify(requests[index],
+                                         response_future.result(), self)
+        pool.shutdown(wait=True)
 
-  @unittest.skip('Cancellation impossible with blocking control flow!')
-  def testCancelledUnaryRequestUnaryResponse(self):
-    raise NotImplementedError()
+    @unittest.skip('Cancellation impossible with blocking control flow!')
+    def testCancelledUnaryRequestUnaryResponse(self):
+        raise NotImplementedError()
 
-  @unittest.skip('Cancellation impossible with blocking control flow!')
-  def testCancelledUnaryRequestStreamResponse(self):
-    raise NotImplementedError()
+    @unittest.skip('Cancellation impossible with blocking control flow!')
+    def testCancelledUnaryRequestStreamResponse(self):
+        raise NotImplementedError()
 
-  @unittest.skip('Cancellation impossible with blocking control flow!')
-  def testCancelledStreamRequestUnaryResponse(self):
-    raise NotImplementedError()
+    @unittest.skip('Cancellation impossible with blocking control flow!')
+    def testCancelledStreamRequestUnaryResponse(self):
+        raise NotImplementedError()
 
-  @unittest.skip('Cancellation impossible with blocking control flow!')
-  def testCancelledStreamRequestStreamResponse(self):
-    raise NotImplementedError()
+    @unittest.skip('Cancellation impossible with blocking control flow!')
+    def testCancelledStreamRequestStreamResponse(self):
+        raise NotImplementedError()
 
-  def testExpiredUnaryRequestUnaryResponse(self):
-    for (group, method), test_messages_sequence in (
-        six.iteritems(self._digest.unary_unary_messages_sequences)):
-      for test_messages in test_messages_sequence:
-        request = test_messages.request()
+    def testExpiredUnaryRequestUnaryResponse(self):
+        for (group, method), test_messages_sequence in (
+                six.iteritems(self._digest.unary_unary_messages_sequences)):
+            for test_messages in test_messages_sequence:
+                request = test_messages.request()
 
-        with self._control.pause(), self.assertRaises(
-            face.ExpirationError):
-          self._invoker.blocking(group, method)(
-              request, _3069_test_constant.REALLY_SHORT_TIMEOUT)
+                with self._control.pause(), self.assertRaises(
+                        face.ExpirationError):
+                    self._invoker.blocking(group, method)(
+                        request, _3069_test_constant.REALLY_SHORT_TIMEOUT)
 
-  def testExpiredUnaryRequestStreamResponse(self):
-    for (group, method), test_messages_sequence in (
-        six.iteritems(self._digest.unary_stream_messages_sequences)):
-      for test_messages in test_messages_sequence:
-        request = test_messages.request()
+    def testExpiredUnaryRequestStreamResponse(self):
+        for (group, method), test_messages_sequence in (
+                six.iteritems(self._digest.unary_stream_messages_sequences)):
+            for test_messages in test_messages_sequence:
+                request = test_messages.request()
 
-        with self._control.pause(), self.assertRaises(
-            face.ExpirationError):
-          response_iterator = self._invoker.blocking(group, method)(
-              request, _3069_test_constant.REALLY_SHORT_TIMEOUT)
-          list(response_iterator)
+                with self._control.pause(), self.assertRaises(
+                        face.ExpirationError):
+                    response_iterator = self._invoker.blocking(group, method)(
+                        request, _3069_test_constant.REALLY_SHORT_TIMEOUT)
+                    list(response_iterator)
 
-  def testExpiredStreamRequestUnaryResponse(self):
-    for (group, method), test_messages_sequence in (
-        six.iteritems(self._digest.stream_unary_messages_sequences)):
-      for test_messages in test_messages_sequence:
-        requests = test_messages.requests()
+    def testExpiredStreamRequestUnaryResponse(self):
+        for (group, method), test_messages_sequence in (
+                six.iteritems(self._digest.stream_unary_messages_sequences)):
+            for test_messages in test_messages_sequence:
+                requests = test_messages.requests()
 
-        with self._control.pause(), self.assertRaises(
-            face.ExpirationError):
-          self._invoker.blocking(group, method)(
-              iter(requests), _3069_test_constant.REALLY_SHORT_TIMEOUT)
+                with self._control.pause(), self.assertRaises(
+                        face.ExpirationError):
+                    self._invoker.blocking(group, method)(
+                        iter(requests),
+                        _3069_test_constant.REALLY_SHORT_TIMEOUT)
 
-  def testExpiredStreamRequestStreamResponse(self):
-    for (group, method), test_messages_sequence in (
-        six.iteritems(self._digest.stream_stream_messages_sequences)):
-      for test_messages in test_messages_sequence:
-        requests = test_messages.requests()
+    def testExpiredStreamRequestStreamResponse(self):
+        for (group, method), test_messages_sequence in (
+                six.iteritems(self._digest.stream_stream_messages_sequences)):
+            for test_messages in test_messages_sequence:
+                requests = test_messages.requests()
 
-        with self._control.pause(), self.assertRaises(
-            face.ExpirationError):
-          response_iterator = self._invoker.blocking(group, method)(
-              iter(requests), _3069_test_constant.REALLY_SHORT_TIMEOUT)
-          list(response_iterator)
+                with self._control.pause(), self.assertRaises(
+                        face.ExpirationError):
+                    response_iterator = self._invoker.blocking(group, method)(
+                        iter(requests),
+                        _3069_test_constant.REALLY_SHORT_TIMEOUT)
+                    list(response_iterator)
 
-  def testFailedUnaryRequestUnaryResponse(self):
-    for (group, method), test_messages_sequence in (
-        six.iteritems(self._digest.unary_unary_messages_sequences)):
-      for test_messages in test_messages_sequence:
-        request = test_messages.request()
+    def testFailedUnaryRequestUnaryResponse(self):
+        for (group, method), test_messages_sequence in (
+                six.iteritems(self._digest.unary_unary_messages_sequences)):
+            for test_messages in test_messages_sequence:
+                request = test_messages.request()
 
-        with self._control.fail(), self.assertRaises(face.RemoteError):
-          self._invoker.blocking(group, method)(
-              request, test_constants.LONG_TIMEOUT)
+                with self._control.fail(), self.assertRaises(face.RemoteError):
+                    self._invoker.blocking(group, method)(
+                        request, test_constants.LONG_TIMEOUT)
 
-  def testFailedUnaryRequestStreamResponse(self):
-    for (group, method), test_messages_sequence in (
-        six.iteritems(self._digest.unary_stream_messages_sequences)):
-      for test_messages in test_messages_sequence:
-        request = test_messages.request()
+    def testFailedUnaryRequestStreamResponse(self):
+        for (group, method), test_messages_sequence in (
+                six.iteritems(self._digest.unary_stream_messages_sequences)):
+            for test_messages in test_messages_sequence:
+                request = test_messages.request()
 
-        with self._control.fail(), self.assertRaises(face.RemoteError):
-          response_iterator = self._invoker.blocking(group, method)(
-              request, test_constants.LONG_TIMEOUT)
-          list(response_iterator)
+                with self._control.fail(), self.assertRaises(face.RemoteError):
+                    response_iterator = self._invoker.blocking(group, method)(
+                        request, test_constants.LONG_TIMEOUT)
+                    list(response_iterator)
 
-  def testFailedStreamRequestUnaryResponse(self):
-    for (group, method), test_messages_sequence in (
-        six.iteritems(self._digest.stream_unary_messages_sequences)):
-      for test_messages in test_messages_sequence:
-        requests = test_messages.requests()
+    def testFailedStreamRequestUnaryResponse(self):
+        for (group, method), test_messages_sequence in (
+                six.iteritems(self._digest.stream_unary_messages_sequences)):
+            for test_messages in test_messages_sequence:
+                requests = test_messages.requests()
 
-        with self._control.fail(), self.assertRaises(face.RemoteError):
-          self._invoker.blocking(group, method)(
-              iter(requests), test_constants.LONG_TIMEOUT)
+                with self._control.fail(), self.assertRaises(face.RemoteError):
+                    self._invoker.blocking(group, method)(
+                        iter(requests), test_constants.LONG_TIMEOUT)
 
-  def testFailedStreamRequestStreamResponse(self):
-    for (group, method), test_messages_sequence in (
-        six.iteritems(self._digest.stream_stream_messages_sequences)):
-      for test_messages in test_messages_sequence:
-        requests = test_messages.requests()
+    def testFailedStreamRequestStreamResponse(self):
+        for (group, method), test_messages_sequence in (
+                six.iteritems(self._digest.stream_stream_messages_sequences)):
+            for test_messages in test_messages_sequence:
+                requests = test_messages.requests()
 
-        with self._control.fail(), self.assertRaises(face.RemoteError):
-          response_iterator = self._invoker.blocking(group, method)(
-              iter(requests), test_constants.LONG_TIMEOUT)
-          list(response_iterator)
+                with self._control.fail(), self.assertRaises(face.RemoteError):
+                    response_iterator = self._invoker.blocking(group, method)(
+                        iter(requests), test_constants.LONG_TIMEOUT)
+                    list(response_iterator)
diff --git a/src/python/grpcio_tests/tests/unit/framework/interfaces/face/_digest.py b/src/python/grpcio_tests/tests/unit/framework/interfaces/face/_digest.py
index f0befb0..0411da0 100644
--- a/src/python/grpcio_tests/tests/unit/framework/interfaces/face/_digest.py
+++ b/src/python/grpcio_tests/tests/unit/framework/interfaces/face/_digest.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Code for making a service.TestService more amenable to use in tests."""
 
 import collections
@@ -49,17 +48,16 @@
 
 
 class TestServiceDigest(
-    collections.namedtuple(
-        'TestServiceDigest',
-        ('methods',
-         'inline_method_implementations',
-         'event_method_implementations',
-         'multi_method_implementation',
-         'unary_unary_messages_sequences',
-         'unary_stream_messages_sequences',
-         'stream_unary_messages_sequences',
-         'stream_stream_messages_sequences',))):
-  """A transformation of a service.TestService.
+        collections.namedtuple('TestServiceDigest', (
+            'methods',
+            'inline_method_implementations',
+            'event_method_implementations',
+            'multi_method_implementation',
+            'unary_unary_messages_sequences',
+            'unary_stream_messages_sequences',
+            'stream_unary_messages_sequences',
+            'stream_stream_messages_sequences',))):
+    """A transformation of a service.TestService.
 
   Attributes:
     methods: A dict from method group-name pair to test_interfaces.Method object
@@ -88,303 +86,308 @@
 
 
 class _BufferingConsumer(stream.Consumer):
-  """A trivial Consumer that dumps what it consumes in a user-mutable buffer."""
+    """A trivial Consumer that dumps what it consumes in a user-mutable buffer."""
 
-  def __init__(self):
-    self.consumed = []
-    self.terminated = False
+    def __init__(self):
+        self.consumed = []
+        self.terminated = False
 
-  def consume(self, value):
-    self.consumed.append(value)
+    def consume(self, value):
+        self.consumed.append(value)
 
-  def terminate(self):
-    self.terminated = True
+    def terminate(self):
+        self.terminated = True
 
-  def consume_and_terminate(self, value):
-    self.consumed.append(value)
-    self.terminated = True
+    def consume_and_terminate(self, value):
+        self.consumed.append(value)
+        self.terminated = True
 
 
 class _InlineUnaryUnaryMethod(face.MethodImplementation):
 
-  def __init__(self, unary_unary_test_method, control):
-    self._test_method = unary_unary_test_method
-    self._control = control
+    def __init__(self, unary_unary_test_method, control):
+        self._test_method = unary_unary_test_method
+        self._control = control
 
-    self.cardinality = cardinality.Cardinality.UNARY_UNARY
-    self.style = style.Service.INLINE
+        self.cardinality = cardinality.Cardinality.UNARY_UNARY
+        self.style = style.Service.INLINE
 
-  def unary_unary_inline(self, request, context):
-    response_list = []
-    self._test_method.service(
-        request, response_list.append, context, self._control)
-    return response_list.pop(0)
+    def unary_unary_inline(self, request, context):
+        response_list = []
+        self._test_method.service(request, response_list.append, context,
+                                  self._control)
+        return response_list.pop(0)
 
 
 class _EventUnaryUnaryMethod(face.MethodImplementation):
 
-  def __init__(self, unary_unary_test_method, control, pool):
-    self._test_method = unary_unary_test_method
-    self._control = control
-    self._pool = pool
+    def __init__(self, unary_unary_test_method, control, pool):
+        self._test_method = unary_unary_test_method
+        self._control = control
+        self._pool = pool
 
-    self.cardinality = cardinality.Cardinality.UNARY_UNARY
-    self.style = style.Service.EVENT
+        self.cardinality = cardinality.Cardinality.UNARY_UNARY
+        self.style = style.Service.EVENT
 
-  def unary_unary_event(self, request, response_callback, context):
-    if self._pool is None:
-      self._test_method.service(
-          request, response_callback, context, self._control)
-    else:
-      self._pool.submit(
-          self._test_method.service, request, response_callback, context,
-          self._control)
+    def unary_unary_event(self, request, response_callback, context):
+        if self._pool is None:
+            self._test_method.service(request, response_callback, context,
+                                      self._control)
+        else:
+            self._pool.submit(self._test_method.service, request,
+                              response_callback, context, self._control)
 
 
 class _InlineUnaryStreamMethod(face.MethodImplementation):
 
-  def __init__(self, unary_stream_test_method, control):
-    self._test_method = unary_stream_test_method
-    self._control = control
+    def __init__(self, unary_stream_test_method, control):
+        self._test_method = unary_stream_test_method
+        self._control = control
 
-    self.cardinality = cardinality.Cardinality.UNARY_STREAM
-    self.style = style.Service.INLINE
+        self.cardinality = cardinality.Cardinality.UNARY_STREAM
+        self.style = style.Service.INLINE
 
-  def unary_stream_inline(self, request, context):
-    response_consumer = _BufferingConsumer()
-    self._test_method.service(
-        request, response_consumer, context, self._control)
-    for response in response_consumer.consumed:
-      yield response
+    def unary_stream_inline(self, request, context):
+        response_consumer = _BufferingConsumer()
+        self._test_method.service(request, response_consumer, context,
+                                  self._control)
+        for response in response_consumer.consumed:
+            yield response
 
 
 class _EventUnaryStreamMethod(face.MethodImplementation):
 
-  def __init__(self, unary_stream_test_method, control, pool):
-    self._test_method = unary_stream_test_method
-    self._control = control
-    self._pool = pool
+    def __init__(self, unary_stream_test_method, control, pool):
+        self._test_method = unary_stream_test_method
+        self._control = control
+        self._pool = pool
 
-    self.cardinality = cardinality.Cardinality.UNARY_STREAM
-    self.style = style.Service.EVENT
+        self.cardinality = cardinality.Cardinality.UNARY_STREAM
+        self.style = style.Service.EVENT
 
-  def unary_stream_event(self, request, response_consumer, context):
-    if self._pool is None:
-      self._test_method.service(
-          request, response_consumer, context, self._control)
-    else:
-      self._pool.submit(
-          self._test_method.service, request, response_consumer, context,
-          self._control)
+    def unary_stream_event(self, request, response_consumer, context):
+        if self._pool is None:
+            self._test_method.service(request, response_consumer, context,
+                                      self._control)
+        else:
+            self._pool.submit(self._test_method.service, request,
+                              response_consumer, context, self._control)
 
 
 class _InlineStreamUnaryMethod(face.MethodImplementation):
 
-  def __init__(self, stream_unary_test_method, control):
-    self._test_method = stream_unary_test_method
-    self._control = control
+    def __init__(self, stream_unary_test_method, control):
+        self._test_method = stream_unary_test_method
+        self._control = control
 
-    self.cardinality = cardinality.Cardinality.STREAM_UNARY
-    self.style = style.Service.INLINE
+        self.cardinality = cardinality.Cardinality.STREAM_UNARY
+        self.style = style.Service.INLINE
 
-  def stream_unary_inline(self, request_iterator, context):
-    response_list = []
-    request_consumer = self._test_method.service(
-        response_list.append, context, self._control)
-    for request in request_iterator:
-      request_consumer.consume(request)
-    request_consumer.terminate()
-    return response_list.pop(0)
+    def stream_unary_inline(self, request_iterator, context):
+        response_list = []
+        request_consumer = self._test_method.service(response_list.append,
+                                                     context, self._control)
+        for request in request_iterator:
+            request_consumer.consume(request)
+        request_consumer.terminate()
+        return response_list.pop(0)
 
 
 class _EventStreamUnaryMethod(face.MethodImplementation):
 
-  def __init__(self, stream_unary_test_method, control, pool):
-    self._test_method = stream_unary_test_method
-    self._control = control
-    self._pool = pool
+    def __init__(self, stream_unary_test_method, control, pool):
+        self._test_method = stream_unary_test_method
+        self._control = control
+        self._pool = pool
 
-    self.cardinality = cardinality.Cardinality.STREAM_UNARY
-    self.style = style.Service.EVENT
+        self.cardinality = cardinality.Cardinality.STREAM_UNARY
+        self.style = style.Service.EVENT
 
-  def stream_unary_event(self, response_callback, context):
-    request_consumer = self._test_method.service(
-        response_callback, context, self._control)
-    if self._pool is None:
-      return request_consumer
-    else:
-      return stream_util.ThreadSwitchingConsumer(request_consumer, self._pool)
+    def stream_unary_event(self, response_callback, context):
+        request_consumer = self._test_method.service(response_callback, context,
+                                                     self._control)
+        if self._pool is None:
+            return request_consumer
+        else:
+            return stream_util.ThreadSwitchingConsumer(request_consumer,
+                                                       self._pool)
 
 
 class _InlineStreamStreamMethod(face.MethodImplementation):
 
-  def __init__(self, stream_stream_test_method, control):
-    self._test_method = stream_stream_test_method
-    self._control = control
+    def __init__(self, stream_stream_test_method, control):
+        self._test_method = stream_stream_test_method
+        self._control = control
 
-    self.cardinality = cardinality.Cardinality.STREAM_STREAM
-    self.style = style.Service.INLINE
+        self.cardinality = cardinality.Cardinality.STREAM_STREAM
+        self.style = style.Service.INLINE
 
-  def stream_stream_inline(self, request_iterator, context):
-    response_consumer = _BufferingConsumer()
-    request_consumer = self._test_method.service(
-        response_consumer, context, self._control)
+    def stream_stream_inline(self, request_iterator, context):
+        response_consumer = _BufferingConsumer()
+        request_consumer = self._test_method.service(response_consumer, context,
+                                                     self._control)
 
-    for request in request_iterator:
-      request_consumer.consume(request)
-      while response_consumer.consumed:
-        yield response_consumer.consumed.pop(0)
-    response_consumer.terminate()
+        for request in request_iterator:
+            request_consumer.consume(request)
+            while response_consumer.consumed:
+                yield response_consumer.consumed.pop(0)
+        response_consumer.terminate()
 
 
 class _EventStreamStreamMethod(face.MethodImplementation):
 
-  def __init__(self, stream_stream_test_method, control, pool):
-    self._test_method = stream_stream_test_method
-    self._control = control
-    self._pool = pool
+    def __init__(self, stream_stream_test_method, control, pool):
+        self._test_method = stream_stream_test_method
+        self._control = control
+        self._pool = pool
 
-    self.cardinality = cardinality.Cardinality.STREAM_STREAM
-    self.style = style.Service.EVENT
+        self.cardinality = cardinality.Cardinality.STREAM_STREAM
+        self.style = style.Service.EVENT
 
-  def stream_stream_event(self, response_consumer, context):
-    request_consumer = self._test_method.service(
-        response_consumer, context, self._control)
-    if self._pool is None:
-      return request_consumer
-    else:
-      return stream_util.ThreadSwitchingConsumer(request_consumer, self._pool)
+    def stream_stream_event(self, response_consumer, context):
+        request_consumer = self._test_method.service(response_consumer, context,
+                                                     self._control)
+        if self._pool is None:
+            return request_consumer
+        else:
+            return stream_util.ThreadSwitchingConsumer(request_consumer,
+                                                       self._pool)
 
 
 class _UnaryConsumer(stream.Consumer):
-  """A Consumer that only allows consumption of exactly one value."""
+    """A Consumer that only allows consumption of exactly one value."""
 
-  def __init__(self, action):
-    self._lock = threading.Lock()
-    self._action = action
-    self._consumed = False
-    self._terminated = False
+    def __init__(self, action):
+        self._lock = threading.Lock()
+        self._action = action
+        self._consumed = False
+        self._terminated = False
 
-  def consume(self, value):
-    with self._lock:
-      if self._consumed:
-        raise ValueError('Unary consumer already consumed!')
-      elif self._terminated:
-        raise ValueError('Unary consumer already terminated!')
-      else:
-        self._consumed = True
+    def consume(self, value):
+        with self._lock:
+            if self._consumed:
+                raise ValueError('Unary consumer already consumed!')
+            elif self._terminated:
+                raise ValueError('Unary consumer already terminated!')
+            else:
+                self._consumed = True
 
-    self._action(value)
+        self._action(value)
 
-  def terminate(self):
-    with self._lock:
-      if not self._consumed:
-        raise ValueError('Unary consumer hasn\'t yet consumed!')
-      elif self._terminated:
-        raise ValueError('Unary consumer already terminated!')
-      else:
-        self._terminated = True
+    def terminate(self):
+        with self._lock:
+            if not self._consumed:
+                raise ValueError('Unary consumer hasn\'t yet consumed!')
+            elif self._terminated:
+                raise ValueError('Unary consumer already terminated!')
+            else:
+                self._terminated = True
 
-  def consume_and_terminate(self, value):
-    with self._lock:
-      if self._consumed:
-        raise ValueError('Unary consumer already consumed!')
-      elif self._terminated:
-        raise ValueError('Unary consumer already terminated!')
-      else:
-        self._consumed = True
-        self._terminated = True
+    def consume_and_terminate(self, value):
+        with self._lock:
+            if self._consumed:
+                raise ValueError('Unary consumer already consumed!')
+            elif self._terminated:
+                raise ValueError('Unary consumer already terminated!')
+            else:
+                self._consumed = True
+                self._terminated = True
 
-    self._action(value)
+        self._action(value)
 
 
 class _UnaryUnaryAdaptation(object):
 
-  def __init__(self, unary_unary_test_method):
-    self._method = unary_unary_test_method
+    def __init__(self, unary_unary_test_method):
+        self._method = unary_unary_test_method
 
-  def service(self, response_consumer, context, control):
-    def action(request):
-      self._method.service(
-          request, response_consumer.consume_and_terminate, context, control)
-    return _UnaryConsumer(action)
+    def service(self, response_consumer, context, control):
+
+        def action(request):
+            self._method.service(request,
+                                 response_consumer.consume_and_terminate,
+                                 context, control)
+
+        return _UnaryConsumer(action)
 
 
 class _UnaryStreamAdaptation(object):
 
-  def __init__(self, unary_stream_test_method):
-    self._method = unary_stream_test_method
+    def __init__(self, unary_stream_test_method):
+        self._method = unary_stream_test_method
 
-  def service(self, response_consumer, context, control):
-    def action(request):
-      self._method.service(request, response_consumer, context, control)
-    return _UnaryConsumer(action)
+    def service(self, response_consumer, context, control):
+
+        def action(request):
+            self._method.service(request, response_consumer, context, control)
+
+        return _UnaryConsumer(action)
 
 
 class _StreamUnaryAdaptation(object):
 
-  def __init__(self, stream_unary_test_method):
-    self._method = stream_unary_test_method
+    def __init__(self, stream_unary_test_method):
+        self._method = stream_unary_test_method
 
-  def service(self, response_consumer, context, control):
-    return self._method.service(
-        response_consumer.consume_and_terminate, context, control)
+    def service(self, response_consumer, context, control):
+        return self._method.service(response_consumer.consume_and_terminate,
+                                    context, control)
 
 
 class _MultiMethodImplementation(face.MultiMethodImplementation):
 
-  def __init__(self, methods, control, pool):
-    self._methods = methods
-    self._control = control
-    self._pool = pool
+    def __init__(self, methods, control, pool):
+        self._methods = methods
+        self._control = control
+        self._pool = pool
 
-  def service(self, group, name, response_consumer, context):
-    method = self._methods.get(group, name, None)
-    if method is None:
-      raise face.NoSuchMethodError(group, name)
-    elif self._pool is None:
-      return method(response_consumer, context, self._control)
-    else:
-      request_consumer = method(response_consumer, context, self._control)
-      return stream_util.ThreadSwitchingConsumer(request_consumer, self._pool)
+    def service(self, group, name, response_consumer, context):
+        method = self._methods.get(group, name, None)
+        if method is None:
+            raise face.NoSuchMethodError(group, name)
+        elif self._pool is None:
+            return method(response_consumer, context, self._control)
+        else:
+            request_consumer = method(response_consumer, context, self._control)
+            return stream_util.ThreadSwitchingConsumer(request_consumer,
+                                                       self._pool)
 
 
 class _Assembly(
-    collections.namedtuple(
-        '_Assembly',
-        ['methods', 'inlines', 'events', 'adaptations', 'messages'])):
-  """An intermediate structure created when creating a TestServiceDigest."""
+        collections.namedtuple(
+            '_Assembly',
+            ['methods', 'inlines', 'events', 'adaptations', 'messages'])):
+    """An intermediate structure created when creating a TestServiceDigest."""
 
 
-def _assemble(
-    scenarios, identifiers, inline_method_constructor, event_method_constructor,
-    adapter, control, pool):
-  """Creates an _Assembly from the given scenarios."""
-  methods = {}
-  inlines = {}
-  events = {}
-  adaptations = {}
-  messages = {}
-  for identifier, scenario in six.iteritems(scenarios):
-    if identifier in identifiers:
-      raise ValueError('Repeated identifier "(%s, %s)"!' % identifier)
+def _assemble(scenarios, identifiers, inline_method_constructor,
+              event_method_constructor, adapter, control, pool):
+    """Creates an _Assembly from the given scenarios."""
+    methods = {}
+    inlines = {}
+    events = {}
+    adaptations = {}
+    messages = {}
+    for identifier, scenario in six.iteritems(scenarios):
+        if identifier in identifiers:
+            raise ValueError('Repeated identifier "(%s, %s)"!' % identifier)
 
-    test_method = scenario[0]
-    inline_method = inline_method_constructor(test_method, control)
-    event_method = event_method_constructor(test_method, control, pool)
-    adaptation = adapter(test_method)
+        test_method = scenario[0]
+        inline_method = inline_method_constructor(test_method, control)
+        event_method = event_method_constructor(test_method, control, pool)
+        adaptation = adapter(test_method)
 
-    methods[identifier] = test_method
-    inlines[identifier] = inline_method
-    events[identifier] = event_method
-    adaptations[identifier] = adaptation
-    messages[identifier] = scenario[1]
+        methods[identifier] = test_method
+        inlines[identifier] = inline_method
+        events[identifier] = event_method
+        adaptations[identifier] = adaptation
+        messages[identifier] = scenario[1]
 
-  return _Assembly(methods, inlines, events, adaptations, messages)
+    return _Assembly(methods, inlines, events, adaptations, messages)
 
 
 def digest(service, control, pool):
-  """Creates a TestServiceDigest from a TestService.
+    """Creates a TestServiceDigest from a TestService.
 
   Args:
     service: A _service.TestService.
@@ -396,51 +399,48 @@
   Returns:
     A TestServiceDigest synthesized from the given service.TestService.
   """
-  identifiers = set()
+    identifiers = set()
 
-  unary_unary = _assemble(
-      service.unary_unary_scenarios(), identifiers, _InlineUnaryUnaryMethod,
-      _EventUnaryUnaryMethod, _UnaryUnaryAdaptation, control, pool)
-  identifiers.update(unary_unary.inlines)
+    unary_unary = _assemble(service.unary_unary_scenarios(), identifiers,
+                            _InlineUnaryUnaryMethod, _EventUnaryUnaryMethod,
+                            _UnaryUnaryAdaptation, control, pool)
+    identifiers.update(unary_unary.inlines)
 
-  unary_stream = _assemble(
-      service.unary_stream_scenarios(), identifiers, _InlineUnaryStreamMethod,
-      _EventUnaryStreamMethod, _UnaryStreamAdaptation, control, pool)
-  identifiers.update(unary_stream.inlines)
+    unary_stream = _assemble(service.unary_stream_scenarios(), identifiers,
+                             _InlineUnaryStreamMethod, _EventUnaryStreamMethod,
+                             _UnaryStreamAdaptation, control, pool)
+    identifiers.update(unary_stream.inlines)
 
-  stream_unary = _assemble(
-      service.stream_unary_scenarios(), identifiers, _InlineStreamUnaryMethod,
-      _EventStreamUnaryMethod, _StreamUnaryAdaptation, control, pool)
-  identifiers.update(stream_unary.inlines)
+    stream_unary = _assemble(service.stream_unary_scenarios(), identifiers,
+                             _InlineStreamUnaryMethod, _EventStreamUnaryMethod,
+                             _StreamUnaryAdaptation, control, pool)
+    identifiers.update(stream_unary.inlines)
 
-  stream_stream = _assemble(
-      service.stream_stream_scenarios(), identifiers, _InlineStreamStreamMethod,
-      _EventStreamStreamMethod, _IDENTITY, control, pool)
-  identifiers.update(stream_stream.inlines)
+    stream_stream = _assemble(service.stream_stream_scenarios(), identifiers,
+                              _InlineStreamStreamMethod,
+                              _EventStreamStreamMethod, _IDENTITY, control,
+                              pool)
+    identifiers.update(stream_stream.inlines)
 
-  methods = dict(unary_unary.methods)
-  methods.update(unary_stream.methods)
-  methods.update(stream_unary.methods)
-  methods.update(stream_stream.methods)
-  adaptations = dict(unary_unary.adaptations)
-  adaptations.update(unary_stream.adaptations)
-  adaptations.update(stream_unary.adaptations)
-  adaptations.update(stream_stream.adaptations)
-  inlines = dict(unary_unary.inlines)
-  inlines.update(unary_stream.inlines)
-  inlines.update(stream_unary.inlines)
-  inlines.update(stream_stream.inlines)
-  events = dict(unary_unary.events)
-  events.update(unary_stream.events)
-  events.update(stream_unary.events)
-  events.update(stream_stream.events)
+    methods = dict(unary_unary.methods)
+    methods.update(unary_stream.methods)
+    methods.update(stream_unary.methods)
+    methods.update(stream_stream.methods)
+    adaptations = dict(unary_unary.adaptations)
+    adaptations.update(unary_stream.adaptations)
+    adaptations.update(stream_unary.adaptations)
+    adaptations.update(stream_stream.adaptations)
+    inlines = dict(unary_unary.inlines)
+    inlines.update(unary_stream.inlines)
+    inlines.update(stream_unary.inlines)
+    inlines.update(stream_stream.inlines)
+    events = dict(unary_unary.events)
+    events.update(unary_stream.events)
+    events.update(stream_unary.events)
+    events.update(stream_stream.events)
 
-  return TestServiceDigest(
-      methods,
-      inlines,
-      events,
-      _MultiMethodImplementation(adaptations, control, pool),
-      unary_unary.messages,
-      unary_stream.messages,
-      stream_unary.messages,
-      stream_stream.messages)
+    return TestServiceDigest(
+        methods, inlines, events,
+        _MultiMethodImplementation(adaptations, control, pool),
+        unary_unary.messages, unary_stream.messages, stream_unary.messages,
+        stream_stream.messages)
diff --git a/src/python/grpcio_tests/tests/unit/framework/interfaces/face/_future_invocation_asynchronous_event_service.py b/src/python/grpcio_tests/tests/unit/framework/interfaces/face/_future_invocation_asynchronous_event_service.py
index df620b1..703eef3 100644
--- a/src/python/grpcio_tests/tests/unit/framework/interfaces/face/_future_invocation_asynchronous_event_service.py
+++ b/src/python/grpcio_tests/tests/unit/framework/interfaces/face/_future_invocation_asynchronous_event_service.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Test code for the Face layer of RPC Framework."""
 
 from __future__ import division
@@ -55,457 +54,470 @@
 
 class _PauseableIterator(object):
 
-  def __init__(self, upstream):
-    self._upstream = upstream
-    self._condition = threading.Condition()
-    self._paused = False
+    def __init__(self, upstream):
+        self._upstream = upstream
+        self._condition = threading.Condition()
+        self._paused = False
 
-  @contextlib.contextmanager
-  def pause(self):
-    with self._condition:
-      self._paused = True
-    yield
-    with self._condition:
-      self._paused = False
-      self._condition.notify_all()
+    @contextlib.contextmanager
+    def pause(self):
+        with self._condition:
+            self._paused = True
+        yield
+        with self._condition:
+            self._paused = False
+            self._condition.notify_all()
 
-  def __iter__(self):
-    return self
+    def __iter__(self):
+        return self
 
-  def __next__(self):
-    return self.next()
+    def __next__(self):
+        return self.next()
 
-  def next(self):
-    with self._condition:
-      while self._paused:
-        self._condition.wait()
-    return next(self._upstream)
+    def next(self):
+        with self._condition:
+            while self._paused:
+                self._condition.wait()
+        return next(self._upstream)
 
 
 class _Callback(object):
 
-  def __init__(self):
-    self._condition = threading.Condition()
-    self._called = False
-    self._passed_future = None
-    self._passed_other_stuff = None
+    def __init__(self):
+        self._condition = threading.Condition()
+        self._called = False
+        self._passed_future = None
+        self._passed_other_stuff = None
 
-  def __call__(self, *args, **kwargs):
-    with self._condition:
-      self._called = True
-      if args:
-        self._passed_future = args[0]
-      if 1 < len(args) or kwargs:
-        self._passed_other_stuff = tuple(args[1:]), dict(kwargs)
-      self._condition.notify_all()
+    def __call__(self, *args, **kwargs):
+        with self._condition:
+            self._called = True
+            if args:
+                self._passed_future = args[0]
+            if 1 < len(args) or kwargs:
+                self._passed_other_stuff = tuple(args[1:]), dict(kwargs)
+            self._condition.notify_all()
 
-  def future(self):
-    with self._condition:
-      while True:
-        if self._passed_other_stuff is not None:
-          raise ValueError(
-              'Test callback passed unexpected values: %s',
-              self._passed_other_stuff)
-        elif self._called:
-          return self._passed_future
-        else:
-          self._condition.wait()
+    def future(self):
+        with self._condition:
+            while True:
+                if self._passed_other_stuff is not None:
+                    raise ValueError(
+                        'Test callback passed unexpected values: %s',
+                        self._passed_other_stuff)
+                elif self._called:
+                    return self._passed_future
+                else:
+                    self._condition.wait()
 
 
-class TestCase(six.with_metaclass(abc.ABCMeta, test_coverage.Coverage, unittest.TestCase)):
-  """A test of the Face layer of RPC Framework.
+class TestCase(
+        six.with_metaclass(abc.ABCMeta, test_coverage.Coverage,
+                           unittest.TestCase)):
+    """A test of the Face layer of RPC Framework.
 
   Concrete subclasses must have an "implementation" attribute of type
   test_interfaces.Implementation and an "invoker_constructor" attribute of type
   _invocation.InvokerConstructor.
   """
 
-  NAME = 'FutureInvocationAsynchronousEventServiceTest'
+    NAME = 'FutureInvocationAsynchronousEventServiceTest'
 
-  def setUp(self):
-    """See unittest.TestCase.setUp for full specification.
+    def setUp(self):
+        """See unittest.TestCase.setUp for full specification.
 
     Overriding implementations must call this implementation.
     """
-    self._control = test_control.PauseFailControl()
-    self._digest_pool = logging_pool.pool(test_constants.POOL_SIZE)
-    self._digest = _digest.digest(
-        _stock_service.STOCK_TEST_SERVICE, self._control, self._digest_pool)
+        self._control = test_control.PauseFailControl()
+        self._digest_pool = logging_pool.pool(test_constants.POOL_SIZE)
+        self._digest = _digest.digest(_stock_service.STOCK_TEST_SERVICE,
+                                      self._control, self._digest_pool)
 
-    generic_stub, dynamic_stubs, self._memo = self.implementation.instantiate(
-        self._digest.methods, self._digest.event_method_implementations, None)
-    self._invoker = self.invoker_constructor.construct_invoker(
-        generic_stub, dynamic_stubs, self._digest.methods)
+        generic_stub, dynamic_stubs, self._memo = self.implementation.instantiate(
+            self._digest.methods, self._digest.event_method_implementations,
+            None)
+        self._invoker = self.invoker_constructor.construct_invoker(
+            generic_stub, dynamic_stubs, self._digest.methods)
 
-  def tearDown(self):
-    """See unittest.TestCase.tearDown for full specification.
+    def tearDown(self):
+        """See unittest.TestCase.tearDown for full specification.
 
     Overriding implementations must call this implementation.
     """
-    self._invoker = None
-    self.implementation.destantiate(self._memo)
-    self._digest_pool.shutdown(wait=True)
+        self._invoker = None
+        self.implementation.destantiate(self._memo)
+        self._digest_pool.shutdown(wait=True)
 
-  def testSuccessfulUnaryRequestUnaryResponse(self):
-    for (group, method), test_messages_sequence in (
-        six.iteritems(self._digest.unary_unary_messages_sequences)):
-      for test_messages in test_messages_sequence:
-        request = test_messages.request()
-        callback = _Callback()
+    def testSuccessfulUnaryRequestUnaryResponse(self):
+        for (group, method), test_messages_sequence in (
+                six.iteritems(self._digest.unary_unary_messages_sequences)):
+            for test_messages in test_messages_sequence:
+                request = test_messages.request()
+                callback = _Callback()
 
-        response_future = self._invoker.future(group, method)(
-            request, test_constants.LONG_TIMEOUT)
-        response_future.add_done_callback(callback)
-        response = response_future.result()
+                response_future = self._invoker.future(group, method)(
+                    request, test_constants.LONG_TIMEOUT)
+                response_future.add_done_callback(callback)
+                response = response_future.result()
 
-        test_messages.verify(request, response, self)
-        self.assertIs(callback.future(), response_future)
-        self.assertIsNone(response_future.exception())
-        self.assertIsNone(response_future.traceback())
+                test_messages.verify(request, response, self)
+                self.assertIs(callback.future(), response_future)
+                self.assertIsNone(response_future.exception())
+                self.assertIsNone(response_future.traceback())
 
-  def testSuccessfulUnaryRequestStreamResponse(self):
-    for (group, method), test_messages_sequence in (
-        six.iteritems(self._digest.unary_stream_messages_sequences)):
-      for test_messages in test_messages_sequence:
-        request = test_messages.request()
+    def testSuccessfulUnaryRequestStreamResponse(self):
+        for (group, method), test_messages_sequence in (
+                six.iteritems(self._digest.unary_stream_messages_sequences)):
+            for test_messages in test_messages_sequence:
+                request = test_messages.request()
 
-        response_iterator = self._invoker.future(group, method)(
-            request, test_constants.LONG_TIMEOUT)
-        responses = list(response_iterator)
+                response_iterator = self._invoker.future(group, method)(
+                    request, test_constants.LONG_TIMEOUT)
+                responses = list(response_iterator)
 
-        test_messages.verify(request, responses, self)
+                test_messages.verify(request, responses, self)
 
-  def testSuccessfulStreamRequestUnaryResponse(self):
-    for (group, method), test_messages_sequence in (
-        six.iteritems(self._digest.stream_unary_messages_sequences)):
-      for test_messages in test_messages_sequence:
-        requests = test_messages.requests()
-        request_iterator = _PauseableIterator(iter(requests))
-        callback = _Callback()
+    def testSuccessfulStreamRequestUnaryResponse(self):
+        for (group, method), test_messages_sequence in (
+                six.iteritems(self._digest.stream_unary_messages_sequences)):
+            for test_messages in test_messages_sequence:
+                requests = test_messages.requests()
+                request_iterator = _PauseableIterator(iter(requests))
+                callback = _Callback()
 
-        # Use of a paused iterator of requests allows us to test that control is
-        # returned to calling code before the iterator yields any requests.
-        with request_iterator.pause():
-          response_future = self._invoker.future(group, method)(
-              request_iterator, test_constants.LONG_TIMEOUT)
-          response_future.add_done_callback(callback)
-        future_passed_to_callback = callback.future()
-        response = future_passed_to_callback.result()
+                # Use of a paused iterator of requests allows us to test that control is
+                # returned to calling code before the iterator yields any requests.
+                with request_iterator.pause():
+                    response_future = self._invoker.future(group, method)(
+                        request_iterator, test_constants.LONG_TIMEOUT)
+                    response_future.add_done_callback(callback)
+                future_passed_to_callback = callback.future()
+                response = future_passed_to_callback.result()
 
-        test_messages.verify(requests, response, self)
-        self.assertIs(future_passed_to_callback, response_future)
-        self.assertIsNone(response_future.exception())
-        self.assertIsNone(response_future.traceback())
+                test_messages.verify(requests, response, self)
+                self.assertIs(future_passed_to_callback, response_future)
+                self.assertIsNone(response_future.exception())
+                self.assertIsNone(response_future.traceback())
 
-  def testSuccessfulStreamRequestStreamResponse(self):
-    for (group, method), test_messages_sequence in (
-        six.iteritems(self._digest.stream_stream_messages_sequences)):
-      for test_messages in test_messages_sequence:
-        requests = test_messages.requests()
-        request_iterator = _PauseableIterator(iter(requests))
+    def testSuccessfulStreamRequestStreamResponse(self):
+        for (group, method), test_messages_sequence in (
+                six.iteritems(self._digest.stream_stream_messages_sequences)):
+            for test_messages in test_messages_sequence:
+                requests = test_messages.requests()
+                request_iterator = _PauseableIterator(iter(requests))
 
-        # Use of a paused iterator of requests allows us to test that control is
-        # returned to calling code before the iterator yields any requests.
-        with request_iterator.pause():
-          response_iterator = self._invoker.future(group, method)(
-              request_iterator, test_constants.LONG_TIMEOUT)
-        responses = list(response_iterator)
+                # Use of a paused iterator of requests allows us to test that control is
+                # returned to calling code before the iterator yields any requests.
+                with request_iterator.pause():
+                    response_iterator = self._invoker.future(group, method)(
+                        request_iterator, test_constants.LONG_TIMEOUT)
+                responses = list(response_iterator)
 
-        test_messages.verify(requests, responses, self)
+                test_messages.verify(requests, responses, self)
 
-  def testSequentialInvocations(self):
-    for (group, method), test_messages_sequence in (
-        six.iteritems(self._digest.unary_unary_messages_sequences)):
-      for test_messages in test_messages_sequence:
-        first_request = test_messages.request()
-        second_request = test_messages.request()
+    def testSequentialInvocations(self):
+        for (group, method), test_messages_sequence in (
+                six.iteritems(self._digest.unary_unary_messages_sequences)):
+            for test_messages in test_messages_sequence:
+                first_request = test_messages.request()
+                second_request = test_messages.request()
 
-        first_response_future = self._invoker.future(group, method)(
-            first_request, test_constants.LONG_TIMEOUT)
-        first_response = first_response_future.result()
+                first_response_future = self._invoker.future(group, method)(
+                    first_request, test_constants.LONG_TIMEOUT)
+                first_response = first_response_future.result()
 
-        test_messages.verify(first_request, first_response, self)
+                test_messages.verify(first_request, first_response, self)
 
-        second_response_future = self._invoker.future(group, method)(
-            second_request, test_constants.LONG_TIMEOUT)
-        second_response = second_response_future.result()
+                second_response_future = self._invoker.future(group, method)(
+                    second_request, test_constants.LONG_TIMEOUT)
+                second_response = second_response_future.result()
 
-        test_messages.verify(second_request, second_response, self)
+                test_messages.verify(second_request, second_response, self)
 
-  def testParallelInvocations(self):
-    for (group, method), test_messages_sequence in (
-        six.iteritems(self._digest.unary_unary_messages_sequences)):
-      for test_messages in test_messages_sequence:
-        first_request = test_messages.request()
-        second_request = test_messages.request()
+    def testParallelInvocations(self):
+        for (group, method), test_messages_sequence in (
+                six.iteritems(self._digest.unary_unary_messages_sequences)):
+            for test_messages in test_messages_sequence:
+                first_request = test_messages.request()
+                second_request = test_messages.request()
 
-        first_response_future = self._invoker.future(group, method)(
-            first_request, test_constants.LONG_TIMEOUT)
-        second_response_future = self._invoker.future(group, method)(
-            second_request, test_constants.LONG_TIMEOUT)
-        first_response = first_response_future.result()
-        second_response = second_response_future.result()
+                first_response_future = self._invoker.future(group, method)(
+                    first_request, test_constants.LONG_TIMEOUT)
+                second_response_future = self._invoker.future(group, method)(
+                    second_request, test_constants.LONG_TIMEOUT)
+                first_response = first_response_future.result()
+                second_response = second_response_future.result()
 
-        test_messages.verify(first_request, first_response, self)
-        test_messages.verify(second_request, second_response, self)
+                test_messages.verify(first_request, first_response, self)
+                test_messages.verify(second_request, second_response, self)
 
-    for (group, method), test_messages_sequence in (
-        six.iteritems(self._digest.unary_unary_messages_sequences)):
-      for test_messages in test_messages_sequence:
-        requests = []
-        response_futures = []
-        for _ in range(test_constants.THREAD_CONCURRENCY):
-          request = test_messages.request()
-          response_future = self._invoker.future(group, method)(
-              request, test_constants.LONG_TIMEOUT)
-          requests.append(request)
-          response_futures.append(response_future)
+        for (group, method), test_messages_sequence in (
+                six.iteritems(self._digest.unary_unary_messages_sequences)):
+            for test_messages in test_messages_sequence:
+                requests = []
+                response_futures = []
+                for _ in range(test_constants.THREAD_CONCURRENCY):
+                    request = test_messages.request()
+                    response_future = self._invoker.future(group, method)(
+                        request, test_constants.LONG_TIMEOUT)
+                    requests.append(request)
+                    response_futures.append(response_future)
 
-        responses = [
-            response_future.result() for response_future in response_futures]
+                responses = [
+                    response_future.result()
+                    for response_future in response_futures
+                ]
 
-        for request, response in zip(requests, responses):
-          test_messages.verify(request, response, self)
+                for request, response in zip(requests, responses):
+                    test_messages.verify(request, response, self)
 
-  def testWaitingForSomeButNotAllParallelInvocations(self):
-    pool = logging_pool.pool(test_constants.THREAD_CONCURRENCY)
-    for (group, method), test_messages_sequence in (
-        six.iteritems(self._digest.unary_unary_messages_sequences)):
-      for test_messages in test_messages_sequence:
-        requests = []
-        response_futures_to_indices = {}
-        for index in range(test_constants.THREAD_CONCURRENCY):
-          request = test_messages.request()
-          inner_response_future = self._invoker.future(group, method)(
-              request, test_constants.LONG_TIMEOUT)
-          outer_response_future = pool.submit(inner_response_future.result)
-          requests.append(request)
-          response_futures_to_indices[outer_response_future] = index
+    def testWaitingForSomeButNotAllParallelInvocations(self):
+        pool = logging_pool.pool(test_constants.THREAD_CONCURRENCY)
+        for (group, method), test_messages_sequence in (
+                six.iteritems(self._digest.unary_unary_messages_sequences)):
+            for test_messages in test_messages_sequence:
+                requests = []
+                response_futures_to_indices = {}
+                for index in range(test_constants.THREAD_CONCURRENCY):
+                    request = test_messages.request()
+                    inner_response_future = self._invoker.future(group, method)(
+                        request, test_constants.LONG_TIMEOUT)
+                    outer_response_future = pool.submit(
+                        inner_response_future.result)
+                    requests.append(request)
+                    response_futures_to_indices[outer_response_future] = index
 
-        some_completed_response_futures_iterator = itertools.islice(
-            futures.as_completed(response_futures_to_indices),
-            test_constants.THREAD_CONCURRENCY // 2)
-        for response_future in some_completed_response_futures_iterator:
-          index = response_futures_to_indices[response_future]
-          test_messages.verify(requests[index], response_future.result(), self)
-    pool.shutdown(wait=True)
+                some_completed_response_futures_iterator = itertools.islice(
+                    futures.as_completed(response_futures_to_indices),
+                    test_constants.THREAD_CONCURRENCY // 2)
+                for response_future in some_completed_response_futures_iterator:
+                    index = response_futures_to_indices[response_future]
+                    test_messages.verify(requests[index],
+                                         response_future.result(), self)
+        pool.shutdown(wait=True)
 
-  def testCancelledUnaryRequestUnaryResponse(self):
-    for (group, method), test_messages_sequence in (
-        six.iteritems(self._digest.unary_unary_messages_sequences)):
-      for test_messages in test_messages_sequence:
-        request = test_messages.request()
-        callback = _Callback()
+    def testCancelledUnaryRequestUnaryResponse(self):
+        for (group, method), test_messages_sequence in (
+                six.iteritems(self._digest.unary_unary_messages_sequences)):
+            for test_messages in test_messages_sequence:
+                request = test_messages.request()
+                callback = _Callback()
 
-        with self._control.pause():
-          response_future = self._invoker.future(group, method)(
-              request, test_constants.LONG_TIMEOUT)
-          response_future.add_done_callback(callback)
-          cancel_method_return_value = response_future.cancel()
+                with self._control.pause():
+                    response_future = self._invoker.future(group, method)(
+                        request, test_constants.LONG_TIMEOUT)
+                    response_future.add_done_callback(callback)
+                    cancel_method_return_value = response_future.cancel()
 
-        self.assertIs(callback.future(), response_future)
-        self.assertFalse(cancel_method_return_value)
-        self.assertTrue(response_future.cancelled())
-        with self.assertRaises(future.CancelledError):
-          response_future.result()
-        with self.assertRaises(future.CancelledError):
-          response_future.exception()
-        with self.assertRaises(future.CancelledError):
-          response_future.traceback()
+                self.assertIs(callback.future(), response_future)
+                self.assertFalse(cancel_method_return_value)
+                self.assertTrue(response_future.cancelled())
+                with self.assertRaises(future.CancelledError):
+                    response_future.result()
+                with self.assertRaises(future.CancelledError):
+                    response_future.exception()
+                with self.assertRaises(future.CancelledError):
+                    response_future.traceback()
 
-  def testCancelledUnaryRequestStreamResponse(self):
-    for (group, method), test_messages_sequence in (
-        six.iteritems(self._digest.unary_stream_messages_sequences)):
-      for test_messages in test_messages_sequence:
-        request = test_messages.request()
+    def testCancelledUnaryRequestStreamResponse(self):
+        for (group, method), test_messages_sequence in (
+                six.iteritems(self._digest.unary_stream_messages_sequences)):
+            for test_messages in test_messages_sequence:
+                request = test_messages.request()
 
-        with self._control.pause():
-          response_iterator = self._invoker.future(group, method)(
-              request, test_constants.LONG_TIMEOUT)
-          response_iterator.cancel()
+                with self._control.pause():
+                    response_iterator = self._invoker.future(group, method)(
+                        request, test_constants.LONG_TIMEOUT)
+                    response_iterator.cancel()
 
-        with self.assertRaises(face.CancellationError):
-          next(response_iterator)
+                with self.assertRaises(face.CancellationError):
+                    next(response_iterator)
 
-  def testCancelledStreamRequestUnaryResponse(self):
-    for (group, method), test_messages_sequence in (
-        six.iteritems(self._digest.stream_unary_messages_sequences)):
-      for test_messages in test_messages_sequence:
-        requests = test_messages.requests()
-        callback = _Callback()
+    def testCancelledStreamRequestUnaryResponse(self):
+        for (group, method), test_messages_sequence in (
+                six.iteritems(self._digest.stream_unary_messages_sequences)):
+            for test_messages in test_messages_sequence:
+                requests = test_messages.requests()
+                callback = _Callback()
 
-        with self._control.pause():
-          response_future = self._invoker.future(group, method)(
-              iter(requests), test_constants.LONG_TIMEOUT)
-          response_future.add_done_callback(callback)
-          cancel_method_return_value = response_future.cancel()
+                with self._control.pause():
+                    response_future = self._invoker.future(group, method)(
+                        iter(requests), test_constants.LONG_TIMEOUT)
+                    response_future.add_done_callback(callback)
+                    cancel_method_return_value = response_future.cancel()
 
-        self.assertIs(callback.future(), response_future)
-        self.assertFalse(cancel_method_return_value)
-        self.assertTrue(response_future.cancelled())
-        with self.assertRaises(future.CancelledError):
-          response_future.result()
-        with self.assertRaises(future.CancelledError):
-          response_future.exception()
-        with self.assertRaises(future.CancelledError):
-          response_future.traceback()
+                self.assertIs(callback.future(), response_future)
+                self.assertFalse(cancel_method_return_value)
+                self.assertTrue(response_future.cancelled())
+                with self.assertRaises(future.CancelledError):
+                    response_future.result()
+                with self.assertRaises(future.CancelledError):
+                    response_future.exception()
+                with self.assertRaises(future.CancelledError):
+                    response_future.traceback()
 
-  def testCancelledStreamRequestStreamResponse(self):
-    for (group, method), test_messages_sequence in (
-        six.iteritems(self._digest.stream_stream_messages_sequences)):
-      for test_messages in test_messages_sequence:
-        requests = test_messages.requests()
+    def testCancelledStreamRequestStreamResponse(self):
+        for (group, method), test_messages_sequence in (
+                six.iteritems(self._digest.stream_stream_messages_sequences)):
+            for test_messages in test_messages_sequence:
+                requests = test_messages.requests()
 
-        with self._control.pause():
-          response_iterator = self._invoker.future(group, method)(
-              iter(requests), test_constants.LONG_TIMEOUT)
-          response_iterator.cancel()
+                with self._control.pause():
+                    response_iterator = self._invoker.future(group, method)(
+                        iter(requests), test_constants.LONG_TIMEOUT)
+                    response_iterator.cancel()
 
-        with self.assertRaises(face.CancellationError):
-          next(response_iterator)
+                with self.assertRaises(face.CancellationError):
+                    next(response_iterator)
 
-  def testExpiredUnaryRequestUnaryResponse(self):
-    for (group, method), test_messages_sequence in (
-        six.iteritems(self._digest.unary_unary_messages_sequences)):
-      for test_messages in test_messages_sequence:
-        request = test_messages.request()
-        callback = _Callback()
+    def testExpiredUnaryRequestUnaryResponse(self):
+        for (group, method), test_messages_sequence in (
+                six.iteritems(self._digest.unary_unary_messages_sequences)):
+            for test_messages in test_messages_sequence:
+                request = test_messages.request()
+                callback = _Callback()
 
-        with self._control.pause():
-          response_future = self._invoker.future(
-              group, method)(request, _3069_test_constant.REALLY_SHORT_TIMEOUT)
-          response_future.add_done_callback(callback)
-          self.assertIs(callback.future(), response_future)
-          self.assertIsInstance(
-              response_future.exception(), face.ExpirationError)
-          with self.assertRaises(face.ExpirationError):
-            response_future.result()
-          self.assertIsInstance(
-              response_future.exception(), face.AbortionError)
-          self.assertIsNotNone(response_future.traceback())
+                with self._control.pause():
+                    response_future = self._invoker.future(group, method)(
+                        request, _3069_test_constant.REALLY_SHORT_TIMEOUT)
+                    response_future.add_done_callback(callback)
+                    self.assertIs(callback.future(), response_future)
+                    self.assertIsInstance(response_future.exception(),
+                                          face.ExpirationError)
+                    with self.assertRaises(face.ExpirationError):
+                        response_future.result()
+                    self.assertIsInstance(response_future.exception(),
+                                          face.AbortionError)
+                    self.assertIsNotNone(response_future.traceback())
 
-  def testExpiredUnaryRequestStreamResponse(self):
-    for (group, method), test_messages_sequence in (
-        six.iteritems(self._digest.unary_stream_messages_sequences)):
-      for test_messages in test_messages_sequence:
-        request = test_messages.request()
+    def testExpiredUnaryRequestStreamResponse(self):
+        for (group, method), test_messages_sequence in (
+                six.iteritems(self._digest.unary_stream_messages_sequences)):
+            for test_messages in test_messages_sequence:
+                request = test_messages.request()
 
-        with self._control.pause():
-          response_iterator = self._invoker.future(group, method)(
-              request, _3069_test_constant.REALLY_SHORT_TIMEOUT)
-          with self.assertRaises(face.ExpirationError):
-            list(response_iterator)
+                with self._control.pause():
+                    response_iterator = self._invoker.future(group, method)(
+                        request, _3069_test_constant.REALLY_SHORT_TIMEOUT)
+                    with self.assertRaises(face.ExpirationError):
+                        list(response_iterator)
 
-  def testExpiredStreamRequestUnaryResponse(self):
-    for (group, method), test_messages_sequence in (
-        six.iteritems(self._digest.stream_unary_messages_sequences)):
-      for test_messages in test_messages_sequence:
-        requests = test_messages.requests()
-        callback = _Callback()
+    def testExpiredStreamRequestUnaryResponse(self):
+        for (group, method), test_messages_sequence in (
+                six.iteritems(self._digest.stream_unary_messages_sequences)):
+            for test_messages in test_messages_sequence:
+                requests = test_messages.requests()
+                callback = _Callback()
 
-        with self._control.pause():
-          response_future = self._invoker.future(group, method)(
-              iter(requests), _3069_test_constant.REALLY_SHORT_TIMEOUT)
-          response_future.add_done_callback(callback)
-          self.assertIs(callback.future(), response_future)
-          self.assertIsInstance(
-              response_future.exception(), face.ExpirationError)
-          with self.assertRaises(face.ExpirationError):
-            response_future.result()
-          self.assertIsInstance(
-              response_future.exception(), face.AbortionError)
-          self.assertIsNotNone(response_future.traceback())
+                with self._control.pause():
+                    response_future = self._invoker.future(group, method)(
+                        iter(requests),
+                        _3069_test_constant.REALLY_SHORT_TIMEOUT)
+                    response_future.add_done_callback(callback)
+                    self.assertIs(callback.future(), response_future)
+                    self.assertIsInstance(response_future.exception(),
+                                          face.ExpirationError)
+                    with self.assertRaises(face.ExpirationError):
+                        response_future.result()
+                    self.assertIsInstance(response_future.exception(),
+                                          face.AbortionError)
+                    self.assertIsNotNone(response_future.traceback())
 
-  def testExpiredStreamRequestStreamResponse(self):
-    for (group, method), test_messages_sequence in (
-        six.iteritems(self._digest.stream_stream_messages_sequences)):
-      for test_messages in test_messages_sequence:
-        requests = test_messages.requests()
+    def testExpiredStreamRequestStreamResponse(self):
+        for (group, method), test_messages_sequence in (
+                six.iteritems(self._digest.stream_stream_messages_sequences)):
+            for test_messages in test_messages_sequence:
+                requests = test_messages.requests()
 
-        with self._control.pause():
-          response_iterator = self._invoker.future(group, method)(
-              iter(requests), _3069_test_constant.REALLY_SHORT_TIMEOUT)
-          with self.assertRaises(face.ExpirationError):
-            list(response_iterator)
+                with self._control.pause():
+                    response_iterator = self._invoker.future(group, method)(
+                        iter(requests),
+                        _3069_test_constant.REALLY_SHORT_TIMEOUT)
+                    with self.assertRaises(face.ExpirationError):
+                        list(response_iterator)
 
-  def testFailedUnaryRequestUnaryResponse(self):
-    for (group, method), test_messages_sequence in (
-        six.iteritems(self._digest.unary_unary_messages_sequences)):
-      for test_messages in test_messages_sequence:
-        request = test_messages.request()
-        callback = _Callback()
-        abortion_callback = _Callback()
+    def testFailedUnaryRequestUnaryResponse(self):
+        for (group, method), test_messages_sequence in (
+                six.iteritems(self._digest.unary_unary_messages_sequences)):
+            for test_messages in test_messages_sequence:
+                request = test_messages.request()
+                callback = _Callback()
+                abortion_callback = _Callback()
 
-        with self._control.fail():
-          response_future = self._invoker.future(group, method)(
-              request, _3069_test_constant.REALLY_SHORT_TIMEOUT)
-          response_future.add_done_callback(callback)
-          response_future.add_abortion_callback(abortion_callback)
+                with self._control.fail():
+                    response_future = self._invoker.future(group, method)(
+                        request, _3069_test_constant.REALLY_SHORT_TIMEOUT)
+                    response_future.add_done_callback(callback)
+                    response_future.add_abortion_callback(abortion_callback)
 
-          self.assertIs(callback.future(), response_future)
-          # Because the servicer fails outside of the thread from which the
-          # servicer-side runtime called into it its failure is
-          # indistinguishable from simply not having called its
-          # response_callback before the expiration of the RPC.
-          self.assertIsInstance(
-              response_future.exception(), face.ExpirationError)
-          with self.assertRaises(face.ExpirationError):
-            response_future.result()
-          self.assertIsNotNone(response_future.traceback())
-          self.assertIsNotNone(abortion_callback.future())
+                    self.assertIs(callback.future(), response_future)
+                    # Because the servicer fails outside of the thread from which the
+                    # servicer-side runtime called into it its failure is
+                    # indistinguishable from simply not having called its
+                    # response_callback before the expiration of the RPC.
+                    self.assertIsInstance(response_future.exception(),
+                                          face.ExpirationError)
+                    with self.assertRaises(face.ExpirationError):
+                        response_future.result()
+                    self.assertIsNotNone(response_future.traceback())
+                    self.assertIsNotNone(abortion_callback.future())
 
-  def testFailedUnaryRequestStreamResponse(self):
-    for (group, method), test_messages_sequence in (
-        six.iteritems(self._digest.unary_stream_messages_sequences)):
-      for test_messages in test_messages_sequence:
-        request = test_messages.request()
+    def testFailedUnaryRequestStreamResponse(self):
+        for (group, method), test_messages_sequence in (
+                six.iteritems(self._digest.unary_stream_messages_sequences)):
+            for test_messages in test_messages_sequence:
+                request = test_messages.request()
 
-        # Because the servicer fails outside of the thread from which the
-        # servicer-side runtime called into it its failure is indistinguishable
-        # from simply not having called its response_consumer before the
-        # expiration of the RPC.
-        with self._control.fail(), self.assertRaises(face.ExpirationError):
-          response_iterator = self._invoker.future(group, method)(
-              request, _3069_test_constant.REALLY_SHORT_TIMEOUT)
-          list(response_iterator)
+                # Because the servicer fails outside of the thread from which the
+                # servicer-side runtime called into it its failure is indistinguishable
+                # from simply not having called its response_consumer before the
+                # expiration of the RPC.
+                with self._control.fail(), self.assertRaises(
+                        face.ExpirationError):
+                    response_iterator = self._invoker.future(group, method)(
+                        request, _3069_test_constant.REALLY_SHORT_TIMEOUT)
+                    list(response_iterator)
 
-  def testFailedStreamRequestUnaryResponse(self):
-    for (group, method), test_messages_sequence in (
-        six.iteritems(self._digest.stream_unary_messages_sequences)):
-      for test_messages in test_messages_sequence:
-        requests = test_messages.requests()
-        callback = _Callback()
-        abortion_callback = _Callback()
+    def testFailedStreamRequestUnaryResponse(self):
+        for (group, method), test_messages_sequence in (
+                six.iteritems(self._digest.stream_unary_messages_sequences)):
+            for test_messages in test_messages_sequence:
+                requests = test_messages.requests()
+                callback = _Callback()
+                abortion_callback = _Callback()
 
-        with self._control.fail():
-          response_future = self._invoker.future(group, method)(
-              iter(requests), _3069_test_constant.REALLY_SHORT_TIMEOUT)
-          response_future.add_done_callback(callback)
-          response_future.add_abortion_callback(abortion_callback)
+                with self._control.fail():
+                    response_future = self._invoker.future(group, method)(
+                        iter(requests),
+                        _3069_test_constant.REALLY_SHORT_TIMEOUT)
+                    response_future.add_done_callback(callback)
+                    response_future.add_abortion_callback(abortion_callback)
 
-          self.assertIs(callback.future(), response_future)
-          # Because the servicer fails outside of the thread from which the
-          # servicer-side runtime called into it its failure is
-          # indistinguishable from simply not having called its
-          # response_callback before the expiration of the RPC.
-          self.assertIsInstance(
-              response_future.exception(), face.ExpirationError)
-          with self.assertRaises(face.ExpirationError):
-            response_future.result()
-          self.assertIsNotNone(response_future.traceback())
-          self.assertIsNotNone(abortion_callback.future())
+                    self.assertIs(callback.future(), response_future)
+                    # Because the servicer fails outside of the thread from which the
+                    # servicer-side runtime called into it its failure is
+                    # indistinguishable from simply not having called its
+                    # response_callback before the expiration of the RPC.
+                    self.assertIsInstance(response_future.exception(),
+                                          face.ExpirationError)
+                    with self.assertRaises(face.ExpirationError):
+                        response_future.result()
+                    self.assertIsNotNone(response_future.traceback())
+                    self.assertIsNotNone(abortion_callback.future())
 
-  def testFailedStreamRequestStreamResponse(self):
-    for (group, method), test_messages_sequence in (
-        six.iteritems(self._digest.stream_stream_messages_sequences)):
-      for test_messages in test_messages_sequence:
-        requests = test_messages.requests()
+    def testFailedStreamRequestStreamResponse(self):
+        for (group, method), test_messages_sequence in (
+                six.iteritems(self._digest.stream_stream_messages_sequences)):
+            for test_messages in test_messages_sequence:
+                requests = test_messages.requests()
 
-        # Because the servicer fails outside of the thread from which the
-        # servicer-side runtime called into it its failure is indistinguishable
-        # from simply not having called its response_consumer before the
-        # expiration of the RPC.
-        with self._control.fail(), self.assertRaises(face.ExpirationError):
-          response_iterator = self._invoker.future(group, method)(
-              iter(requests), _3069_test_constant.REALLY_SHORT_TIMEOUT)
-          list(response_iterator)
+                # Because the servicer fails outside of the thread from which the
+                # servicer-side runtime called into it its failure is indistinguishable
+                # from simply not having called its response_consumer before the
+                # expiration of the RPC.
+                with self._control.fail(), self.assertRaises(
+                        face.ExpirationError):
+                    response_iterator = self._invoker.future(group, method)(
+                        iter(requests),
+                        _3069_test_constant.REALLY_SHORT_TIMEOUT)
+                    list(response_iterator)
diff --git a/src/python/grpcio_tests/tests/unit/framework/interfaces/face/_invocation.py b/src/python/grpcio_tests/tests/unit/framework/interfaces/face/_invocation.py
index ac487be..4e144a3 100644
--- a/src/python/grpcio_tests/tests/unit/framework/interfaces/face/_invocation.py
+++ b/src/python/grpcio_tests/tests/unit/framework/interfaces/face/_invocation.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Coverage across the Face layer's generic-to-dynamic range for invocation."""
 
 import abc
@@ -65,149 +64,149 @@
 
 
 class Invoker(six.with_metaclass(abc.ABCMeta)):
-  """A type used to invoke test RPCs."""
+    """A type used to invoke test RPCs."""
 
-  @abc.abstractmethod
-  def blocking(self, group, name):
-    """Invokes an RPC with blocking control flow."""
-    raise NotImplementedError()
+    @abc.abstractmethod
+    def blocking(self, group, name):
+        """Invokes an RPC with blocking control flow."""
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def future(self, group, name):
-    """Invokes an RPC with future control flow."""
-    raise NotImplementedError()
+    @abc.abstractmethod
+    def future(self, group, name):
+        """Invokes an RPC with future control flow."""
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def event(self, group, name):
-    """Invokes an RPC with event control flow."""
-    raise NotImplementedError()
+    @abc.abstractmethod
+    def event(self, group, name):
+        """Invokes an RPC with event control flow."""
+        raise NotImplementedError()
 
 
 class InvokerConstructor(six.with_metaclass(abc.ABCMeta)):
-  """A type used to create Invokers."""
+    """A type used to create Invokers."""
 
-  @abc.abstractmethod
-  def name(self):
-    """Specifies the name of the Invoker constructed by this object."""
-    raise NotImplementedError()
+    @abc.abstractmethod
+    def name(self):
+        """Specifies the name of the Invoker constructed by this object."""
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def construct_invoker(self, generic_stub, dynamic_stubs, methods):
-    """Constructs an Invoker for the given stubs and methods."""
-    raise NotImplementedError()
+    @abc.abstractmethod
+    def construct_invoker(self, generic_stub, dynamic_stubs, methods):
+        """Constructs an Invoker for the given stubs and methods."""
+        raise NotImplementedError()
 
 
 class _GenericInvoker(Invoker):
 
-  def __init__(self, generic_stub, methods):
-    self._stub = generic_stub
-    self._methods = methods
+    def __init__(self, generic_stub, methods):
+        self._stub = generic_stub
+        self._methods = methods
 
-  def _behavior(self, group, name, cardinality_to_generic_method):
-    method_cardinality = self._methods[group, name].cardinality()
-    behavior = getattr(
-        self._stub, cardinality_to_generic_method[method_cardinality])
-    return lambda *args, **kwargs: behavior(group, name, *args, **kwargs)
+    def _behavior(self, group, name, cardinality_to_generic_method):
+        method_cardinality = self._methods[group, name].cardinality()
+        behavior = getattr(self._stub,
+                           cardinality_to_generic_method[method_cardinality])
+        return lambda *args, **kwargs: behavior(group, name, *args, **kwargs)
 
-  def blocking(self, group, name):
-    return self._behavior(
-        group, name, _CARDINALITY_TO_GENERIC_BLOCKING_BEHAVIOR)
+    def blocking(self, group, name):
+        return self._behavior(group, name,
+                              _CARDINALITY_TO_GENERIC_BLOCKING_BEHAVIOR)
 
-  def future(self, group, name):
-    return self._behavior(group, name, _CARDINALITY_TO_GENERIC_FUTURE_BEHAVIOR)
+    def future(self, group, name):
+        return self._behavior(group, name,
+                              _CARDINALITY_TO_GENERIC_FUTURE_BEHAVIOR)
 
-  def event(self, group, name):
-    return self._behavior(group, name, _CARDINALITY_TO_GENERIC_EVENT_BEHAVIOR)
+    def event(self, group, name):
+        return self._behavior(group, name,
+                              _CARDINALITY_TO_GENERIC_EVENT_BEHAVIOR)
 
 
 class _GenericInvokerConstructor(InvokerConstructor):
 
-  def name(self):
-    return 'GenericInvoker'
+    def name(self):
+        return 'GenericInvoker'
 
-  def construct_invoker(self, generic_stub, dynamic_stub, methods):
-    return _GenericInvoker(generic_stub, methods)
+    def construct_invoker(self, generic_stub, dynamic_stub, methods):
+        return _GenericInvoker(generic_stub, methods)
 
 
 class _MultiCallableInvoker(Invoker):
 
-  def __init__(self, generic_stub, methods):
-    self._stub = generic_stub
-    self._methods = methods
+    def __init__(self, generic_stub, methods):
+        self._stub = generic_stub
+        self._methods = methods
 
-  def _multi_callable(self, group, name):
-    method_cardinality = self._methods[group, name].cardinality()
-    behavior = getattr(
-        self._stub,
-        _CARDINALITY_TO_MULTI_CALLABLE_ATTRIBUTE[method_cardinality])
-    return behavior(group, name)
+    def _multi_callable(self, group, name):
+        method_cardinality = self._methods[group, name].cardinality()
+        behavior = getattr(
+            self._stub,
+            _CARDINALITY_TO_MULTI_CALLABLE_ATTRIBUTE[method_cardinality])
+        return behavior(group, name)
 
-  def blocking(self, group, name):
-    return self._multi_callable(group, name)
+    def blocking(self, group, name):
+        return self._multi_callable(group, name)
 
-  def future(self, group, name):
-    method_cardinality = self._methods[group, name].cardinality()
-    behavior = getattr(
-        self._stub,
-        _CARDINALITY_TO_MULTI_CALLABLE_ATTRIBUTE[method_cardinality])
-    if method_cardinality in (
-        cardinality.Cardinality.UNARY_UNARY,
-        cardinality.Cardinality.STREAM_UNARY):
-      return behavior(group, name).future
-    else:
-      return behavior(group, name)
+    def future(self, group, name):
+        method_cardinality = self._methods[group, name].cardinality()
+        behavior = getattr(
+            self._stub,
+            _CARDINALITY_TO_MULTI_CALLABLE_ATTRIBUTE[method_cardinality])
+        if method_cardinality in (cardinality.Cardinality.UNARY_UNARY,
+                                  cardinality.Cardinality.STREAM_UNARY):
+            return behavior(group, name).future
+        else:
+            return behavior(group, name)
 
-  def event(self, group, name):
-    return self._multi_callable(group, name).event
+    def event(self, group, name):
+        return self._multi_callable(group, name).event
 
 
 class _MultiCallableInvokerConstructor(InvokerConstructor):
 
-  def name(self):
-    return 'MultiCallableInvoker'
+    def name(self):
+        return 'MultiCallableInvoker'
 
-  def construct_invoker(self, generic_stub, dynamic_stub, methods):
-    return _MultiCallableInvoker(generic_stub, methods)
+    def construct_invoker(self, generic_stub, dynamic_stub, methods):
+        return _MultiCallableInvoker(generic_stub, methods)
 
 
 class _DynamicInvoker(Invoker):
 
-  def __init__(self, dynamic_stubs, methods):
-    self._stubs = dynamic_stubs
-    self._methods = methods
+    def __init__(self, dynamic_stubs, methods):
+        self._stubs = dynamic_stubs
+        self._methods = methods
 
-  def blocking(self, group, name):
-    return getattr(self._stubs[group], name)
+    def blocking(self, group, name):
+        return getattr(self._stubs[group], name)
 
-  def future(self, group, name):
-    if self._methods[group, name].cardinality() in (
-        cardinality.Cardinality.UNARY_UNARY,
-        cardinality.Cardinality.STREAM_UNARY):
-      return getattr(self._stubs[group], name).future
-    else:
-      return getattr(self._stubs[group], name)
+    def future(self, group, name):
+        if self._methods[group, name].cardinality() in (
+                cardinality.Cardinality.UNARY_UNARY,
+                cardinality.Cardinality.STREAM_UNARY):
+            return getattr(self._stubs[group], name).future
+        else:
+            return getattr(self._stubs[group], name)
 
-  def event(self, group, name):
-    return getattr(self._stubs[group], name).event
+    def event(self, group, name):
+        return getattr(self._stubs[group], name).event
 
 
 class _DynamicInvokerConstructor(InvokerConstructor):
 
-  def name(self):
-    return 'DynamicInvoker'
+    def name(self):
+        return 'DynamicInvoker'
 
-  def construct_invoker(self, generic_stub, dynamic_stubs, methods):
-    return _DynamicInvoker(dynamic_stubs, methods)
+    def construct_invoker(self, generic_stub, dynamic_stubs, methods):
+        return _DynamicInvoker(dynamic_stubs, methods)
 
 
 def invoker_constructors():
-  """Creates a sequence of InvokerConstructors to use in tests of RPCs.
+    """Creates a sequence of InvokerConstructors to use in tests of RPCs.
 
   Returns:
     A sequence of InvokerConstructors.
   """
-  return (
-      _GenericInvokerConstructor(),
-      _MultiCallableInvokerConstructor(),
-      _DynamicInvokerConstructor(),
-  )
+    return (
+        _GenericInvokerConstructor(),
+        _MultiCallableInvokerConstructor(),
+        _DynamicInvokerConstructor(),)
diff --git a/src/python/grpcio_tests/tests/unit/framework/interfaces/face/_service.py b/src/python/grpcio_tests/tests/unit/framework/interfaces/face/_service.py
index f13dff0..f14ac6a 100644
--- a/src/python/grpcio_tests/tests/unit/framework/interfaces/face/_service.py
+++ b/src/python/grpcio_tests/tests/unit/framework/interfaces/face/_service.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Private interfaces implemented by data sets used in Face-layer tests."""
 
 import abc
@@ -38,12 +37,13 @@
 from tests.unit.framework.interfaces.face import test_interfaces
 
 
-class UnaryUnaryTestMethodImplementation(six.with_metaclass(abc.ABCMeta, test_interfaces.Method)):
-  """A controllable implementation of a unary-unary method."""
+class UnaryUnaryTestMethodImplementation(
+        six.with_metaclass(abc.ABCMeta, test_interfaces.Method)):
+    """A controllable implementation of a unary-unary method."""
 
-  @abc.abstractmethod
-  def service(self, request, response_callback, context, control):
-    """Services an RPC that accepts one message and produces one message.
+    @abc.abstractmethod
+    def service(self, request, response_callback, context, control):
+        """Services an RPC that accepts one message and produces one message.
 
     Args:
       request: The single request message for the RPC.
@@ -56,15 +56,15 @@
       abandonment.Abandoned: May or may not be raised when the RPC has been
         aborted.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
 class UnaryUnaryTestMessages(six.with_metaclass(abc.ABCMeta)):
-  """A type for unary-request-unary-response message pairings."""
+    """A type for unary-request-unary-response message pairings."""
 
-  @abc.abstractmethod
-  def request(self):
-    """Affords a request message.
+    @abc.abstractmethod
+    def request(self):
+        """Affords a request message.
 
     Implementations of this method should return a different message with each
     call so that multiple test executions of the test method may be made with
@@ -73,11 +73,11 @@
     Returns:
       A request message.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def verify(self, request, response, test_case):
-    """Verifies that the computed response matches the given request.
+    @abc.abstractmethod
+    def verify(self, request, response, test_case):
+        """Verifies that the computed response matches the given request.
 
     Args:
       request: A request message.
@@ -88,15 +88,16 @@
       AssertionError: If the request and response do not match, indicating that
         there was some problem executing the RPC under test.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
-class UnaryStreamTestMethodImplementation(six.with_metaclass(abc.ABCMeta, test_interfaces.Method)):
-  """A controllable implementation of a unary-stream method."""
+class UnaryStreamTestMethodImplementation(
+        six.with_metaclass(abc.ABCMeta, test_interfaces.Method)):
+    """A controllable implementation of a unary-stream method."""
 
-  @abc.abstractmethod
-  def service(self, request, response_consumer, context, control):
-    """Services an RPC that takes one message and produces a stream of messages.
+    @abc.abstractmethod
+    def service(self, request, response_consumer, context, control):
+        """Services an RPC that takes one message and produces a stream of messages.
 
     Args:
       request: The single request message for the RPC.
@@ -109,15 +110,15 @@
       abandonment.Abandoned: May or may not be raised when the RPC has been
         aborted.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
 class UnaryStreamTestMessages(six.with_metaclass(abc.ABCMeta)):
-  """A type for unary-request-stream-response message pairings."""
+    """A type for unary-request-stream-response message pairings."""
 
-  @abc.abstractmethod
-  def request(self):
-    """Affords a request message.
+    @abc.abstractmethod
+    def request(self):
+        """Affords a request message.
 
     Implementations of this method should return a different message with each
     call so that multiple test executions of the test method may be made with
@@ -126,11 +127,11 @@
     Returns:
       A request message.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def verify(self, request, responses, test_case):
-    """Verifies that the computed responses match the given request.
+    @abc.abstractmethod
+    def verify(self, request, responses, test_case):
+        """Verifies that the computed responses match the given request.
 
     Args:
       request: A request message.
@@ -141,15 +142,16 @@
       AssertionError: If the request and responses do not match, indicating that
         there was some problem executing the RPC under test.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
-class StreamUnaryTestMethodImplementation(six.with_metaclass(abc.ABCMeta, test_interfaces.Method)):
-  """A controllable implementation of a stream-unary method."""
+class StreamUnaryTestMethodImplementation(
+        six.with_metaclass(abc.ABCMeta, test_interfaces.Method)):
+    """A controllable implementation of a stream-unary method."""
 
-  @abc.abstractmethod
-  def service(self, response_callback, context, control):
-    """Services an RPC that takes a stream of messages and produces one message.
+    @abc.abstractmethod
+    def service(self, response_callback, context, control):
+        """Services an RPC that takes a stream of messages and produces one message.
 
     Args:
       response_callback: A callback to be called to accept the response message
@@ -169,15 +171,15 @@
       abandonment.Abandoned: May or may not be raised when the RPC has been
         aborted.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
 class StreamUnaryTestMessages(six.with_metaclass(abc.ABCMeta)):
-  """A type for stream-request-unary-response message pairings."""
+    """A type for stream-request-unary-response message pairings."""
 
-  @abc.abstractmethod
-  def requests(self):
-    """Affords a sequence of request messages.
+    @abc.abstractmethod
+    def requests(self):
+        """Affords a sequence of request messages.
 
     Implementations of this method should return a different sequences with each
     call so that multiple test executions of the test method may be made with
@@ -186,11 +188,11 @@
     Returns:
       A sequence of request messages.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def verify(self, requests, response, test_case):
-    """Verifies that the computed response matches the given requests.
+    @abc.abstractmethod
+    def verify(self, requests, response, test_case):
+        """Verifies that the computed response matches the given requests.
 
     Args:
       requests: A sequence of request messages.
@@ -201,15 +203,16 @@
       AssertionError: If the requests and response do not match, indicating that
         there was some problem executing the RPC under test.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
-class StreamStreamTestMethodImplementation(six.with_metaclass(abc.ABCMeta, test_interfaces.Method)):
-  """A controllable implementation of a stream-stream method."""
+class StreamStreamTestMethodImplementation(
+        six.with_metaclass(abc.ABCMeta, test_interfaces.Method)):
+    """A controllable implementation of a stream-stream method."""
 
-  @abc.abstractmethod
-  def service(self, response_consumer, context, control):
-    """Services an RPC that accepts and produces streams of messages.
+    @abc.abstractmethod
+    def service(self, response_consumer, context, control):
+        """Services an RPC that accepts and produces streams of messages.
 
     Args:
       response_consumer: A stream.Consumer to be called to accept the response
@@ -229,15 +232,15 @@
       abandonment.Abandoned: May or may not be raised when the RPC has been
         aborted.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
 class StreamStreamTestMessages(six.with_metaclass(abc.ABCMeta)):
-  """A type for stream-request-stream-response message pairings."""
+    """A type for stream-request-stream-response message pairings."""
 
-  @abc.abstractmethod
-  def requests(self):
-    """Affords a sequence of request messages.
+    @abc.abstractmethod
+    def requests(self):
+        """Affords a sequence of request messages.
 
     Implementations of this method should return a different sequences with each
     call so that multiple test executions of the test method may be made with
@@ -246,11 +249,11 @@
     Returns:
       A sequence of request messages.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def verify(self, requests, responses, test_case):
-    """Verifies that the computed response matches the given requests.
+    @abc.abstractmethod
+    def verify(self, requests, responses, test_case):
+        """Verifies that the computed response matches the given requests.
 
     Args:
       requests: A sequence of request messages.
@@ -261,15 +264,15 @@
       AssertionError: If the requests and responses do not match, indicating
         that there was some problem executing the RPC under test.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
 class TestService(six.with_metaclass(abc.ABCMeta)):
-  """A specification of implemented methods to use in tests."""
+    """A specification of implemented methods to use in tests."""
 
-  @abc.abstractmethod
-  def unary_unary_scenarios(self):
-    """Affords unary-request-unary-response test methods and their messages.
+    @abc.abstractmethod
+    def unary_unary_scenarios(self):
+        """Affords unary-request-unary-response test methods and their messages.
 
     Returns:
       A dict from method group-name pair to implementation/messages pair. The
@@ -277,11 +280,11 @@
         and the second element is a sequence of UnaryUnaryTestMethodMessages
         objects.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def unary_stream_scenarios(self):
-    """Affords unary-request-stream-response test methods and their messages.
+    @abc.abstractmethod
+    def unary_stream_scenarios(self):
+        """Affords unary-request-stream-response test methods and their messages.
 
     Returns:
       A dict from method group-name pair to implementation/messages pair. The
@@ -289,11 +292,11 @@
         object and the second element is a sequence of
         UnaryStreamTestMethodMessages objects.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def stream_unary_scenarios(self):
-    """Affords stream-request-unary-response test methods and their messages.
+    @abc.abstractmethod
+    def stream_unary_scenarios(self):
+        """Affords stream-request-unary-response test methods and their messages.
 
     Returns:
       A dict from method group-name pair to implementation/messages pair. The
@@ -301,11 +304,11 @@
         object and the second element is a sequence of
         StreamUnaryTestMethodMessages objects.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def stream_stream_scenarios(self):
-    """Affords stream-request-stream-response test methods and their messages.
+    @abc.abstractmethod
+    def stream_stream_scenarios(self):
+        """Affords stream-request-stream-response test methods and their messages.
 
     Returns:
       A dict from method group-name pair to implementation/messages pair. The
@@ -313,4 +316,4 @@
         object and the second element is a sequence of
         StreamStreamTestMethodMessages objects.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
diff --git a/src/python/grpcio_tests/tests/unit/framework/interfaces/face/_stock_service.py b/src/python/grpcio_tests/tests/unit/framework/interfaces/face/_stock_service.py
index 5299655..41a55c1 100644
--- a/src/python/grpcio_tests/tests/unit/framework/interfaces/face/_stock_service.py
+++ b/src/python/grpcio_tests/tests/unit/framework/interfaces/face/_stock_service.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Examples of Python implementations of the stock.proto Stock service."""
 
 from grpc.framework.common import cardinality
@@ -44,353 +43,363 @@
 
 
 def _get_last_trade_price(stock_request, stock_reply_callback, control, active):
-  """A unary-request, unary-response test method."""
-  control.control()
-  if active():
-    stock_reply_callback(
-        stock_pb2.StockReply(
-            symbol=stock_request.symbol, price=_price(stock_request.symbol)))
-  else:
-    raise abandonment.Abandoned()
+    """A unary-request, unary-response test method."""
+    control.control()
+    if active():
+        stock_reply_callback(
+            stock_pb2.StockReply(
+                symbol=stock_request.symbol, price=_price(
+                    stock_request.symbol)))
+    else:
+        raise abandonment.Abandoned()
 
 
 def _get_last_trade_price_multiple(stock_reply_consumer, control, active):
-  """A stream-request, stream-response test method."""
-  def stock_reply_for_stock_request(stock_request):
-    control.control()
-    if active():
-      return stock_pb2.StockReply(
-          symbol=stock_request.symbol, price=_price(stock_request.symbol))
-    else:
-      raise abandonment.Abandoned()
+    """A stream-request, stream-response test method."""
 
-  class StockRequestConsumer(stream.Consumer):
+    def stock_reply_for_stock_request(stock_request):
+        control.control()
+        if active():
+            return stock_pb2.StockReply(
+                symbol=stock_request.symbol, price=_price(stock_request.symbol))
+        else:
+            raise abandonment.Abandoned()
 
-    def consume(self, stock_request):
-      stock_reply_consumer.consume(stock_reply_for_stock_request(stock_request))
+    class StockRequestConsumer(stream.Consumer):
 
-    def terminate(self):
-      control.control()
-      stock_reply_consumer.terminate()
+        def consume(self, stock_request):
+            stock_reply_consumer.consume(
+                stock_reply_for_stock_request(stock_request))
 
-    def consume_and_terminate(self, stock_request):
-      stock_reply_consumer.consume_and_terminate(
-          stock_reply_for_stock_request(stock_request))
+        def terminate(self):
+            control.control()
+            stock_reply_consumer.terminate()
 
-  return StockRequestConsumer()
+        def consume_and_terminate(self, stock_request):
+            stock_reply_consumer.consume_and_terminate(
+                stock_reply_for_stock_request(stock_request))
+
+    return StockRequestConsumer()
 
 
 def _watch_future_trades(stock_request, stock_reply_consumer, control, active):
-  """A unary-request, stream-response test method."""
-  base_price = _price(stock_request.symbol)
-  for index in range(stock_request.num_trades_to_watch):
-    control.control()
-    if active():
-      stock_reply_consumer.consume(
-          stock_pb2.StockReply(
-              symbol=stock_request.symbol, price=base_price + index))
-    else:
-      raise abandonment.Abandoned()
-  stock_reply_consumer.terminate()
+    """A unary-request, stream-response test method."""
+    base_price = _price(stock_request.symbol)
+    for index in range(stock_request.num_trades_to_watch):
+        control.control()
+        if active():
+            stock_reply_consumer.consume(
+                stock_pb2.StockReply(
+                    symbol=stock_request.symbol, price=base_price + index))
+        else:
+            raise abandonment.Abandoned()
+    stock_reply_consumer.terminate()
 
 
 def _get_highest_trade_price(stock_reply_callback, control, active):
-  """A stream-request, unary-response test method."""
+    """A stream-request, unary-response test method."""
 
-  class StockRequestConsumer(stream.Consumer):
-    """Keeps an ongoing record of the most valuable symbol yet consumed."""
+    class StockRequestConsumer(stream.Consumer):
+        """Keeps an ongoing record of the most valuable symbol yet consumed."""
 
-    def __init__(self):
-      self._symbol = None
-      self._price = None
+        def __init__(self):
+            self._symbol = None
+            self._price = None
 
-    def consume(self, stock_request):
-      control.control()
-      if active():
-        if self._price is None:
-          self._symbol = stock_request.symbol
-          self._price = _price(stock_request.symbol)
-        else:
-          candidate_price = _price(stock_request.symbol)
-          if self._price < candidate_price:
-            self._symbol = stock_request.symbol
-            self._price = candidate_price
+        def consume(self, stock_request):
+            control.control()
+            if active():
+                if self._price is None:
+                    self._symbol = stock_request.symbol
+                    self._price = _price(stock_request.symbol)
+                else:
+                    candidate_price = _price(stock_request.symbol)
+                    if self._price < candidate_price:
+                        self._symbol = stock_request.symbol
+                        self._price = candidate_price
 
-    def terminate(self):
-      control.control()
-      if active():
-        if self._symbol is None:
-          raise ValueError()
-        else:
-          stock_reply_callback(
-              stock_pb2.StockReply(symbol=self._symbol, price=self._price))
-          self._symbol = None
-          self._price = None
+        def terminate(self):
+            control.control()
+            if active():
+                if self._symbol is None:
+                    raise ValueError()
+                else:
+                    stock_reply_callback(
+                        stock_pb2.StockReply(
+                            symbol=self._symbol, price=self._price))
+                    self._symbol = None
+                    self._price = None
 
-    def consume_and_terminate(self, stock_request):
-      control.control()
-      if active():
-        if self._price is None:
-          stock_reply_callback(
-              stock_pb2.StockReply(
-                  symbol=stock_request.symbol,
-                  price=_price(stock_request.symbol)))
-        else:
-          candidate_price = _price(stock_request.symbol)
-          if self._price < candidate_price:
-            stock_reply_callback(
-                stock_pb2.StockReply(
-                    symbol=stock_request.symbol, price=candidate_price))
-          else:
-            stock_reply_callback(
-                stock_pb2.StockReply(
-                    symbol=self._symbol, price=self._price))
+        def consume_and_terminate(self, stock_request):
+            control.control()
+            if active():
+                if self._price is None:
+                    stock_reply_callback(
+                        stock_pb2.StockReply(
+                            symbol=stock_request.symbol,
+                            price=_price(stock_request.symbol)))
+                else:
+                    candidate_price = _price(stock_request.symbol)
+                    if self._price < candidate_price:
+                        stock_reply_callback(
+                            stock_pb2.StockReply(
+                                symbol=stock_request.symbol,
+                                price=candidate_price))
+                    else:
+                        stock_reply_callback(
+                            stock_pb2.StockReply(
+                                symbol=self._symbol, price=self._price))
 
-        self._symbol = None
-        self._price = None
+                self._symbol = None
+                self._price = None
 
-  return StockRequestConsumer()
+    return StockRequestConsumer()
 
 
 class GetLastTradePrice(_service.UnaryUnaryTestMethodImplementation):
-  """GetLastTradePrice for use in tests."""
+    """GetLastTradePrice for use in tests."""
 
-  def group(self):
-    return _STOCK_GROUP_NAME
+    def group(self):
+        return _STOCK_GROUP_NAME
 
-  def name(self):
-    return 'GetLastTradePrice'
+    def name(self):
+        return 'GetLastTradePrice'
 
-  def cardinality(self):
-    return cardinality.Cardinality.UNARY_UNARY
+    def cardinality(self):
+        return cardinality.Cardinality.UNARY_UNARY
 
-  def request_class(self):
-    return stock_pb2.StockRequest
+    def request_class(self):
+        return stock_pb2.StockRequest
 
-  def response_class(self):
-    return stock_pb2.StockReply
+    def response_class(self):
+        return stock_pb2.StockReply
 
-  def serialize_request(self, request):
-    return request.SerializeToString()
+    def serialize_request(self, request):
+        return request.SerializeToString()
 
-  def deserialize_request(self, serialized_request):
-    return stock_pb2.StockRequest.FromString(serialized_request)
+    def deserialize_request(self, serialized_request):
+        return stock_pb2.StockRequest.FromString(serialized_request)
 
-  def serialize_response(self, response):
-    return response.SerializeToString()
+    def serialize_response(self, response):
+        return response.SerializeToString()
 
-  def deserialize_response(self, serialized_response):
-    return stock_pb2.StockReply.FromString(serialized_response)
+    def deserialize_response(self, serialized_response):
+        return stock_pb2.StockReply.FromString(serialized_response)
 
-  def service(self, request, response_callback, context, control):
-    _get_last_trade_price(
-        request, response_callback, control, context.is_active)
+    def service(self, request, response_callback, context, control):
+        _get_last_trade_price(request, response_callback, control,
+                              context.is_active)
 
 
 class GetLastTradePriceMessages(_service.UnaryUnaryTestMessages):
 
-  def __init__(self):
-    self._index = 0
+    def __init__(self):
+        self._index = 0
 
-  def request(self):
-    symbol = _SYMBOL_FORMAT % self._index
-    self._index += 1
-    return stock_pb2.StockRequest(symbol=symbol)
+    def request(self):
+        symbol = _SYMBOL_FORMAT % self._index
+        self._index += 1
+        return stock_pb2.StockRequest(symbol=symbol)
 
-  def verify(self, request, response, test_case):
-    test_case.assertEqual(request.symbol, response.symbol)
-    test_case.assertEqual(_price(request.symbol), response.price)
+    def verify(self, request, response, test_case):
+        test_case.assertEqual(request.symbol, response.symbol)
+        test_case.assertEqual(_price(request.symbol), response.price)
 
 
 class GetLastTradePriceMultiple(_service.StreamStreamTestMethodImplementation):
-  """GetLastTradePriceMultiple for use in tests."""
+    """GetLastTradePriceMultiple for use in tests."""
 
-  def group(self):
-    return _STOCK_GROUP_NAME
+    def group(self):
+        return _STOCK_GROUP_NAME
 
-  def name(self):
-    return 'GetLastTradePriceMultiple'
+    def name(self):
+        return 'GetLastTradePriceMultiple'
 
-  def cardinality(self):
-    return cardinality.Cardinality.STREAM_STREAM
+    def cardinality(self):
+        return cardinality.Cardinality.STREAM_STREAM
 
-  def request_class(self):
-    return stock_pb2.StockRequest
+    def request_class(self):
+        return stock_pb2.StockRequest
 
-  def response_class(self):
-    return stock_pb2.StockReply
+    def response_class(self):
+        return stock_pb2.StockReply
 
-  def serialize_request(self, request):
-    return request.SerializeToString()
+    def serialize_request(self, request):
+        return request.SerializeToString()
 
-  def deserialize_request(self, serialized_request):
-    return stock_pb2.StockRequest.FromString(serialized_request)
+    def deserialize_request(self, serialized_request):
+        return stock_pb2.StockRequest.FromString(serialized_request)
 
-  def serialize_response(self, response):
-    return response.SerializeToString()
+    def serialize_response(self, response):
+        return response.SerializeToString()
 
-  def deserialize_response(self, serialized_response):
-    return stock_pb2.StockReply.FromString(serialized_response)
+    def deserialize_response(self, serialized_response):
+        return stock_pb2.StockReply.FromString(serialized_response)
 
-  def service(self, response_consumer, context, control):
-    return _get_last_trade_price_multiple(
-        response_consumer, control, context.is_active)
+    def service(self, response_consumer, context, control):
+        return _get_last_trade_price_multiple(response_consumer, control,
+                                              context.is_active)
 
 
 class GetLastTradePriceMultipleMessages(_service.StreamStreamTestMessages):
-  """Pairs of message streams for use with GetLastTradePriceMultiple."""
+    """Pairs of message streams for use with GetLastTradePriceMultiple."""
 
-  def __init__(self):
-    self._index = 0
+    def __init__(self):
+        self._index = 0
 
-  def requests(self):
-    base_index = self._index
-    self._index += 1
-    return [
-        stock_pb2.StockRequest(symbol=_SYMBOL_FORMAT % (base_index + index))
-        for index in range(test_constants.STREAM_LENGTH)]
+    def requests(self):
+        base_index = self._index
+        self._index += 1
+        return [
+            stock_pb2.StockRequest(symbol=_SYMBOL_FORMAT % (base_index + index))
+            for index in range(test_constants.STREAM_LENGTH)
+        ]
 
-  def verify(self, requests, responses, test_case):
-    test_case.assertEqual(len(requests), len(responses))
-    for stock_request, stock_reply in zip(requests, responses):
-      test_case.assertEqual(stock_request.symbol, stock_reply.symbol)
-      test_case.assertEqual(_price(stock_request.symbol), stock_reply.price)
+    def verify(self, requests, responses, test_case):
+        test_case.assertEqual(len(requests), len(responses))
+        for stock_request, stock_reply in zip(requests, responses):
+            test_case.assertEqual(stock_request.symbol, stock_reply.symbol)
+            test_case.assertEqual(
+                _price(stock_request.symbol), stock_reply.price)
 
 
 class WatchFutureTrades(_service.UnaryStreamTestMethodImplementation):
-  """WatchFutureTrades for use in tests."""
+    """WatchFutureTrades for use in tests."""
 
-  def group(self):
-    return _STOCK_GROUP_NAME
+    def group(self):
+        return _STOCK_GROUP_NAME
 
-  def name(self):
-    return 'WatchFutureTrades'
+    def name(self):
+        return 'WatchFutureTrades'
 
-  def cardinality(self):
-    return cardinality.Cardinality.UNARY_STREAM
+    def cardinality(self):
+        return cardinality.Cardinality.UNARY_STREAM
 
-  def request_class(self):
-    return stock_pb2.StockRequest
+    def request_class(self):
+        return stock_pb2.StockRequest
 
-  def response_class(self):
-    return stock_pb2.StockReply
+    def response_class(self):
+        return stock_pb2.StockReply
 
-  def serialize_request(self, request):
-    return request.SerializeToString()
+    def serialize_request(self, request):
+        return request.SerializeToString()
 
-  def deserialize_request(self, serialized_request):
-    return stock_pb2.StockRequest.FromString(serialized_request)
+    def deserialize_request(self, serialized_request):
+        return stock_pb2.StockRequest.FromString(serialized_request)
 
-  def serialize_response(self, response):
-    return response.SerializeToString()
+    def serialize_response(self, response):
+        return response.SerializeToString()
 
-  def deserialize_response(self, serialized_response):
-    return stock_pb2.StockReply.FromString(serialized_response)
+    def deserialize_response(self, serialized_response):
+        return stock_pb2.StockReply.FromString(serialized_response)
 
-  def service(self, request, response_consumer, context, control):
-    _watch_future_trades(request, response_consumer, control, context.is_active)
+    def service(self, request, response_consumer, context, control):
+        _watch_future_trades(request, response_consumer, control,
+                             context.is_active)
 
 
 class WatchFutureTradesMessages(_service.UnaryStreamTestMessages):
-  """Pairs of a single request message and a sequence of response messages."""
+    """Pairs of a single request message and a sequence of response messages."""
 
-  def __init__(self):
-    self._index = 0
+    def __init__(self):
+        self._index = 0
 
-  def request(self):
-    symbol = _SYMBOL_FORMAT % self._index
-    self._index += 1
-    return stock_pb2.StockRequest(
-        symbol=symbol, num_trades_to_watch=test_constants.STREAM_LENGTH)
+    def request(self):
+        symbol = _SYMBOL_FORMAT % self._index
+        self._index += 1
+        return stock_pb2.StockRequest(
+            symbol=symbol, num_trades_to_watch=test_constants.STREAM_LENGTH)
 
-  def verify(self, request, responses, test_case):
-    test_case.assertEqual(test_constants.STREAM_LENGTH, len(responses))
-    base_price = _price(request.symbol)
-    for index, response in enumerate(responses):
-      test_case.assertEqual(base_price + index, response.price)
+    def verify(self, request, responses, test_case):
+        test_case.assertEqual(test_constants.STREAM_LENGTH, len(responses))
+        base_price = _price(request.symbol)
+        for index, response in enumerate(responses):
+            test_case.assertEqual(base_price + index, response.price)
 
 
 class GetHighestTradePrice(_service.StreamUnaryTestMethodImplementation):
-  """GetHighestTradePrice for use in tests."""
+    """GetHighestTradePrice for use in tests."""
 
-  def group(self):
-    return _STOCK_GROUP_NAME
+    def group(self):
+        return _STOCK_GROUP_NAME
 
-  def name(self):
-    return 'GetHighestTradePrice'
+    def name(self):
+        return 'GetHighestTradePrice'
 
-  def cardinality(self):
-    return cardinality.Cardinality.STREAM_UNARY
+    def cardinality(self):
+        return cardinality.Cardinality.STREAM_UNARY
 
-  def request_class(self):
-    return stock_pb2.StockRequest
+    def request_class(self):
+        return stock_pb2.StockRequest
 
-  def response_class(self):
-    return stock_pb2.StockReply
+    def response_class(self):
+        return stock_pb2.StockReply
 
-  def serialize_request(self, request):
-    return request.SerializeToString()
+    def serialize_request(self, request):
+        return request.SerializeToString()
 
-  def deserialize_request(self, serialized_request):
-    return stock_pb2.StockRequest.FromString(serialized_request)
+    def deserialize_request(self, serialized_request):
+        return stock_pb2.StockRequest.FromString(serialized_request)
 
-  def serialize_response(self, response):
-    return response.SerializeToString()
+    def serialize_response(self, response):
+        return response.SerializeToString()
 
-  def deserialize_response(self, serialized_response):
-    return stock_pb2.StockReply.FromString(serialized_response)
+    def deserialize_response(self, serialized_response):
+        return stock_pb2.StockReply.FromString(serialized_response)
 
-  def service(self, response_callback, context, control):
-    return _get_highest_trade_price(
-        response_callback, control, context.is_active)
+    def service(self, response_callback, context, control):
+        return _get_highest_trade_price(response_callback, control,
+                                        context.is_active)
 
 
 class GetHighestTradePriceMessages(_service.StreamUnaryTestMessages):
 
-  def requests(self):
-    return [
-        stock_pb2.StockRequest(symbol=_SYMBOL_FORMAT % index)
-        for index in range(test_constants.STREAM_LENGTH)]
+    def requests(self):
+        return [
+            stock_pb2.StockRequest(symbol=_SYMBOL_FORMAT % index)
+            for index in range(test_constants.STREAM_LENGTH)
+        ]
 
-  def verify(self, requests, response, test_case):
-    price = None
-    symbol = None
-    for stock_request in requests:
-      current_symbol = stock_request.symbol
-      current_price = _price(current_symbol)
-      if price is None or price < current_price:
-        price = current_price
-        symbol = current_symbol
-    test_case.assertEqual(price, response.price)
-    test_case.assertEqual(symbol, response.symbol)
+    def verify(self, requests, response, test_case):
+        price = None
+        symbol = None
+        for stock_request in requests:
+            current_symbol = stock_request.symbol
+            current_price = _price(current_symbol)
+            if price is None or price < current_price:
+                price = current_price
+                symbol = current_symbol
+        test_case.assertEqual(price, response.price)
+        test_case.assertEqual(symbol, response.symbol)
 
 
 class StockTestService(_service.TestService):
-  """A corpus of test data with one method of each RPC cardinality."""
+    """A corpus of test data with one method of each RPC cardinality."""
 
-  def unary_unary_scenarios(self):
-    return {
-        (_STOCK_GROUP_NAME, 'GetLastTradePrice'): (
-            GetLastTradePrice(), [GetLastTradePriceMessages()]),
-    }
+    def unary_unary_scenarios(self):
+        return {
+            (_STOCK_GROUP_NAME, 'GetLastTradePrice'):
+            (GetLastTradePrice(), [GetLastTradePriceMessages()]),
+        }
 
-  def unary_stream_scenarios(self):
-    return {
-        (_STOCK_GROUP_NAME, 'WatchFutureTrades'): (
-            WatchFutureTrades(), [WatchFutureTradesMessages()]),
-    }
+    def unary_stream_scenarios(self):
+        return {
+            (_STOCK_GROUP_NAME, 'WatchFutureTrades'):
+            (WatchFutureTrades(), [WatchFutureTradesMessages()]),
+        }
 
-  def stream_unary_scenarios(self):
-    return {
-        (_STOCK_GROUP_NAME, 'GetHighestTradePrice'): (
-            GetHighestTradePrice(), [GetHighestTradePriceMessages()])
-    }
+    def stream_unary_scenarios(self):
+        return {
+            (_STOCK_GROUP_NAME, 'GetHighestTradePrice'):
+            (GetHighestTradePrice(), [GetHighestTradePriceMessages()])
+        }
 
-  def stream_stream_scenarios(self):
-    return {
-        (_STOCK_GROUP_NAME, 'GetLastTradePriceMultiple'): (
-            GetLastTradePriceMultiple(), [GetLastTradePriceMultipleMessages()]),
-    }
+    def stream_stream_scenarios(self):
+        return {
+            (_STOCK_GROUP_NAME, 'GetLastTradePriceMultiple'):
+            (GetLastTradePriceMultiple(),
+             [GetLastTradePriceMultipleMessages()]),
+        }
 
 
 STOCK_TEST_SERVICE = StockTestService()
diff --git a/src/python/grpcio_tests/tests/unit/framework/interfaces/face/test_cases.py b/src/python/grpcio_tests/tests/unit/framework/interfaces/face/test_cases.py
index 71de9d8..d84e1fc 100644
--- a/src/python/grpcio_tests/tests/unit/framework/interfaces/face/test_cases.py
+++ b/src/python/grpcio_tests/tests/unit/framework/interfaces/face/test_cases.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Tools for creating tests of implementations of the Face layer."""
 
 # unittest is referenced from specification in this module.
@@ -40,12 +39,11 @@
 
 _TEST_CASE_SUPERCLASSES = (
     _blocking_invocation_inline_service.TestCase,
-    _future_invocation_asynchronous_event_service.TestCase,
-)
+    _future_invocation_asynchronous_event_service.TestCase,)
 
 
 def test_cases(implementation):
-  """Creates unittest.TestCase classes for a given Face layer implementation.
+    """Creates unittest.TestCase classes for a given Face layer implementation.
 
   Args:
     implementation: A test_interfaces.Implementation specifying creation and
@@ -55,13 +53,14 @@
     A sequence of subclasses of unittest.TestCase defining tests of the
       specified Face layer implementation.
   """
-  test_case_classes = []
-  for invoker_constructor in _invocation.invoker_constructors():
-    for super_class in _TEST_CASE_SUPERCLASSES:
-      test_case_classes.append(
-          type(invoker_constructor.name() + super_class.NAME, (super_class,),
-               {'implementation': implementation,
-                'invoker_constructor': invoker_constructor,
-                '__module__': implementation.__module__,
-               }))
-  return test_case_classes
+    test_case_classes = []
+    for invoker_constructor in _invocation.invoker_constructors():
+        for super_class in _TEST_CASE_SUPERCLASSES:
+            test_case_classes.append(
+                type(invoker_constructor.name() + super_class.NAME, (
+                    super_class,), {
+                        'implementation': implementation,
+                        'invoker_constructor': invoker_constructor,
+                        '__module__': implementation.__module__,
+                    }))
+    return test_case_classes
diff --git a/src/python/grpcio_tests/tests/unit/framework/interfaces/face/test_interfaces.py b/src/python/grpcio_tests/tests/unit/framework/interfaces/face/test_interfaces.py
index 40f38e6..a789d43 100644
--- a/src/python/grpcio_tests/tests/unit/framework/interfaces/face/test_interfaces.py
+++ b/src/python/grpcio_tests/tests/unit/framework/interfaces/face/test_interfaces.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Interfaces used in tests of implementations of the Face layer."""
 
 import abc
@@ -38,103 +37,102 @@
 
 
 class Method(six.with_metaclass(abc.ABCMeta)):
-  """Specifies a method to be used in tests."""
+    """Specifies a method to be used in tests."""
 
-  @abc.abstractmethod
-  def group(self):
-    """Identify the group of the method.
+    @abc.abstractmethod
+    def group(self):
+        """Identify the group of the method.
 
     Returns:
       The group of the method.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def name(self):
-    """Identify the name of the method.
+    @abc.abstractmethod
+    def name(self):
+        """Identify the name of the method.
 
     Returns:
       The name of the method.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def cardinality(self):
-    """Identify the cardinality of the method.
+    @abc.abstractmethod
+    def cardinality(self):
+        """Identify the cardinality of the method.
 
     Returns:
       A cardinality.Cardinality value describing the streaming semantics of the
         method.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def request_class(self):
-    """Identify the class used for the method's request objects.
+    @abc.abstractmethod
+    def request_class(self):
+        """Identify the class used for the method's request objects.
 
     Returns:
       The class object of the class to which the method's request objects
         belong.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def response_class(self):
-    """Identify the class used for the method's response objects.
+    @abc.abstractmethod
+    def response_class(self):
+        """Identify the class used for the method's response objects.
 
     Returns:
       The class object of the class to which the method's response objects
         belong.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def serialize_request(self, request):
-    """Serialize the given request object.
+    @abc.abstractmethod
+    def serialize_request(self, request):
+        """Serialize the given request object.
 
     Args:
       request: A request object appropriate for this method.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def deserialize_request(self, serialized_request):
-    """Synthesize a request object from a given bytestring.
+    @abc.abstractmethod
+    def deserialize_request(self, serialized_request):
+        """Synthesize a request object from a given bytestring.
 
     Args:
       serialized_request: A bytestring deserializable into a request object
         appropriate for this method.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def serialize_response(self, response):
-    """Serialize the given response object.
+    @abc.abstractmethod
+    def serialize_response(self, response):
+        """Serialize the given response object.
 
     Args:
       response: A response object appropriate for this method.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def deserialize_response(self, serialized_response):
-    """Synthesize a response object from a given bytestring.
+    @abc.abstractmethod
+    def deserialize_response(self, serialized_response):
+        """Synthesize a response object from a given bytestring.
 
     Args:
       serialized_response: A bytestring deserializable into a response object
         appropriate for this method.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
 
 class Implementation(six.with_metaclass(abc.ABCMeta)):
-  """Specifies an implementation of the Face layer."""
+    """Specifies an implementation of the Face layer."""
 
-  @abc.abstractmethod
-  def instantiate(
-      self, methods, method_implementations,
-      multi_method_implementation):
-    """Instantiates the Face layer implementation to be used in a test.
+    @abc.abstractmethod
+    def instantiate(self, methods, method_implementations,
+                    multi_method_implementation):
+        """Instantiates the Face layer implementation to be used in a test.
 
     Args:
       methods: A sequence of Method objects describing the methods available to
@@ -151,69 +149,69 @@
         passed to destantiate at the conclusion of the test. The returned stubs
         must be backed by the provided implementations.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def destantiate(self, memo):
-    """Destroys the Face layer implementation under test.
+    @abc.abstractmethod
+    def destantiate(self, memo):
+        """Destroys the Face layer implementation under test.
 
     Args:
       memo: The object from the third position of the return value of a call to
         instantiate.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def invocation_metadata(self):
-    """Provides the metadata to be used when invoking a test RPC.
+    @abc.abstractmethod
+    def invocation_metadata(self):
+        """Provides the metadata to be used when invoking a test RPC.
 
     Returns:
       An object to use as the supplied-at-invocation-time metadata in a test
         RPC.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def initial_metadata(self):
-    """Provides the metadata for use as a test RPC's first servicer metadata.
+    @abc.abstractmethod
+    def initial_metadata(self):
+        """Provides the metadata for use as a test RPC's first servicer metadata.
 
     Returns:
       An object to use as the from-the-servicer-before-responses metadata in a
         test RPC.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def terminal_metadata(self):
-    """Provides the metadata for use as a test RPC's second servicer metadata.
+    @abc.abstractmethod
+    def terminal_metadata(self):
+        """Provides the metadata for use as a test RPC's second servicer metadata.
 
     Returns:
       An object to use as the from-the-servicer-after-all-responses metadata in
         a test RPC.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def code(self):
-    """Provides the value for use as a test RPC's code.
+    @abc.abstractmethod
+    def code(self):
+        """Provides the value for use as a test RPC's code.
 
     Returns:
       An object to use as the from-the-servicer code in a test RPC.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def details(self):
-    """Provides the value for use as a test RPC's details.
+    @abc.abstractmethod
+    def details(self):
+        """Provides the value for use as a test RPC's details.
 
     Returns:
       An object to use as the from-the-servicer details in a test RPC.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
 
-  @abc.abstractmethod
-  def metadata_transmitted(self, original_metadata, transmitted_metadata):
-    """Identifies whether or not metadata was properly transmitted.
+    @abc.abstractmethod
+    def metadata_transmitted(self, original_metadata, transmitted_metadata):
+        """Identifies whether or not metadata was properly transmitted.
 
     Args:
       original_metadata: A metadata value passed to the Face interface
@@ -226,4 +224,4 @@
       Whether or not the metadata was properly transmitted by the Face interface
         implementation under test.
     """
-    raise NotImplementedError()
+        raise NotImplementedError()
diff --git a/src/python/grpcio_tests/tests/unit/resources.py b/src/python/grpcio_tests/tests/unit/resources.py
index 023cdb1..55a2fff 100644
--- a/src/python/grpcio_tests/tests/unit/resources.py
+++ b/src/python/grpcio_tests/tests/unit/resources.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Constants and functions for data used in interoperability testing."""
 
 import os
@@ -39,14 +38,14 @@
 
 
 def test_root_certificates():
-  return pkg_resources.resource_string(
-      __name__, _ROOT_CERTIFICATES_RESOURCE_PATH)
+    return pkg_resources.resource_string(__name__,
+                                         _ROOT_CERTIFICATES_RESOURCE_PATH)
 
 
 def private_key():
-  return pkg_resources.resource_string(__name__, _PRIVATE_KEY_RESOURCE_PATH)
+    return pkg_resources.resource_string(__name__, _PRIVATE_KEY_RESOURCE_PATH)
 
 
 def certificate_chain():
-  return pkg_resources.resource_string(
-      __name__, _CERTIFICATE_CHAIN_RESOURCE_PATH)
+    return pkg_resources.resource_string(__name__,
+                                         _CERTIFICATE_CHAIN_RESOURCE_PATH)
diff --git a/src/python/grpcio_tests/tests/unit/test_common.py b/src/python/grpcio_tests/tests/unit/test_common.py
index cd71bd8..00fbe05 100644
--- a/src/python/grpcio_tests/tests/unit/test_common.py
+++ b/src/python/grpcio_tests/tests/unit/test_common.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Common code used throughout tests of gRPC."""
 
 import collections
@@ -34,14 +33,23 @@
 import grpc
 import six
 
-INVOCATION_INITIAL_METADATA = (('0', 'abc'), ('1', 'def'), ('2', 'ghi'),)
-SERVICE_INITIAL_METADATA = (('3', 'jkl'), ('4', 'mno'), ('5', 'pqr'),)
-SERVICE_TERMINAL_METADATA = (('6', 'stu'), ('7', 'vwx'), ('8', 'yza'),)
+INVOCATION_INITIAL_METADATA = (
+    ('0', 'abc'),
+    ('1', 'def'),
+    ('2', 'ghi'),)
+SERVICE_INITIAL_METADATA = (
+    ('3', 'jkl'),
+    ('4', 'mno'),
+    ('5', 'pqr'),)
+SERVICE_TERMINAL_METADATA = (
+    ('6', 'stu'),
+    ('7', 'vwx'),
+    ('8', 'yza'),)
 DETAILS = 'test details'
 
 
 def metadata_transmitted(original_metadata, transmitted_metadata):
-  """Judges whether or not metadata was acceptably transmitted.
+    """Judges whether or not metadata was acceptably transmitted.
 
   gRPC is allowed to insert key-value pairs into the metadata values given by
   applications and to reorder key-value pairs with different keys but it is not
@@ -59,31 +67,30 @@
      A boolean indicating whether transmitted_metadata accurately reflects
       original_metadata after having been transmitted via gRPC.
   """
-  original = collections.defaultdict(list)
-  for key, value in original_metadata:
-    original[key].append(value)
-  transmitted = collections.defaultdict(list)
-  for key, value in transmitted_metadata:
-    transmitted[key].append(value)
+    original = collections.defaultdict(list)
+    for key, value in original_metadata:
+        original[key].append(value)
+    transmitted = collections.defaultdict(list)
+    for key, value in transmitted_metadata:
+        transmitted[key].append(value)
 
-  for key, values in six.iteritems(original):
-    transmitted_values = transmitted[key]
-    transmitted_iterator = iter(transmitted_values)
-    try:
-      for value in values:
-        while True:
-          transmitted_value = next(transmitted_iterator)
-          if value == transmitted_value:
-            break
-    except StopIteration:
-      return False
-  else:
-    return True
+    for key, values in six.iteritems(original):
+        transmitted_values = transmitted[key]
+        transmitted_iterator = iter(transmitted_values)
+        try:
+            for value in values:
+                while True:
+                    transmitted_value = next(transmitted_iterator)
+                    if value == transmitted_value:
+                        break
+        except StopIteration:
+            return False
+    else:
+        return True
 
 
-def test_secure_channel(
-    target, channel_credentials, server_host_override):
-  """Creates an insecure Channel to a remote host.
+def test_secure_channel(target, channel_credentials, server_host_override):
+    """Creates an insecure Channel to a remote host.
 
   Args:
     host: The name of the remote host to which to connect.
@@ -96,7 +103,7 @@
     An implementations.Channel to the remote host through which RPCs may be
       conducted.
   """
-  channel = grpc.secure_channel(
-      target, channel_credentials,
-      (('grpc.ssl_target_name_override', server_host_override,),))
-  return channel
+    channel = grpc.secure_channel(target, channel_credentials, ((
+        'grpc.ssl_target_name_override',
+        server_host_override,),))
+    return channel
diff --git a/src/ruby/ext/grpc/rb_grpc_imports.generated.c b/src/ruby/ext/grpc/rb_grpc_imports.generated.c
index 6c36df9..b2d536e 100644
--- a/src/ruby/ext/grpc/rb_grpc_imports.generated.c
+++ b/src/ruby/ext/grpc/rb_grpc_imports.generated.c
@@ -202,7 +202,9 @@
 grpc_slice_buffer_move_into_type grpc_slice_buffer_move_into_import;
 grpc_slice_buffer_trim_end_type grpc_slice_buffer_trim_end_import;
 grpc_slice_buffer_move_first_type grpc_slice_buffer_move_first_import;
+grpc_slice_buffer_move_first_into_buffer_type grpc_slice_buffer_move_first_into_buffer_import;
 grpc_slice_buffer_take_first_type grpc_slice_buffer_take_first_import;
+grpc_slice_buffer_undo_take_first_type grpc_slice_buffer_undo_take_first_import;
 gpr_malloc_type gpr_malloc_import;
 gpr_free_type gpr_free_import;
 gpr_realloc_type gpr_realloc_import;
@@ -478,7 +480,9 @@
   grpc_slice_buffer_move_into_import = (grpc_slice_buffer_move_into_type) GetProcAddress(library, "grpc_slice_buffer_move_into");
   grpc_slice_buffer_trim_end_import = (grpc_slice_buffer_trim_end_type) GetProcAddress(library, "grpc_slice_buffer_trim_end");
   grpc_slice_buffer_move_first_import = (grpc_slice_buffer_move_first_type) GetProcAddress(library, "grpc_slice_buffer_move_first");
+  grpc_slice_buffer_move_first_into_buffer_import = (grpc_slice_buffer_move_first_into_buffer_type) GetProcAddress(library, "grpc_slice_buffer_move_first_into_buffer");
   grpc_slice_buffer_take_first_import = (grpc_slice_buffer_take_first_type) GetProcAddress(library, "grpc_slice_buffer_take_first");
+  grpc_slice_buffer_undo_take_first_import = (grpc_slice_buffer_undo_take_first_type) GetProcAddress(library, "grpc_slice_buffer_undo_take_first");
   gpr_malloc_import = (gpr_malloc_type) GetProcAddress(library, "gpr_malloc");
   gpr_free_import = (gpr_free_type) GetProcAddress(library, "gpr_free");
   gpr_realloc_import = (gpr_realloc_type) GetProcAddress(library, "gpr_realloc");
diff --git a/src/ruby/ext/grpc/rb_grpc_imports.generated.h b/src/ruby/ext/grpc/rb_grpc_imports.generated.h
index 5745686..4f496b7 100644
--- a/src/ruby/ext/grpc/rb_grpc_imports.generated.h
+++ b/src/ruby/ext/grpc/rb_grpc_imports.generated.h
@@ -557,9 +557,15 @@
 typedef void(*grpc_slice_buffer_move_first_type)(grpc_slice_buffer *src, size_t n, grpc_slice_buffer *dst);
 extern grpc_slice_buffer_move_first_type grpc_slice_buffer_move_first_import;
 #define grpc_slice_buffer_move_first grpc_slice_buffer_move_first_import
+typedef void(*grpc_slice_buffer_move_first_into_buffer_type)(grpc_exec_ctx *exec_ctx, grpc_slice_buffer *src, size_t n, void *dst);
+extern grpc_slice_buffer_move_first_into_buffer_type grpc_slice_buffer_move_first_into_buffer_import;
+#define grpc_slice_buffer_move_first_into_buffer grpc_slice_buffer_move_first_into_buffer_import
 typedef grpc_slice(*grpc_slice_buffer_take_first_type)(grpc_slice_buffer *src);
 extern grpc_slice_buffer_take_first_type grpc_slice_buffer_take_first_import;
 #define grpc_slice_buffer_take_first grpc_slice_buffer_take_first_import
+typedef void(*grpc_slice_buffer_undo_take_first_type)(grpc_slice_buffer *src, grpc_slice slice);
+extern grpc_slice_buffer_undo_take_first_type grpc_slice_buffer_undo_take_first_import;
+#define grpc_slice_buffer_undo_take_first grpc_slice_buffer_undo_take_first_import
 typedef void *(*gpr_malloc_type)(size_t size);
 extern gpr_malloc_type gpr_malloc_import;
 #define gpr_malloc gpr_malloc_import
diff --git a/src/ruby/tools/bin/grpc_tools_ruby_protoc b/src/ruby/tools/bin/grpc_tools_ruby_protoc
index dab06e7..7e619e7 100755
--- a/src/ruby/tools/bin/grpc_tools_ruby_protoc
+++ b/src/ruby/tools/bin/grpc_tools_ruby_protoc
@@ -30,7 +30,7 @@
 
 require 'rbconfig'
 
-require_relative '../os_check'
+require_relative '../platform_check'
 
 ext = RbConfig::CONFIG['EXEEXT']
 
@@ -39,7 +39,7 @@
 plugin_name = 'grpc_ruby_plugin' + ext
 
 protoc_dir = File.join(File.dirname(__FILE__),
-                       RbConfig::CONFIG['host_cpu'] + '-' + OS.os_name)
+                       PLATFORM.architecture + '-' + PLATFORM.os_name)
 
 protoc_path = File.join(protoc_dir, protoc_name)
 
diff --git a/src/ruby/tools/bin/grpc_tools_ruby_protoc_plugin b/src/ruby/tools/bin/grpc_tools_ruby_protoc_plugin
index 4b296de..e6af2fe 100755
--- a/src/ruby/tools/bin/grpc_tools_ruby_protoc_plugin
+++ b/src/ruby/tools/bin/grpc_tools_ruby_protoc_plugin
@@ -30,12 +30,12 @@
 
 require 'rbconfig'
 
-require_relative '../os_check'
+require_relative '../platform_check'
 
 plugin_name = 'grpc_ruby_plugin' + RbConfig::CONFIG['EXEEXT']
 
 plugin_path = File.join(File.dirname(__FILE__),
-                        RbConfig::CONFIG['host_cpu'] + '-' + OS.os_name,
+                        PLATFORM.architecture + '-' + PLATFORM.os_name,
                         plugin_name)
 
 exec([ plugin_path, plugin_path ], *ARGV)
diff --git a/src/ruby/tools/grpc-tools.gemspec b/src/ruby/tools/grpc-tools.gemspec
index 68e2a7a..bc142ae 100644
--- a/src/ruby/tools/grpc-tools.gemspec
+++ b/src/ruby/tools/grpc-tools.gemspec
@@ -11,7 +11,7 @@
   s.description = 'protoc and the Ruby gRPC protoc plugin'
   s.license = 'BSD-3-Clause'
 
-  s.files = %w( version.rb os_check.rb README.md )
+  s.files = %w( version.rb platform_check.rb README.md )
   s.files += Dir.glob('bin/**/*')
 
   s.bindir = 'bin'
diff --git a/src/ruby/tools/os_check.rb b/src/ruby/tools/platform_check.rb
similarity index 84%
rename from src/ruby/tools/os_check.rb
rename to src/ruby/tools/platform_check.rb
index 2677306..1f4d5a6 100644
--- a/src/ruby/tools/os_check.rb
+++ b/src/ruby/tools/platform_check.rb
@@ -27,19 +27,28 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-# This is based on http://stackoverflow.com/a/171011/159388 by Aaron Hinni
-
 require 'rbconfig'
 
-module OS
-  def OS.os_name
+# This is based on http://stackoverflow.com/a/171011/159388 by Aaron Hinni
+
+module PLATFORM
+  def PLATFORM.os_name
     case RbConfig::CONFIG['host_os']
-    when /cygwin|mswin|mingw|bccwin|wince|emx/
-      'windows'
-    when /darwin/
-      'macos'
-    else
-      'linux'
+      when /cygwin|mswin|mingw|bccwin|wince|emx/
+        'windows'
+      when /darwin/
+        'macos'
+      else
+        'linux'
+    end
+  end
+
+  def PLATFORM.architecture
+    case RbConfig::CONFIG['host_cpu']
+      when /x86_64/
+        'x86_64'
+      else
+        'x86'
     end
   end
 end
diff --git a/templates/CMakeLists.txt.template b/templates/CMakeLists.txt.template
index 028c1b8..a326f36 100644
--- a/templates/CMakeLists.txt.template
+++ b/templates/CMakeLists.txt.template
@@ -40,6 +40,17 @@
   # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
   <%!
+  
+  import re
+  
+  proto_re = re.compile('(.*)\\.proto')
+  
+  def proto_replace_ext(filename, ext):
+      m = proto_re.match(filename)
+      if not m:
+        return filename
+      return '${_gRPC_PROTO_GENS_DIR}/' + m.group(1) + ext
+  
   def get_deps(target_dict):
     deps = []
     if target_dict.get('baselib', False):
@@ -54,6 +65,8 @@
       deps.append("${_gRPC_ZLIB_LIBRARIES}")
     for d in target_dict.get('deps', []):
       deps.append(d)
+    if target_dict.build == 'test' and target_dict.language == 'c++':
+      deps.append("${_gRPC_GFLAGS_LIBRARIES}")
     return deps
   %>
 
@@ -65,6 +78,9 @@
   set(PACKAGE_TARNAME   "<%text>${PACKAGE_NAME}-${PACKAGE_VERSION}</%text>")
   set(PACKAGE_BUGREPORT "https://github.com/grpc/grpc/issues/")
   project(<%text>${PACKAGE_NAME}</%text> C CXX)
+  
+  # Options
+  option(gRPC_BUILD_TESTS "Build tests" OFF)
 
   if (NOT MSVC)
     set(gRPC_INSTALL ON CACHE BOOL "Generate installation target")
@@ -80,7 +96,10 @@
 
   set(gRPC_PROTOBUF_PROVIDER "module" CACHE STRING "Provider of protobuf library")
   set_property(CACHE gRPC_PROTOBUF_PROVIDER PROPERTY STRINGS "module" "package")
-
+  
+  set(gRPC_GFLAGS_PROVIDER "module" CACHE STRING "Provider of gflags library")
+  set_property(CACHE gRPC_GFLAGS_PROVIDER PROPERTY STRINGS "module" "package")
+  
   set(gRPC_USE_PROTO_LITE OFF CACHE BOOL "Use the protobuf-lite library")
 
   if (MSVC)
@@ -140,6 +159,9 @@
       if(TARGET libprotoc)
         set(_gRPC_PROTOBUF_PROTOC_LIBRARIES libprotoc)
       endif()
+      if(TARGET protoc)
+        set(_gRPC_PROTOBUF_PROTOC protoc)
+      endif()
     else()
         message(WARNING "gRPC_PROTOBUF_PROVIDER is \"module\" but PROTOBUF_ROOT_DIR is wrong")
     endif()
@@ -152,6 +174,9 @@
       if(TARGET protobuf::libprotoc)
         set(_gRPC_PROTOBUF_PROTOC_LIBRARIES protobuf::libprotoc)
       endif()
+      if(TARGET protobuf::protoc)
+        set(_gRPC_PROTOBUF_PROTOC protobuf::protoc)
+      endif()
       set(_gRPC_FIND_PROTOBUF "if(NOT protobuf_FOUND)\n  find_package(protobuf CONFIG)\nendif()")
     else()
       find_package(Protobuf MODULE)
@@ -178,6 +203,26 @@
     endif()
     set(_gRPC_FIND_SSL "if(NOT OpenSSL_FOUND)\n  find_package(OpenSSL)\nendif()")
   endif()
+  
+  if("<%text>${gRPC_GFLAGS_PROVIDER}</%text>" STREQUAL "module")
+    if(NOT GFLAGS_ROOT_DIR)
+      set(GFLAGS_ROOT_DIR <%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>/third_party/gflags)
+    endif()
+    if(EXISTS "<%text>${GFLAGS_ROOT_DIR}</%text>/CMakeLists.txt")
+        add_subdirectory(<%text>${GFLAGS_ROOT_DIR}</%text> third_party/gflags)
+        if(TARGET gflags_static)
+            set(_gRPC_GFLAGS_LIBRARIES gflags_static)
+        endif()
+    else()
+        message(WARNING "gRPC_GFLAGS_PROVIDER is \"module\" but GFLAGS_ROOT_DIR is wrong")
+    endif()
+  elseif("<%text>${gRPC_GFLAGS_PROVIDER}</%text>" STREQUAL "package")
+    find_package(gflags)
+    if(TARGET gflags::gflags)
+      set(_gRPC_GFLAGS_LIBRARIES gflags::gflags)
+    endif()
+    set(_gRPC_FIND_GFLAGS "if(NOT gflags_FOUND)\n  find_package(gflags)\nendif()")
+  endif()
 
   if(NOT MSVC)
     set(CMAKE_C_FLAGS   "<%text>${CMAKE_C_FLAGS}</%text>   -std=c11")
@@ -192,32 +237,105 @@
   if(NOT DEFINED CMAKE_INSTALL_CMAKEDIR)
     set(CMAKE_INSTALL_CMAKEDIR "<%text>${CMAKE_INSTALL_LIBDIR}</%text>/cmake/gRPC")
   endif()
-
+  
+  # Create directory for generated .proto files
+  set(_gRPC_PROTO_GENS_DIR <%text>${CMAKE_BINARY_DIR}/gens</%text>)
+  file(MAKE_DIRECTORY <%text>${_gRPC_PROTO_GENS_DIR}</%text>)
+  
+  #  protobuf_generate_grpc_cpp
+  #  --------------------------
+  #
+  #   Add custom commands to process ``.proto`` files to C++ using protoc and
+  #   GRPC plugin::
+  #
+  #     protobuf_generate_grpc_cpp [<ARGN>...]
+  #
+  #   ``ARGN``
+  #     ``.proto`` files
+  #
+  function(protobuf_generate_grpc_cpp)
+    if(NOT ARGN)
+      message(SEND_ERROR "Error: PROTOBUF_GENERATE_GRPC_CPP() called without any proto files")
+      return()
+    endif()
+  
+    set(_protobuf_include_path -I .)
+    foreach(FIL <%text>${ARGN}</%text>)
+      get_filename_component(ABS_FIL <%text>${FIL}</%text> ABSOLUTE)
+      get_filename_component(FIL_WE <%text>${FIL}</%text> NAME_WE)
+      file(RELATIVE_PATH REL_FIL <%text>${CMAKE_SOURCE_DIR}</%text> <%text>${ABS_FIL}</%text>)
+      get_filename_component(REL_DIR <%text>${REL_FIL}</%text> DIRECTORY)
+      set(RELFIL_WE "<%text>${REL_DIR}/${FIL_WE}</%text>")
+      
+      add_custom_command(
+        OUTPUT <%text>"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.cc"</%text>
+               <%text>"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.h"</%text>
+               <%text>"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.cc"</%text>
+               <%text>"${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.h"</%text>
+        COMMAND <%text>${_gRPC_PROTOBUF_PROTOC}</%text>
+        ARGS --grpc_out=<%text>${_gRPC_PROTO_GENS_DIR}</%text>
+             --cpp_out=<%text>${_gRPC_PROTO_GENS_DIR}</%text>
+             --plugin=protoc-gen-grpc=$<TARGET_FILE:grpc_cpp_plugin>
+             <%text>${_protobuf_include_path}</%text>
+             <%text>${REL_FIL}</%text>
+        DEPENDS <%text>${ABS_FIL}</%text> <%text>${_gRPC_PROTOBUF_PROTOC}</%text> grpc_cpp_plugin
+        WORKING_DIRECTORY <%text>${CMAKE_SOURCE_DIR}</%text>
+        COMMENT "Running gRPC C++ protocol buffer compiler on <%text>${FIL}</%text>"
+        VERBATIM)
+        
+        <%text>set_source_files_properties("${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.cc" "${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.h" "${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.cc" "${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.h" PROPERTIES GENERATED TRUE)</%text>
+    endforeach()
+  endfunction()
+  
   % for lib in libs:
-  % if lib.build in ["all", "protoc", "tool"] and lib.language in ['c', 'c++']:
-  ## TODO(jtattermusch): grpc++_reflection includes .proto files
-  ## which is not yet supported and thus fails the entire build.
-  ## Re-enable once fixed.
-  % if lib.name != 'grpc++_reflection':
-    ${cc_library(lib)}
-    ${cc_install(lib)}
+  % if lib.build in ["all", "protoc", "tool", "test", "private"] and lib.language in ['c', 'c++']:
+  % if not lib.get('build_system', []) or 'cmake' in lib.get('build_system', []):
+  % if lib.build in ["test", "private"]:
+  if (gRPC_BUILD_TESTS)
+  ${cc_library(lib)}
+  endif (gRPC_BUILD_TESTS)
+  % else:
+  ${cc_library(lib)}
+  ${cc_install(lib)}
+  % endif
   % endif
   % endif
   % endfor
 
   % for tgt in targets:
-  % if tgt.build in ["all", "protoc", "tool"] and tgt.language in ['c', 'c++']:
+  % if tgt.build in ["all", "protoc", "tool", "test", "private"] and tgt.language in ['c', 'c++']:
+  % if tgt.build in ["test", "private"]:
+  if (gRPC_BUILD_TESTS)
+  ${cc_binary(tgt)}
+  endif (gRPC_BUILD_TESTS)
+  % else:
   ${cc_binary(tgt)}
   ${cc_install(tgt)}
   % endif
+  % endif
   % endfor
 
   <%def name="cc_library(lib)">
   add_library(${lib.name}
   % for src in lib.src:
+  % if not proto_re.match(src):
     ${src}
+  % else:
+    ${proto_replace_ext(src, '.pb.cc')}
+    ${proto_replace_ext(src, '.grpc.pb.cc')}
+    ${proto_replace_ext(src, '.pb.h')}
+    ${proto_replace_ext(src, '.grpc.pb.h')}
+  % endif
   % endfor
   )
+  
+  % for src in lib.src:
+  % if proto_re.match(src):
+  protobuf_generate_grpc_cpp(
+    ${src}
+  )
+  % endif
+  % endfor
 
   target_include_directories(${lib.name}
     PRIVATE <%text>${CMAKE_CURRENT_SOURCE_DIR}</%text>
@@ -226,6 +344,14 @@
     PRIVATE <%text>${PROTOBUF_ROOT_DIR}</%text>/src
     PRIVATE <%text>${ZLIB_INCLUDE_DIR}</%text>
     PRIVATE <%text>${CMAKE_CURRENT_BINARY_DIR}</%text>/third_party/zlib
+    PRIVATE <%text>${CMAKE_CURRENT_BINARY_DIR}</%text>/third_party/gflags/include
+  % if lib.build in ['test', 'private'] and lib.language == 'c++':
+    PRIVATE third_party/googletest/include
+    PRIVATE third_party/googletest
+  % endif
+  % if any(proto_re.match(src) for src in lib.src):
+    PRIVATE <%text>${_gRPC_PROTO_GENS_DIR}</%text>
+  % endif
   )
 
   % if len(get_deps(lib)) > 0:
@@ -256,6 +382,9 @@
   % for src in tgt.src:
     ${src}
   % endfor
+  % if tgt.build == 'test' and tgt.language == 'c++':
+    third_party/googletest/src/gtest-all.cc
+  % endif
   )
 
   target_include_directories(${tgt.name}
@@ -265,6 +394,11 @@
     PRIVATE <%text>${PROTOBUF_ROOT_DIR}</%text>/src
     PRIVATE <%text>${ZLIB_ROOT_DIR}</%text>
     PRIVATE <%text>${CMAKE_CURRENT_BINARY_DIR}</%text>/third_party/zlib
+    PRIVATE <%text>${CMAKE_CURRENT_BINARY_DIR}</%text>/third_party/gflags/include
+  % if tgt.build in ['test', 'private'] and tgt.language == 'c++':
+    PRIVATE third_party/googletest/include
+    PRIVATE third_party/googletest
+  % endif
   )
 
   % if len(get_deps(tgt)) > 0:
diff --git a/templates/build_config.rb.template b/templates/build_config.rb.template
new file mode 100644
index 0000000..0d9191b
--- /dev/null
+++ b/templates/build_config.rb.template
@@ -0,0 +1,34 @@
+%YAML 1.2
+--- |
+  # Copyright 2017, Google Inc.
+  # All rights reserved.
+  #
+  # Redistribution and use in source and binary forms, with or without
+  # modification, are permitted provided that the following conditions are
+  # met:
+  #
+  #     * Redistributions of source code must retain the above copyright
+  # notice, this list of conditions and the following disclaimer.
+  #     * Redistributions in binary form must reproduce the above
+  # copyright notice, this list of conditions and the following disclaimer
+  # in the documentation and/or other materials provided with the
+  # distribution.
+  #     * Neither the name of Google Inc. nor the names of its
+  # contributors may be used to endorse or promote products derived from
+  # this software without specific prior written permission.
+  #
+  # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+  # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+  # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+  # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+  # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+  # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+  # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+  # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+  # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+  # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+  module GrpcBuildConfig
+    CORE_WINDOWS_DLL = '/tmp/libs/opt/grpc-${settings.core_version.major}.dll'
+  end
diff --git a/templates/tools/dockerfile/interoptest/grpc_interop_http2/Dockerfile.template b/templates/tools/dockerfile/interoptest/grpc_interop_http2/Dockerfile.template
index 38a5ca7..6204c3e 100644
--- a/templates/tools/dockerfile/interoptest/grpc_interop_http2/Dockerfile.template
+++ b/templates/tools/dockerfile/interoptest/grpc_interop_http2/Dockerfile.template
@@ -33,6 +33,8 @@
   
   <%include file="../../go_path.include"/>
   <%include file="../../python_deps.include"/>
+  RUN pip install twisted h2
+
   # Define the default command.
   CMD ["bash"]
   
diff --git a/templates/vsprojects/generate_debug_projects.sh b/templates/vsprojects/generate_debug_projects.sh
deleted file mode 100755
index f103ebe..0000000
--- a/templates/vsprojects/generate_debug_projects.sh
+++ /dev/null
@@ -1,76 +0,0 @@
-#!/bin/sh
-
-# Copyright 2015, Google Inc.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-#     * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-#     * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-# To properly use this, you'll need to add:
-#
-#    "debug": true
-#
-# to build.json
-
-cd `dirname $0`/../..
-
-git add .               #because we're using "git diff" to find changes to grpc.sln and then make files based on those changes, this prevents this file or other files from possibly being found in the diff
-
-./tools/buildgen/generate_projects-old.sh
-
-line_number=0
-
-git diff |
-grep -A2 \\+Project |       #find "Project" immediately after a backslash (escaped), plus 2 additional lines to capture the "libs = ", plus 1 line of "--".  matches will come from the generated grpc.sln
-while read p ; do
-  line_number=$((line_number + 1))
-  if [ "$line_number" -gt "4" ]; then
-    line_number=1;
-  fi
-  echo $line_number
-  echo $p
-  if [ "$line_number" -eq "1" ]; then
-    project_name=$(echo "$p" | cut -d\" -f 4)          #sed: extract line N only; cut with delimiter: ".  select only field 4
-  fi
-  if [ "$line_number" -eq "3" ]; then
-    lib_setting=$(echo "$p" | cut -d\" -f 2)          #
-    echo "project_name"
-    echo $project_name
-    echo "lib_setting"
-    echo $lib_setting
-    mkdir -p templates/vsprojects/$project_name
-    if [ "$lib_setting" = "True" ]; then
-      echo "lib: true"
-      echo '<%namespace file="../vcxproj_defs.include" import="gen_project"/>${gen_project("'$project_name'", libs)}' > templates/vsprojects/$project_name/$project_name.vcxproj.template
-    else
-      echo "lib: not true"
-      echo '<%namespace file="../vcxproj_defs.include" import="gen_project"/>${gen_project("'$project_name'", targets)}' > templates/vsprojects/$project_name/$project_name.vcxproj.template
-    fi
-  fi
- # sleep .5     #for testing
-done
-
-./tools/buildgen/generate_projects-old.sh
diff --git a/test/core/handshake/client_ssl.c b/test/core/handshake/client_ssl.c
index 24281e0..613251b 100644
--- a/test/core/handshake/client_ssl.c
+++ b/test/core/handshake/client_ssl.c
@@ -104,7 +104,8 @@
   bool grpc_exp_seen = false;
   bool h2_seen = false;
   const char *inp = (const char *)in;
-  for (int i = 0; i < (int)in_len; ++i) {
+  const char *in_end = inp + in_len;
+  while (inp < in_end) {
     const size_t length = (size_t)*inp++;
     if (length == strlen("grpc-exp") && strncmp(inp, "grpc-exp", length) == 0) {
       grpc_exp_seen = true;
@@ -117,6 +118,7 @@
     inp += length;
   }
 
+  GPR_ASSERT(inp == in_end);
   GPR_ASSERT(grpc_exp_seen);
   GPR_ASSERT(h2_seen);
 
diff --git a/test/core/iomgr/ev_epoll_linux_test.c b/test/core/iomgr/ev_epoll_linux_test.c
index 40ae91b..d95d552 100644
--- a/test/core/iomgr/ev_epoll_linux_test.c
+++ b/test/core/iomgr/ev_epoll_linux_test.c
@@ -45,6 +45,7 @@
 #include <grpc/support/log.h>
 
 #include "src/core/lib/iomgr/iomgr.h"
+#include "src/core/lib/iomgr/workqueue.h"
 #include "test/core/util/test_config.h"
 
 typedef struct test_pollset {
@@ -60,6 +61,22 @@
 /* num_fds should be an even number */
 static void test_fd_init(test_fd *tfds, int *fds, int num_fds) {
   int i;
+  int r;
+
+  /* Create some dummy file descriptors. Currently using pipe file descriptors
+   * for this test but we could use any other type of file descriptors. Also,
+   * since pipe() used in this test creates two fds in each call, num_fds should
+   * be an even number */
+  GPR_ASSERT((num_fds % 2) == 0);
+  for (i = 0; i < num_fds; i = i + 2) {
+    r = pipe(fds + i);
+    if (r != 0) {
+      gpr_log(GPR_ERROR, "Error in creating pipe. %d (%s)", errno,
+              strerror(errno));
+      return;
+    }
+  }
+
   for (i = 0; i < num_fds; i++) {
     tfds[i].inner_fd = fds[i];
     tfds[i].fd = grpc_fd_create(fds[i], "test_fd");
@@ -111,8 +128,80 @@
   }
 }
 
-#define NUM_FDS 8
-#define NUM_POLLSETS 4
+static void increment(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {
+  ++*(int *)arg;
+}
+
+/*
+ * Validate that merging two workqueues preserves the closures in each queue.
+ * This is a regression test for a bug in
+ * polling_island_merge()[ev_epoll_linux.c], where the parent relationship was
+ * inverted.
+ */
+static void test_pollset_queue_merge_items() {
+  grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+  const int num_fds = 2;
+  const int num_pollsets = 2;
+  const int num_closures = 4;
+  test_fd tfds[num_fds];
+  int fds[num_fds];
+  test_pollset pollsets[num_pollsets];
+  grpc_closure closures[num_closures];
+  int i;
+  int result = 0;
+
+  test_fd_init(tfds, fds, num_fds);
+  test_pollset_init(pollsets, num_pollsets);
+
+  /* Two distinct polling islands, each with their own FD and pollset. */
+  for (i = 0; i < num_fds; i++) {
+    grpc_pollset_add_fd(&exec_ctx, pollsets[i].pollset, tfds[i].fd);
+    grpc_exec_ctx_flush(&exec_ctx);
+  }
+
+  /* Enqeue the closures, 3 to polling island 0 and 1 to polling island 1. */
+  grpc_closure_init(
+      closures, increment, &result,
+      grpc_workqueue_scheduler(grpc_fd_get_polling_island(tfds[0].fd)));
+  grpc_closure_init(
+      closures + 1, increment, &result,
+      grpc_workqueue_scheduler(grpc_fd_get_polling_island(tfds[0].fd)));
+  grpc_closure_init(
+      closures + 2, increment, &result,
+      grpc_workqueue_scheduler(grpc_fd_get_polling_island(tfds[0].fd)));
+  grpc_closure_init(
+      closures + 3, increment, &result,
+      grpc_workqueue_scheduler(grpc_fd_get_polling_island(tfds[1].fd)));
+  for (i = 0; i < num_closures; ++i) {
+    grpc_closure_sched(&exec_ctx, closures + i, GRPC_ERROR_NONE);
+  }
+
+  /* Merge the two polling islands. */
+  grpc_pollset_add_fd(&exec_ctx, pollsets[0].pollset, tfds[1].fd);
+  grpc_exec_ctx_flush(&exec_ctx);
+
+  /*
+   * Execute the closures, verify we see each one execute when executing work on
+   * the merged polling island.
+   */
+  grpc_pollset_worker *worker = NULL;
+  for (i = 0; i < num_closures; ++i) {
+    const gpr_timespec deadline = gpr_time_add(
+        gpr_now(GPR_CLOCK_MONOTONIC), gpr_time_from_seconds(2, GPR_TIMESPAN));
+    gpr_mu_lock(pollsets[1].mu);
+    GRPC_LOG_IF_ERROR(
+        "grpc_pollset_work",
+        grpc_pollset_work(&exec_ctx, pollsets[1].pollset, &worker,
+                          gpr_now(GPR_CLOCK_MONOTONIC), deadline));
+    gpr_mu_unlock(pollsets[1].mu);
+  }
+  GPR_ASSERT(result == num_closures);
+
+  test_fd_cleanup(&exec_ctx, tfds, num_fds);
+  test_pollset_cleanup(&exec_ctx, pollsets, num_pollsets);
+  grpc_exec_ctx_finish(&exec_ctx);
+}
+
 /*
  * Cases to test:
  *  case 1) Polling islands of both fd and pollset are NULL
@@ -125,28 +214,16 @@
  * */
 static void test_add_fd_to_pollset() {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  test_fd tfds[NUM_FDS];
-  int fds[NUM_FDS];
-  test_pollset pollsets[NUM_POLLSETS];
+  const int num_fds = 8;
+  const int num_pollsets = 4;
+  test_fd tfds[num_fds];
+  int fds[num_fds];
+  test_pollset pollsets[num_pollsets];
   void *expected_pi = NULL;
   int i;
-  int r;
 
-  /* Create some dummy file descriptors. Currently using pipe file descriptors
-   * for this test but we could use any other type of file descriptors. Also,
-   * since pipe() used in this test creates two fds in each call, NUM_FDS should
-   * be an even number */
-  for (i = 0; i < NUM_FDS; i = i + 2) {
-    r = pipe(fds + i);
-    if (r != 0) {
-      gpr_log(GPR_ERROR, "Error in creating pipe. %d (%s)", errno,
-              strerror(errno));
-      return;
-    }
-  }
-
-  test_fd_init(tfds, fds, NUM_FDS);
-  test_pollset_init(pollsets, NUM_POLLSETS);
+  test_fd_init(tfds, fds, num_fds);
+  test_pollset_init(pollsets, num_pollsets);
 
   /*Step 1.
    * Create three polling islands (This will exercise test case 1 and 2) with
@@ -207,19 +284,19 @@
 
   /* Compare Fd:0's polling island with that of all other Fds */
   expected_pi = grpc_fd_get_polling_island(tfds[0].fd);
-  for (i = 1; i < NUM_FDS; i++) {
+  for (i = 1; i < num_fds; i++) {
     GPR_ASSERT(grpc_are_polling_islands_equal(
         expected_pi, grpc_fd_get_polling_island(tfds[i].fd)));
   }
 
   /* Compare Fd:0's polling island with that of all other pollsets */
-  for (i = 0; i < NUM_POLLSETS; i++) {
+  for (i = 0; i < num_pollsets; i++) {
     GPR_ASSERT(grpc_are_polling_islands_equal(
         expected_pi, grpc_pollset_get_polling_island(pollsets[i].pollset)));
   }
 
-  test_fd_cleanup(&exec_ctx, tfds, NUM_FDS);
-  test_pollset_cleanup(&exec_ctx, pollsets, NUM_POLLSETS);
+  test_fd_cleanup(&exec_ctx, tfds, num_fds);
+  test_pollset_cleanup(&exec_ctx, pollsets, num_pollsets);
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
@@ -231,6 +308,7 @@
   poll_strategy = grpc_get_poll_strategy_name();
   if (poll_strategy != NULL && strcmp(poll_strategy, "epoll") == 0) {
     test_add_fd_to_pollset();
+    test_pollset_queue_merge_items();
   } else {
     gpr_log(GPR_INFO,
             "Skipping the test. The test is only relevant for 'epoll' "
diff --git a/test/cpp/interop/stress_test.cc b/test/cpp/interop/stress_test.cc
index 562522d..fdc0a61 100644
--- a/test/cpp/interop/stress_test.cc
+++ b/test/cpp/interop/stress_test.cc
@@ -45,9 +45,9 @@
 
 #include "src/proto/grpc/testing/metrics.grpc.pb.h"
 #include "src/proto/grpc/testing/metrics.pb.h"
-#include "test/cpp/interop/client_helper.h"
 #include "test/cpp/interop/interop_client.h"
 #include "test/cpp/interop/stress_interop_client.h"
+#include "test/cpp/util/create_test_channel.h"
 #include "test/cpp/util/metrics_server.h"
 #include "test/cpp/util/test_config.h"
 
@@ -67,9 +67,7 @@
              " forcefully terminated.");
 
 DEFINE_string(server_addresses, "localhost:8080",
-              "The list of server"
-              "addresses. This option is ignored if either\n"
-              "server_port or server_host is specified. The format is: \n"
+              "The list of server addresses. The format is: \n"
               " \"<name_1>:<port_1>,<name_2>:<port_1>...<name_N>:<port_N>\"\n"
               " Note: <name> can be servername or IP address.");
 
@@ -80,34 +78,6 @@
              "indicates the max number of parallel RPC calls on each channel "
              "at any given time.");
 
-DEFINE_string(test_case, "",
-              "Configure different test cases. Valid options are:\n\n"
-              "all : all test cases;\n"
-              "cancel_after_begin : cancel stream after starting it;\n"
-              "cancel_after_first_response: cancel on first response;\n"
-              "client_compressed_streaming : compressed request streaming with "
-              "client_compressed_unary : single compressed request;\n"
-              "client_streaming : request streaming with single response;\n"
-              "compute_engine_creds: large_unary with compute engine auth;\n"
-              "custom_metadata: server will echo custom metadata;\n"
-              "empty_stream : bi-di stream with no request/response;\n"
-              "empty_unary : empty (zero bytes) request and response;\n"
-              "half_duplex : half-duplex streaming;\n"
-              "jwt_token_creds: large_unary with JWT token auth;\n"
-              "large_unary : single request and (large) response;\n"
-              "oauth2_auth_token: raw oauth2 access token auth;\n"
-              "per_rpc_creds: raw oauth2 access token on a single rpc;\n"
-              "ping_pong : full-duplex streaming;\n"
-              "response streaming;\n"
-              "server_compressed_streaming : single request with compressed "
-              "server_compressed_unary : single compressed response;\n"
-              "server_streaming : single request with response streaming;\n"
-              "slow_consumer : single request with response streaming with "
-              "slow client consumer;\n"
-              "status_code_and_message: verify status code & message;\n"
-              "timeout_on_sleeping_server: deadline exceeds on stream;\n"
-              "unimplemented_method: client calls an unimplemented_method;\n");
-
 // TODO(sreek): Add more test cases here in future
 DEFINE_string(test_cases, "",
               "List of test cases to call along with the"
@@ -147,14 +117,9 @@
 // Options from client.cc (for compatibility with interop test).
 // TODO(sreek): Consolidate overlapping options
 DEFINE_bool(use_tls, false, "Whether to use tls.");
-DEFINE_string(custom_credentials_type, "", "User provided credentials type.");
 DEFINE_bool(use_test_ca, false, "False to use SSL roots for google");
-DEFINE_int32(server_port, 0, "Server port.");
-DEFINE_string(server_host, "127.0.0.1", "Server host to connect to");
 DEFINE_string(server_host_override, "foo.test.google.fr",
               "Override the server host which is sent in HTTP header");
-DEFINE_string(service_account_key_file, "",
-              "Path to service account json key file.");
 
 using grpc::testing::kTestCaseList;
 using grpc::testing::MetricsService;
@@ -241,8 +206,6 @@
 void LogParameterInfo(const std::vector<grpc::string>& addresses,
                       const std::vector<std::pair<TestCaseType, int>>& tests) {
   gpr_log(GPR_INFO, "server_addresses: %s", FLAGS_server_addresses.c_str());
-  gpr_log(GPR_INFO, "server_host: %s", FLAGS_server_host.c_str());
-  gpr_log(GPR_INFO, "server_port: %d", FLAGS_server_port);
   gpr_log(GPR_INFO, "test_cases : %s", FLAGS_test_cases.c_str());
   gpr_log(GPR_INFO, "sleep_duration_ms: %d", FLAGS_sleep_duration_ms);
   gpr_log(GPR_INFO, "test_duration_secs: %d", FLAGS_test_duration_secs);
@@ -286,24 +249,11 @@
 
   // Parse the server addresses
   std::vector<grpc::string> server_addresses;
-  if (FLAGS_server_port != 0) {
-    // We are using interop_client style cmdline options.
-    const int host_port_buf_size = 1024;
-    char host_port[host_port_buf_size];
-    snprintf(host_port, host_port_buf_size, "%s:%d", FLAGS_server_host.c_str(),
-             FLAGS_server_port);
-    std::string host_port_str(host_port);
-    ParseCommaDelimitedString(host_port_str, server_addresses);
-  } else {
-    ParseCommaDelimitedString(FLAGS_server_addresses, server_addresses);
-  }
+  ParseCommaDelimitedString(FLAGS_server_addresses, server_addresses);
 
   // Parse test cases and weights
   if (FLAGS_test_cases.length() == 0) {
-    // We are using interop_client style test_case option
-    FLAGS_test_cases = FLAGS_test_case + ":100";
-  } else if (FLAGS_test_case != "") {
-    gpr_log(GPR_ERROR, "specify --test_case or --test_cases but not both.");
+    gpr_log(GPR_ERROR, "No test cases supplied");
     return 1;
   }
 
@@ -341,12 +291,8 @@
          channel_idx++) {
       gpr_log(GPR_INFO, "Starting test with %s channel_idx=%d..", it->c_str(),
               channel_idx);
-      std::shared_ptr<grpc::Channel> channel;
-      if (FLAGS_use_tls) {
-        channel = grpc::testing::CreateChannelForTestCase(FLAGS_test_case);
-      } else {
-        channel = grpc::CreateChannel(*it, grpc::InsecureChannelCredentials());
-      }
+      std::shared_ptr<grpc::Channel> channel = grpc::CreateTestChannel(
+          *it, FLAGS_server_host_override, FLAGS_use_tls, !FLAGS_use_test_ca);
 
       // Create stub(s) for each channel
       for (int stub_idx = 0; stub_idx < FLAGS_num_stubs_per_channel;
diff --git a/test/cpp/qps/client.h b/test/cpp/qps/client.h
index 18f9778..baa9304 100644
--- a/test/cpp/qps/client.h
+++ b/test/cpp/qps/client.h
@@ -51,7 +51,6 @@
 
 #include "test/cpp/qps/histogram.h"
 #include "test/cpp/qps/interarrival.h"
-#include "test/cpp/qps/limit_cores.h"
 #include "test/cpp/qps/usage_timer.h"
 #include "test/cpp/util/create_test_channel.h"
 
@@ -374,7 +373,7 @@
   ClientImpl(const ClientConfig& config,
              std::function<std::unique_ptr<StubType>(std::shared_ptr<Channel>)>
                  create_stub)
-      : cores_(LimitCores(config.core_list().data(), config.core_list_size())),
+      : cores_(gpr_cpu_num_cores()),
         channels_(config.client_channels()),
         create_stub_(create_stub) {
     for (int i = 0; i < config.client_channels(); i++) {
diff --git a/test/cpp/qps/driver.cc b/test/cpp/qps/driver.cc
index 93ef32d..74fe366 100644
--- a/test/cpp/qps/driver.cc
+++ b/test/cpp/qps/driver.cc
@@ -76,30 +76,6 @@
   return s;
 }
 
-static std::unordered_map<string, std::deque<int>> get_hosts_and_cores(
-    const deque<string>& workers) {
-  std::unordered_map<string, std::deque<int>> hosts;
-  for (auto it = workers.begin(); it != workers.end(); it++) {
-    const string host = get_host(*it);
-    if (hosts.find(host) == hosts.end()) {
-      auto stub = WorkerService::NewStub(
-          CreateChannel(*it, InsecureChannelCredentials()));
-      grpc::ClientContext ctx;
-      ctx.set_wait_for_ready(true);
-      CoreRequest dummy;
-      CoreResponse cores;
-      grpc::Status s = stub->CoreCount(&ctx, dummy, &cores);
-      GPR_ASSERT(s.ok());
-      std::deque<int> dq;
-      for (int i = 0; i < cores.cores(); i++) {
-        dq.push_back(i);
-      }
-      hosts[host] = dq;
-    }
-  }
-  return hosts;
-}
-
 static deque<string> get_workers(const string& env_name) {
   char* env = gpr_getenv(env_name.c_str());
   if (!env) {
@@ -210,7 +186,7 @@
     const ClientConfig& initial_client_config, size_t num_clients,
     const ServerConfig& initial_server_config, size_t num_servers,
     int warmup_seconds, int benchmark_seconds, int spawn_local_worker_count,
-    const char* qps_server_target_override, bool configure_core_lists) {
+    const char* qps_server_target_override) {
   // Log everything from the driver
   gpr_set_log_verbosity(GPR_LOG_SEVERITY_DEBUG);
 
@@ -279,9 +255,6 @@
   std::vector<ServerData> servers(num_servers);
   std::unordered_map<string, std::deque<int>> hosts_cores;
 
-  if (configure_core_lists) {
-    hosts_cores = get_hosts_and_cores(workers);
-  }
   for (size_t i = 0; i < num_servers; i++) {
     gpr_log(GPR_INFO, "Starting server on %s (worker #%" PRIuPTR ")",
             workers[i].c_str(), i);
@@ -289,37 +262,9 @@
         CreateChannel(workers[i], InsecureChannelCredentials()));
 
     ServerConfig server_config = initial_server_config;
-    int server_core_limit = initial_server_config.core_limit();
-    int client_core_limit = initial_client_config.core_limit();
-
-    if (configure_core_lists) {
-      string host_str(get_host(workers[i]));
-      if (server_core_limit == 0 && client_core_limit > 0) {
-        // In this case, limit the server cores if it matches the
-        // same host as one or more clients
-        const auto& dq = hosts_cores.at(host_str);
-        bool match = false;
-        int limit = dq.size();
-        for (size_t cli = 0; cli < num_clients; cli++) {
-          if (host_str == get_host(workers[cli + num_servers])) {
-            limit -= client_core_limit;
-            match = true;
-          }
-        }
-        if (match) {
-          GPR_ASSERT(limit > 0);
-          server_core_limit = limit;
-        }
-      }
-      if (server_core_limit > 0) {
-        auto& dq = hosts_cores.at(host_str);
-        GPR_ASSERT(dq.size() >= static_cast<size_t>(server_core_limit));
-        gpr_log(GPR_INFO, "Setting server core_list");
-        for (int core = 0; core < server_core_limit; core++) {
-          server_config.add_core_list(dq.front());
-          dq.pop_front();
-        }
-      }
+    if (server_config.core_limit() != 0) {
+      gpr_log(GPR_ERROR,
+              "server config core limit is set but ignored by driver");
     }
 
     ServerArgs args;
@@ -364,33 +309,8 @@
         CreateChannel(worker, InsecureChannelCredentials()));
     ClientConfig per_client_config = client_config;
 
-    int server_core_limit = initial_server_config.core_limit();
-    int client_core_limit = initial_client_config.core_limit();
-    if (configure_core_lists &&
-        ((server_core_limit > 0) || (client_core_limit > 0))) {
-      auto& dq = hosts_cores.at(get_host(worker));
-      if (client_core_limit == 0) {
-        // limit client cores if it matches a server host
-        bool match = false;
-        int limit = dq.size();
-        for (size_t srv = 0; srv < num_servers; srv++) {
-          if (get_host(worker) == get_host(workers[srv])) {
-            match = true;
-          }
-        }
-        if (match) {
-          GPR_ASSERT(limit > 0);
-          client_core_limit = limit;
-        }
-      }
-      if (client_core_limit > 0) {
-        GPR_ASSERT(dq.size() >= static_cast<size_t>(client_core_limit));
-        gpr_log(GPR_INFO, "Setting client core_list");
-        for (int core = 0; core < client_core_limit; core++) {
-          per_client_config.add_core_list(dq.front());
-          dq.pop_front();
-        }
-      }
+    if (initial_client_config.core_limit() != 0) {
+      gpr_log(GPR_ERROR, "client config core limit set but ignored");
     }
 
     // Reduce channel count so that total channels specified is held regardless
diff --git a/test/cpp/qps/driver.h b/test/cpp/qps/driver.h
index b5c8152..e72d30a 100644
--- a/test/cpp/qps/driver.h
+++ b/test/cpp/qps/driver.h
@@ -46,8 +46,7 @@
     const grpc::testing::ClientConfig& client_config, size_t num_clients,
     const grpc::testing::ServerConfig& server_config, size_t num_servers,
     int warmup_seconds, int benchmark_seconds, int spawn_local_worker_count,
-    const char* qps_server_target_override = "",
-    bool configure_core_lists = true);
+    const char* qps_server_target_override = "");
 
 bool RunQuit();
 }  // namespace testing
diff --git a/test/cpp/qps/limit_cores.cc b/test/cpp/qps/limit_cores.cc
deleted file mode 100644
index b5c2225..0000000
--- a/test/cpp/qps/limit_cores.cc
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- *
- * Copyright 2016, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-#include "test/cpp/qps/limit_cores.h"
-
-#include <grpc/support/cpu.h>
-#include <grpc/support/log.h>
-#include <grpc/support/port_platform.h>
-
-#ifdef GPR_CPU_LINUX
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE
-#endif
-#include <sched.h>
-
-namespace grpc {
-namespace testing {
-
-int LimitCores(const int* cores, int cores_size) {
-  const int num_cores = gpr_cpu_num_cores();
-  int cores_set = 0;
-
-  cpu_set_t* cpup = CPU_ALLOC(num_cores);
-  GPR_ASSERT(cpup);
-  const size_t size = CPU_ALLOC_SIZE(num_cores);
-  CPU_ZERO_S(size, cpup);
-
-  if (cores_size > 0) {
-    for (int i = 0; i < cores_size; i++) {
-      if (cores[i] < num_cores) {
-        CPU_SET_S(cores[i], size, cpup);
-        cores_set++;
-      }
-    }
-  } else {
-    for (int i = 0; i < num_cores; i++) {
-      CPU_SET_S(i, size, cpup);
-      cores_set++;
-    }
-  }
-  bool affinity_set = (sched_setaffinity(0, size, cpup) == 0);
-  CPU_FREE(cpup);
-  return affinity_set ? cores_set : num_cores;
-}
-
-}  // namespace testing
-}  // namespace grpc
-#else
-namespace grpc {
-namespace testing {
-
-// LimitCores is not currently supported for non-Linux platforms
-int LimitCores(const int*, int) { return gpr_cpu_num_cores(); }
-
-}  // namespace testing
-}  // namespace grpc
-#endif
diff --git a/test/cpp/qps/qps_json_driver.cc b/test/cpp/qps/qps_json_driver.cc
index 57ee5ef..ddaaa7c 100644
--- a/test/cpp/qps/qps_json_driver.cc
+++ b/test/cpp/qps/qps_json_driver.cc
@@ -70,9 +70,6 @@
 DEFINE_string(qps_server_target_override, "",
               "Override QPS server target to configure in client configs."
               "Only applicable if there is a single benchmark server.");
-DEFINE_bool(configure_core_lists, true,
-            "Provide 'core_list' parameters to workers. Value determined "
-            "by cores available and 'core_limit' parameters of the scenarios.");
 
 namespace grpc {
 namespace testing {
@@ -80,12 +77,12 @@
 static std::unique_ptr<ScenarioResult> RunAndReport(const Scenario& scenario,
                                                     bool* success) {
   std::cerr << "RUNNING SCENARIO: " << scenario.name() << "\n";
-  auto result = RunScenario(
-      scenario.client_config(), scenario.num_clients(),
-      scenario.server_config(), scenario.num_servers(),
-      scenario.warmup_seconds(), scenario.benchmark_seconds(),
-      scenario.spawn_local_worker_count(),
-      FLAGS_qps_server_target_override.c_str(), FLAGS_configure_core_lists);
+  auto result =
+      RunScenario(scenario.client_config(), scenario.num_clients(),
+                  scenario.server_config(), scenario.num_servers(),
+                  scenario.warmup_seconds(), scenario.benchmark_seconds(),
+                  scenario.spawn_local_worker_count(),
+                  FLAGS_qps_server_target_override.c_str());
 
   // Amend the result with scenario config. Eventually we should adjust
   // RunScenario contract so we don't need to touch the result here.
diff --git a/test/cpp/qps/server.h b/test/cpp/qps/server.h
index c3d18e5..821d593 100644
--- a/test/cpp/qps/server.h
+++ b/test/cpp/qps/server.h
@@ -42,7 +42,6 @@
 #include "src/proto/grpc/testing/messages.grpc.pb.h"
 #include "test/core/end2end/data/ssl_test_data.h"
 #include "test/core/util/port.h"
-#include "test/cpp/qps/limit_cores.h"
 #include "test/cpp/qps/usage_timer.h"
 
 namespace grpc {
@@ -51,7 +50,7 @@
 class Server {
  public:
   explicit Server(const ServerConfig& config) : timer_(new UsageTimer) {
-    cores_ = LimitCores(config.core_list().data(), config.core_list_size());
+    cores_ = gpr_cpu_num_cores();
     if (config.port()) {
       port_ = config.port();
 
diff --git a/third_party/Cronet/bidirectional_stream_c.h b/third_party/Cronet/bidirectional_stream_c.h
new file mode 100644
index 0000000..ffb235a
--- /dev/null
+++ b/third_party/Cronet/bidirectional_stream_c.h
@@ -0,0 +1,246 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_GRPC_SUPPORT_INCLUDE_BIDIRECTIONAL_STREAM_C_H_
+#define COMPONENTS_GRPC_SUPPORT_INCLUDE_BIDIRECTIONAL_STREAM_C_H_
+
+#if defined(WIN32)
+#define GRPC_SUPPORT_EXPORT
+#else
+#define GRPC_SUPPORT_EXPORT __attribute__((visibility("default")))
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stddef.h>
+
+/* Engine API. */
+
+/* Opaque object representing a Bidirectional stream creating engine. Created
+ * and configured outside of this API to facilitate sharing with other
+ * components */
+typedef struct stream_engine {
+  void* obj;
+  void* annotation;
+} stream_engine;
+
+/* Bidirectional Stream API */
+
+/* Opaque object representing Bidirectional Stream. */
+typedef struct bidirectional_stream {
+  void* obj;
+  void* annotation;
+} bidirectional_stream;
+
+/* A single request or response header element. */
+typedef struct bidirectional_stream_header {
+  const char* key;
+  const char* value;
+} bidirectional_stream_header;
+
+/* Array of request or response headers or trailers. */
+typedef struct bidirectional_stream_header_array {
+  size_t count;
+  size_t capacity;
+  bidirectional_stream_header* headers;
+} bidirectional_stream_header_array;
+
+/* Set of callbacks used to receive callbacks from bidirectional stream. */
+typedef struct bidirectional_stream_callback {
+  /* Invoked when the stream is ready for reading and writing.
+   * Consumer may call bidirectional_stream_read() to start reading data.
+   * Consumer may call bidirectional_stream_write() to start writing
+   * data.
+   */
+  void (*on_stream_ready)(bidirectional_stream* stream);
+
+  /* Invoked when initial response headers are received.
+   * Consumer must call bidirectional_stream_read() to start reading.
+   * Consumer may call bidirectional_stream_write() to start writing or
+   * close the stream. Contents of |headers| is valid for duration of the call.
+   */
+  void (*on_response_headers_received)(
+      bidirectional_stream* stream,
+      const bidirectional_stream_header_array* headers,
+      const char* negotiated_protocol);
+
+  /* Invoked when data is read into the buffer passed to
+   * bidirectional_stream_read(). Only part of the buffer may be
+   * populated. To continue reading, call bidirectional_stream_read().
+   * It may be invoked after on_response_trailers_received()}, if there was
+   * pending read data before trailers were received.
+   *
+   * If |bytes_read| is 0, it means the remote side has signaled that it will
+   * send no more data; future calls to bidirectional_stream_read()
+   * will result in the on_data_read() callback or on_succeded() callback if
+   * bidirectional_stream_write() was invoked with end_of_stream set to
+   * true.
+   */
+  void (*on_read_completed)(bidirectional_stream* stream,
+                            char* data,
+                            int bytes_read);
+
+  /**
+   * Invoked when all data passed to bidirectional_stream_write() is
+   * sent. To continue writing, call bidirectional_stream_write().
+   */
+  void (*on_write_completed)(bidirectional_stream* stream, const char* data);
+
+  /* Invoked when trailers are received before closing the stream. Only invoked
+   * when server sends trailers, which it may not. May be invoked while there is
+   * read data remaining in local buffer. Contents of |trailers| is valid for
+   * duration of the call.
+   */
+  void (*on_response_trailers_received)(
+      bidirectional_stream* stream,
+      const bidirectional_stream_header_array* trailers);
+
+  /**
+   * Invoked when there is no data to be read or written and the stream is
+   * closed successfully remotely and locally. Once invoked, no further callback
+   * methods will be invoked.
+   */
+  void (*on_succeded)(bidirectional_stream* stream);
+
+  /**
+   * Invoked if the stream failed for any reason after
+   * bidirectional_stream_start(). HTTP/2 error codes are
+   * mapped to chrome net error codes. Once invoked, no further callback methods
+   * will be invoked.
+   */
+  void (*on_failed)(bidirectional_stream* stream, int net_error);
+
+  /**
+   * Invoked if the stream was canceled via
+   * bidirectional_stream_cancel(). Once invoked, no further callback
+   * methods will be invoked.
+   */
+  void (*on_canceled)(bidirectional_stream* stream);
+} bidirectional_stream_callback;
+
+/* Creates a new stream object that uses |engine| and |callback|. All stream
+ * tasks are performed asynchronously on the |engine| network thread. |callback|
+ * methods are invoked synchronously on the |engine| network thread, but must
+ * not run tasks on the current thread to prevent blocking networking operations
+ * and causing exceptions during shutdown. The |annotation| is stored in
+ * bidirectional stream for arbitrary use by application.
+ *
+ * Returned |bidirectional_stream*| is owned by the caller, and must be
+ * destroyed using |bidirectional_stream_destroy|.
+ *
+ * Both |calback| and |engine| must remain valid until stream is destroyed.
+ */
+GRPC_SUPPORT_EXPORT
+bidirectional_stream* bidirectional_stream_create(
+    stream_engine* engine,
+    void* annotation,
+    bidirectional_stream_callback* callback);
+
+/* TBD: The following methods return int. Should it be a custom type? */
+
+/* Destroys stream object. Destroy could be called from any thread, including
+ * network thread, but is posted, so |stream| is valid until calling task is
+ * complete.
+ */
+GRPC_SUPPORT_EXPORT
+int bidirectional_stream_destroy(bidirectional_stream* stream);
+
+/**
+ * Disables or enables auto flush. By default, data is flushed after
+ * every bidirectional_stream_write(). If the auto flush is disabled,
+ * the client should explicitly call bidirectional_stream_flush to flush
+ * the data.
+ */
+GRPC_SUPPORT_EXPORT void bidirectional_stream_disable_auto_flush(
+    bidirectional_stream* stream,
+    bool disable_auto_flush);
+
+/**
+ * Delays sending request headers until bidirectional_stream_flush()
+ * is called. This flag is currently only respected when QUIC is negotiated.
+ * When true, QUIC will send request header frame along with data frame(s)
+ * as a single packet when possible.
+ */
+GRPC_SUPPORT_EXPORT
+void bidirectional_stream_delay_request_headers_until_flush(
+    bidirectional_stream* stream,
+    bool delay_headers_until_flush);
+
+/* Starts the stream by sending request to |url| using |method| and |headers|.
+ * If |end_of_stream| is true, then no data is expected to be written. The
+ * |method| is HTTP verb, with PUT having a special meaning to mark idempotent
+ * request, which could use QUIC 0-RTT.
+ */
+GRPC_SUPPORT_EXPORT
+int bidirectional_stream_start(bidirectional_stream* stream,
+                               const char* url,
+                               int priority,
+                               const char* method,
+                               const bidirectional_stream_header_array* headers,
+                               bool end_of_stream);
+
+/* Reads response data into |buffer| of |capacity| length. Must only be called
+ * at most once in response to each invocation of the
+ * on_stream_ready()/on_response_headers_received() and on_read_completed()
+ * methods of the bidirectional_stream_callback.
+ * Each call will result in an invocation of the callback's
+ * on_read_completed() method if data is read, or its on_failed() method if
+ * there's an error. The callback's on_succeeded() method is also invoked if
+ * there is no more data to read and |end_of_stream| was previously sent.
+ */
+GRPC_SUPPORT_EXPORT
+int bidirectional_stream_read(bidirectional_stream* stream,
+                              char* buffer,
+                              int capacity);
+
+/* Writes request data from |buffer| of |buffer_length| length. If auto flush is
+ * disabled, data will be sent only after bidirectional_stream_flush() is
+ * called.
+ * Each call will result in an invocation the callback's on_write_completed()
+ * method if data is sent, or its on_failed() method if there's an error.
+ * The callback's on_succeeded() method is also invoked if |end_of_stream| is
+ * set and all response data has been read.
+ */
+GRPC_SUPPORT_EXPORT
+int bidirectional_stream_write(bidirectional_stream* stream,
+                               const char* buffer,
+                               int buffer_length,
+                               bool end_of_stream);
+
+/**
+ * Flushes pending writes. This method should not be called before invocation of
+ * on_stream_ready() method of the bidirectional_stream_callback.
+ * For each previously called bidirectional_stream_write()
+ * a corresponding on_write_completed() callback will be invoked when the buffer
+ * is sent.
+ */
+GRPC_SUPPORT_EXPORT
+void bidirectional_stream_flush(bidirectional_stream* stream);
+
+/* Cancels the stream. Can be called at any time after
+ * bidirectional_stream_start(). The on_canceled() method of
+ * bidirectional_stream_callback will be invoked when cancelation
+ * is complete and no further callback methods will be invoked. If the
+ * stream has completed or has not started, calling
+ * bidirectional_stream_cancel() has no effect and on_canceled() will not
+ * be invoked. At most one callback method may be invoked after
+ * bidirectional_stream_cancel() has completed.
+ */
+GRPC_SUPPORT_EXPORT
+void bidirectional_stream_cancel(bidirectional_stream* stream);
+
+/* Returns true if the |stream| was successfully started and is now done
+ * (succeeded, canceled, or failed).
+ * Returns false if the |stream| stream is not yet started or is in progress.
+ */
+GRPC_SUPPORT_EXPORT
+bool bidirectional_stream_is_done(bidirectional_stream* stream);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  // COMPONENTS_GRPC_SUPPORT_INCLUDE_BIDIRECTIONAL_STREAM_H_
diff --git a/third_party/boringssl b/third_party/boringssl
index c880e42..78684e5 160000
--- a/third_party/boringssl
+++ b/third_party/boringssl
@@ -1 +1 @@
-Subproject commit c880e42ba1c8032d4cdde2aba0541d8a9d9fa2e9
+Subproject commit 78684e5b222645828ca302e56b40b9daff2b2d27
diff --git a/third_party/gflags b/third_party/gflags
index 05b155f..f8a0efe 160000
--- a/third_party/gflags
+++ b/third_party/gflags
@@ -1 +1 @@
-Subproject commit 05b155ff59114735ec8cd089f669c4c3d8f59029
+Subproject commit f8a0efe03aa69b3336d8e228b37d4ccb17324b88
diff --git a/third_party/objective_c/Cronet/cronet_c_for_grpc.h b/third_party/objective_c/Cronet/cronet_c_for_grpc.h
deleted file mode 100644
index 15a511a..0000000
--- a/third_party/objective_c/Cronet/cronet_c_for_grpc.h
+++ /dev/null
@@ -1,202 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_CRONET_IOS_CRONET_C_FOR_GRPC_H_
-#define COMPONENTS_CRONET_IOS_CRONET_C_FOR_GRPC_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <stddef.h>
-
-/* Cronet Engine API. */
-
-/* Opaque object representing Cronet Engine. Created and configured outside
- * of this API to facilitate sharing with other components */
-typedef struct cronet_engine { void* obj; } cronet_engine;
-
-void cronet_engine_add_quic_hint(cronet_engine* engine,
-                                 const char* host,
-                                 int port,
-                                 int alternate_port);
-
-/* Cronet Bidirectional Stream API */
-
-/* Opaque object representing Cronet Bidirectional Stream. */
-typedef struct cronet_bidirectional_stream {
-  void* obj;
-  void* annotation;
-} cronet_bidirectional_stream;
-
-/* A single request or response header element. */
-typedef struct cronet_bidirectional_stream_header {
-  const char* key;
-  const char* value;
-} cronet_bidirectional_stream_header;
-
-/* Array of request or response headers or trailers. */
-typedef struct cronet_bidirectional_stream_header_array {
-  size_t count;
-  size_t capacity;
-  cronet_bidirectional_stream_header* headers;
-} cronet_bidirectional_stream_header_array;
-
-/* Set of callbacks used to receive callbacks from bidirectional stream. */
-typedef struct cronet_bidirectional_stream_callback {
-  /* Invoked when request headers are sent. Indicates that stream has initiated
-   * the request. Consumer may call cronet_bidirectional_stream_write() to start
-   * writing data.
-   */
-  void (*on_request_headers_sent)(cronet_bidirectional_stream* stream);
-
-  /* Invoked when initial response headers are received.
-   * Consumer must call cronet_bidirectional_stream_read() to start reading.
-   * Consumer may call cronet_bidirectional_stream_write() to start writing or
-   * close the stream. Contents of |headers| is valid for duration of the call.
-   */
-  void (*on_response_headers_received)(
-      cronet_bidirectional_stream* stream,
-      const cronet_bidirectional_stream_header_array* headers,
-      const char* negotiated_protocol);
-
-  /* Invoked when data is read into the buffer passed to
-   * cronet_bidirectional_stream_read(). Only part of the buffer may be
-   * populated. To continue reading, call cronet_bidirectional_stream_read().
-   * It may be invoked after on_response_trailers_received()}, if there was
-   * pending read data before trailers were received.
-   *
-   * If count is 0, it means the remote side has signaled that it will send no
-   * more data; future calls to cronet_bidirectional_stream_read() will result
-   * in the on_data_read() callback or on_succeded() callback if
-   * cronet_bidirectional_stream_write() was invoked with end_of_stream set to
-   * true.
-   */
-  void (*on_read_completed)(cronet_bidirectional_stream* stream,
-                            char* data,
-                            int count);
-
-  /**
-   * Invoked when all data passed to cronet_bidirectional_stream_write() is
-   * sent.
-   * To continue writing, call cronet_bidirectional_stream_write().
-   */
-  void (*on_write_completed)(cronet_bidirectional_stream* stream,
-                             const char* data);
-
-  /* Invoked when trailers are received before closing the stream. Only invoked
-   * when server sends trailers, which it may not. May be invoked while there is
-   * read data remaining in local buffer. Contents of |trailers| is valid for
-   * duration of the call.
-   */
-  void (*on_response_trailers_received)(
-      cronet_bidirectional_stream* stream,
-      const cronet_bidirectional_stream_header_array* trailers);
-
-  /**
-   * Invoked when there is no data to be read or written and the stream is
-   * closed successfully remotely and locally. Once invoked, no further callback
-   * methods will be invoked.
-   */
-  void (*on_succeded)(cronet_bidirectional_stream* stream);
-
-  /**
-   * Invoked if the stream failed for any reason after
-   * cronet_bidirectional_stream_start(). HTTP/2 error codes are
-   * mapped to chrome net error codes. Once invoked, no further callback methods
-   * will be invoked.
-   */
-  void (*on_failed)(cronet_bidirectional_stream* stream, int net_error);
-
-  /**
-   * Invoked if the stream was canceled via
-   * cronet_bidirectional_stream_cancel(). Once invoked, no further callback
-   * methods will be invoked.
-   */
-  void (*on_canceled)(cronet_bidirectional_stream* stream);
-} cronet_bidirectional_stream_callback;
-
-/* Create a new stream object that uses |engine| and |callback|. All stream
- * tasks are performed asynchronously on the |engine| network thread. |callback|
- * methods are invoked synchronously on the |engine| network thread, but must
- * not run tasks on the current thread to prevent blocking networking operations
- * and causing exceptions during shutdown. The |annotation| is stored in
- * bidirectional stream for arbitrary use by application.
- *
- * Returned |cronet_bidirectional_stream*| is owned by the caller, and must be
- * destroyed using |cronet_bidirectional_stream_destroy|.
- *
- * Both |calback| and |engine| must remain valid until stream is destroyed.
- */
-cronet_bidirectional_stream* cronet_bidirectional_stream_create(
-    cronet_engine* engine,
-    void* annotation,
-    cronet_bidirectional_stream_callback* callback);
-
-/* TBD: The following methods return int. Should it be a custom type? */
-
-/* Destroy stream object. Destroy could be called from any thread, including
- * network thread, but is posted, so |stream| is valid until calling task is
- * complete.
- */
-int cronet_bidirectional_stream_destroy(cronet_bidirectional_stream* stream);
-
-/* Start the stream by sending request to |url| using |method| and |headers|. If
- * |end_of_stream| is true, then no data is expected to be written.
- */
-int cronet_bidirectional_stream_start(
-    cronet_bidirectional_stream* stream,
-    const char* url,
-    int priority,
-    const char* method,
-    const cronet_bidirectional_stream_header_array* headers,
-    bool end_of_stream);
-
-/* Read response data into |buffer| of |capacity| length. Must only be called at
- * most once in response to each invocation of the
- * on_response_headers_received() and on_read_completed() methods of the
- * cronet_bidirectional_stream_callback.
- * Each call will result in an invocation of one of the callback's
- * on_read_completed  method if data is read, its on_succeeded() method if
- * the stream is closed, or its on_failed() method if there's an error.
- */
-int cronet_bidirectional_stream_read(cronet_bidirectional_stream* stream,
-                                     char* buffer,
-                                     int capacity);
-
-/* Read response data into |buffer| of |capacity| length. Must only be called at
- * most once in response to each invocation of the
- * on_response_headers_received() and on_read_completed() methods of the
- * cronet_bidirectional_stream_callback.
- * Each call will result in an invocation of one of the callback's
- * on_read_completed  method if data is read, its on_succeeded() method if
- * the stream is closed, or its on_failed() method if there's an error.
- */
-int cronet_bidirectional_stream_write(cronet_bidirectional_stream* stream,
-                                      const char* buffer,
-                                      int count,
-                                      bool end_of_stream);
-
-/* Cancels the stream. Can be called at any time after
- * cronet_bidirectional_stream_start(). The on_canceled() method of
- * cronet_bidirectional_stream_callback will be invoked when cancelation
- * is complete and no further callback methods will be invoked. If the
- * stream has completed or has not started, calling
- * cronet_bidirectional_stream_cancel() has no effect and on_canceled() will not
- * be  invoked. At most one callback method may be invoked after
- * cronet_bidirectional_stream_cancel() has completed.
- */
-int cronet_bidirectional_stream_cancel(cronet_bidirectional_stream* stream);
-
-/* Returns true if the |stream| was successfully started and is now done
- * (succeeded, canceled, or failed).
- * Returns false if the |stream| stream is not yet started or is in progress.
- */
-bool cronet_bidirectional_stream_is_done(cronet_bidirectional_stream* stream);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif  // COMPONENTS_CRONET_IOS_CRONET_C_FOR_GRPC_H_
diff --git a/tools/buildgen/generate_projects-old.sh b/tools/buildgen/generate_projects-old.sh
deleted file mode 100644
index 55d93d4..0000000
--- a/tools/buildgen/generate_projects-old.sh
+++ /dev/null
@@ -1,76 +0,0 @@
-#!/bin/sh
-# Copyright 2015, Google Inc.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-#     * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-#     * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-set -e
-
-if [ "x$TEST" = "x" ] ; then
-  TEST=false
-fi
-
-
-cd `dirname $0`/../..
-mako_renderer=tools/buildgen/mako_renderer.py
-
-if [ "x$TEST" != "x" ] ; then
-  tools/buildgen/build-cleaner.py build.yaml
-fi
-
-. tools/buildgen/generate_build_additions.sh
-
-global_plugins=`find ./tools/buildgen/plugins -name '*.py' |
-  sort | grep -v __init__ | awk ' { printf "-p %s ", $0 } '`
-
-for dir in . ; do
-  local_plugins=`find $dir/templates -name '*.py' |
-    sort | grep -v __init__ | awk ' { printf "-p %s ", $0 } '`
-
-  plugins="$global_plugins $local_plugins"
-
-  find -L $dir/templates -type f -and -name *.template | while read file ; do
-    out=${dir}/${file#$dir/templates/}  # strip templates dir prefix
-    out=${out%.*}  # strip template extension
-    echo "generating file: $out"
-    yaml_files="build.yaml $gen_build_files"
-    data=`for i in $yaml_files ; do echo $i ; done | awk ' { printf "-d %s ", $0 } '`
-    if [ "x$TEST" = "xtrue" ] ; then
-      actual_out=$out
-      out=`mktemp /tmp/gentXXXXXX`
-    fi
-    mkdir -p `dirname $out`  # make sure dest directory exist
-    $mako_renderer $plugins $data -o $out $file
-    if [ "x$TEST" = "xtrue" ] ; then
-      diff -q $out $actual_out
-      rm $out
-    fi
-  done
-done
-
-rm $gen_build_files
diff --git a/tools/distrib/python/docgen.py b/tools/distrib/python/docgen.py
index 38ffcd6..fddaa2b 100755
--- a/tools/distrib/python/docgen.py
+++ b/tools/distrib/python/docgen.py
@@ -28,11 +28,14 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+from __future__ import print_function
+
 import argparse
 import os
 import os.path
 import shutil
 import subprocess
+import sys
 import tempfile
 
 parser = argparse.ArgumentParser()
@@ -99,6 +102,7 @@
   python_doc_dir = os.path.join(repo_dir, 'python')
   doc_branch = args.doc_branch
 
+  print('Cloning your repository...')
   subprocess.check_call([
           'git', 'clone', 'https://{}@github.com/{}/grpc'.format(
               github_user, github_repository_owner)
@@ -110,13 +114,20 @@
   subprocess.check_call([
           'git', 'checkout', 'upstream/gh-pages', '-b', doc_branch
       ], cwd=repo_dir)
+  print('Updating documentation...')
   shutil.rmtree(python_doc_dir, ignore_errors=True)
   shutil.copytree(DOC_PATH, python_doc_dir)
-  subprocess.check_call(['git', 'add', '--all'], cwd=repo_dir)
-  subprocess.check_call([
-          'git', 'commit', '-m', 'Auto-update Python documentation'
-      ], cwd=repo_dir)
-  subprocess.check_call([
-          'git', 'push', '--set-upstream', 'origin', doc_branch
-      ], cwd=repo_dir)
+  print('Attempting to push documentation...')
+  try:
+    subprocess.check_call(['git', 'add', '--all'], cwd=repo_dir)
+    subprocess.check_call([
+            'git', 'commit', '-m', 'Auto-update Python documentation'
+        ], cwd=repo_dir)
+    subprocess.check_call([
+            'git', 'push', '--set-upstream', 'origin', doc_branch
+        ], cwd=repo_dir)
+  except subprocess.CalledProcessError:
+    print('Failed to push documentation. Examine this directory and push '
+          'manually: {}'.format(repo_parent_dir))
+    sys.exit(1)
   shutil.rmtree(repo_parent_dir)
diff --git a/src/ruby/tools/os_check.rb b/tools/distrib/yapf_code.sh
old mode 100644
new mode 100755
similarity index 65%
copy from src/ruby/tools/os_check.rb
copy to tools/distrib/yapf_code.sh
index 2677306..e3ebf1c
--- a/src/ruby/tools/os_check.rb
+++ b/tools/distrib/yapf_code.sh
@@ -1,4 +1,5 @@
-# Copyright 2016, Google Inc.
+#!/bin/bash
+# Copyright 2015, Google Inc.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -27,19 +28,33 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-# This is based on http://stackoverflow.com/a/171011/159388 by Aaron Hinni
+set -ex
 
-require 'rbconfig'
+# change to root directory
+cd $(dirname $0)/../..
 
-module OS
-  def OS.os_name
-    case RbConfig::CONFIG['host_os']
-    when /cygwin|mswin|mingw|bccwin|wince|emx/
-      'windows'
-    when /darwin/
-      'macos'
-    else
-      'linux'
-    end
-  end
-end
+DIRS=src/python
+EXCLUSIONS='src/python/grpcio/grpc_*.py src/python/grpcio_health_checking/grpc_*.py src/python/grpcio_reflection/grpc_*.py src/python/grpcio_tests/grpc_*.py'
+
+VIRTUALENV=python_format_venv
+
+virtualenv $VIRTUALENV
+PYTHON=`realpath $VIRTUALENV/bin/python`
+$PYTHON -m pip install --upgrade futures yapf
+
+exclusion_args=""
+for exclusion in $EXCLUSIONS; do
+  exclusion_args="$exclusion_args --exclude $exclusion"
+done
+
+script_result=0
+for dir in $DIRS; do
+  tempdir=`mktemp -d`
+  cp -RT $dir $tempdir
+  $PYTHON -m yapf -i -r -p $exclusion_args $dir
+  if ! diff -rq $dir $tempdir; then
+    script_result=1
+  fi
+  rm -rf $tempdir
+done
+exit $script_result
diff --git a/tools/dockerfile/interoptest/grpc_interop_http2/Dockerfile b/tools/dockerfile/interoptest/grpc_interop_http2/Dockerfile
index 05e963d..3a5e15d 100644
--- a/tools/dockerfile/interoptest/grpc_interop_http2/Dockerfile
+++ b/tools/dockerfile/interoptest/grpc_interop_http2/Dockerfile
@@ -47,5 +47,7 @@
 RUN pip install virtualenv
 RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.0.0a2 six==1.10.0
 
+RUN pip install twisted h2
+
 # Define the default command.
 CMD ["bash"]
diff --git a/tools/doxygen/Doxyfile.c++ b/tools/doxygen/Doxyfile.c++
index 84daed1..af844d6 100644
--- a/tools/doxygen/Doxyfile.c++
+++ b/tools/doxygen/Doxyfile.c++
@@ -785,6 +785,7 @@
 doc/negative-http2-interop-test-descriptions.md \
 doc/server-reflection.md \
 doc/server_reflection_tutorial.md \
+doc/service_config.md \
 doc/statuscodes.md \
 doc/stress_test_framework.md \
 doc/wait-for-ready.md \
diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal
index 37e4ad3..2b2d8a3 100644
--- a/tools/doxygen/Doxyfile.c++.internal
+++ b/tools/doxygen/Doxyfile.c++.internal
@@ -785,6 +785,7 @@
 doc/negative-http2-interop-test-descriptions.md \
 doc/server-reflection.md \
 doc/server_reflection_tutorial.md \
+doc/service_config.md \
 doc/statuscodes.md \
 doc/stress_test_framework.md \
 doc/wait-for-ready.md \
diff --git a/tools/doxygen/Doxyfile.core b/tools/doxygen/Doxyfile.core
index da99037..2f9f021 100644
--- a/tools/doxygen/Doxyfile.core
+++ b/tools/doxygen/Doxyfile.core
@@ -784,6 +784,7 @@
 doc/negative-http2-interop-test-descriptions.md \
 doc/server-reflection.md \
 doc/server_reflection_tutorial.md \
+doc/service_config.md \
 doc/statuscodes.md \
 doc/stress_test_framework.md \
 doc/wait-for-ready.md \
diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal
index 64ec0d4..30d4e8f 100644
--- a/tools/doxygen/Doxyfile.core.internal
+++ b/tools/doxygen/Doxyfile.core.internal
@@ -784,6 +784,7 @@
 doc/negative-http2-interop-test-descriptions.md \
 doc/server-reflection.md \
 doc/server_reflection_tutorial.md \
+doc/service_config.md \
 doc/statuscodes.md \
 doc/stress_test_framework.md \
 doc/wait-for-ready.md \
@@ -896,6 +897,8 @@
 src/core/ext/client_channel/default_initial_connect_string.c \
 src/core/ext/client_channel/http_connect_handshaker.c \
 src/core/ext/client_channel/http_connect_handshaker.h \
+src/core/ext/client_channel/http_proxy.c \
+src/core/ext/client_channel/http_proxy.h \
 src/core/ext/client_channel/initial_connect_string.c \
 src/core/ext/client_channel/initial_connect_string.h \
 src/core/ext/client_channel/lb_policy.c \
diff --git a/src/ruby/tools/os_check.rb b/tools/internal_ci/linux/grpc_fuzzer_api.cfg
similarity index 81%
copy from src/ruby/tools/os_check.rb
copy to tools/internal_ci/linux/grpc_fuzzer_api.cfg
index 2677306..a34fb9d 100644
--- a/src/ruby/tools/os_check.rb
+++ b/tools/internal_ci/linux/grpc_fuzzer_api.cfg
@@ -1,3 +1,4 @@
+#!/bin/bash
 # Copyright 2016, Google Inc.
 # All rights reserved.
 #
@@ -27,19 +28,13 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-# This is based on http://stackoverflow.com/a/171011/159388 by Aaron Hinni
+# Config file for the internal CI (in protobuf text format)
 
-require 'rbconfig'
-
-module OS
-  def OS.os_name
-    case RbConfig::CONFIG['host_os']
-    when /cygwin|mswin|mingw|bccwin|wince|emx/
-      'windows'
-    when /darwin/
-      'macos'
-    else
-      'linux'
-    end
-  end
-end
+# Location of the continuous shell script in repository.
+build_file: "grpc/tools/internal_ci/linux/grpc_fuzzer_api.sh"
+timeout_mins: 1440  # 24 hours is the maximum allowed value
+action {
+  define_artifacts {
+    regex: "git/grpc/fuzzer_output/**"
+  }
+}
diff --git a/src/ruby/tools/os_check.rb b/tools/internal_ci/linux/grpc_fuzzer_api.sh
old mode 100644
new mode 100755
similarity index 83%
copy from src/ruby/tools/os_check.rb
copy to tools/internal_ci/linux/grpc_fuzzer_api.sh
index 2677306..c3cf110
--- a/src/ruby/tools/os_check.rb
+++ b/tools/internal_ci/linux/grpc_fuzzer_api.sh
@@ -1,3 +1,4 @@
+#!/bin/bash
 # Copyright 2016, Google Inc.
 # All rights reserved.
 #
@@ -27,19 +28,14 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-# This is based on http://stackoverflow.com/a/171011/159388 by Aaron Hinni
+set -ex
 
-require 'rbconfig'
+# change to grpc repo root
+cd $(dirname $0)/../../..
 
-module OS
-  def OS.os_name
-    case RbConfig::CONFIG['host_os']
-    when /cygwin|mswin|mingw|bccwin|wince|emx/
-      'windows'
-    when /darwin/
-      'macos'
-    else
-      'linux'
-    end
-  end
-end
+git submodule update --init
+
+# download fuzzer docker image from dockerhub
+export DOCKERHUB_ORGANIZATION=grpctesting
+# runtime 23 * 60 mins
+config=asan-trace-cmp runtime=86400 tools/jenkins/run_fuzzer.sh api_fuzzer
diff --git a/src/ruby/tools/os_check.rb b/tools/internal_ci/linux/grpc_fuzzer_hpack_parser.cfg
similarity index 81%
copy from src/ruby/tools/os_check.rb
copy to tools/internal_ci/linux/grpc_fuzzer_hpack_parser.cfg
index 2677306..215ce2b 100644
--- a/src/ruby/tools/os_check.rb
+++ b/tools/internal_ci/linux/grpc_fuzzer_hpack_parser.cfg
@@ -1,3 +1,4 @@
+#!/bin/bash
 # Copyright 2016, Google Inc.
 # All rights reserved.
 #
@@ -27,19 +28,13 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-# This is based on http://stackoverflow.com/a/171011/159388 by Aaron Hinni
+# Config file for the internal CI (in protobuf text format)
 
-require 'rbconfig'
-
-module OS
-  def OS.os_name
-    case RbConfig::CONFIG['host_os']
-    when /cygwin|mswin|mingw|bccwin|wince|emx/
-      'windows'
-    when /darwin/
-      'macos'
-    else
-      'linux'
-    end
-  end
-end
+# Location of the continuous shell script in repository.
+build_file: "grpc/tools/internal_ci/linux/grpc_fuzzer_hpack_parser.sh"
+timeout_mins: 1440  # 24 hours is the maximum allowed value
+action {
+  define_artifacts {
+    regex: "git/grpc/fuzzer_output/**"
+  }
+}
diff --git a/src/ruby/tools/os_check.rb b/tools/internal_ci/linux/grpc_fuzzer_hpack_parser.sh
old mode 100644
new mode 100755
similarity index 83%
copy from src/ruby/tools/os_check.rb
copy to tools/internal_ci/linux/grpc_fuzzer_hpack_parser.sh
index 2677306..d9a73a6
--- a/src/ruby/tools/os_check.rb
+++ b/tools/internal_ci/linux/grpc_fuzzer_hpack_parser.sh
@@ -1,3 +1,4 @@
+#!/bin/bash
 # Copyright 2016, Google Inc.
 # All rights reserved.
 #
@@ -27,19 +28,15 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-# This is based on http://stackoverflow.com/a/171011/159388 by Aaron Hinni
+set -ex
 
-require 'rbconfig'
+# change to grpc repo root
+cd $(dirname $0)/../../..
 
-module OS
-  def OS.os_name
-    case RbConfig::CONFIG['host_os']
-    when /cygwin|mswin|mingw|bccwin|wince|emx/
-      'windows'
-    when /darwin/
-      'macos'
-    else
-      'linux'
-    end
-  end
-end
+git submodule update --init
+
+# download fuzzer docker image from dockerhub
+export DOCKERHUB_ORGANIZATION=grpctesting
+# runtime 23 * 60 mins
+config=asan-trace-cmp tools/jenkins/run_fuzzer.sh hpack_parser_fuzzer_test
+
diff --git a/src/ruby/tools/os_check.rb b/tools/internal_ci/linux/grpc_fuzzer_http_request.cfg
similarity index 81%
copy from src/ruby/tools/os_check.rb
copy to tools/internal_ci/linux/grpc_fuzzer_http_request.cfg
index 2677306..120e8f8 100644
--- a/src/ruby/tools/os_check.rb
+++ b/tools/internal_ci/linux/grpc_fuzzer_http_request.cfg
@@ -1,3 +1,4 @@
+#!/bin/bash
 # Copyright 2016, Google Inc.
 # All rights reserved.
 #
@@ -27,19 +28,13 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-# This is based on http://stackoverflow.com/a/171011/159388 by Aaron Hinni
+# Config file for the internal CI (in protobuf text format)
 
-require 'rbconfig'
-
-module OS
-  def OS.os_name
-    case RbConfig::CONFIG['host_os']
-    when /cygwin|mswin|mingw|bccwin|wince|emx/
-      'windows'
-    when /darwin/
-      'macos'
-    else
-      'linux'
-    end
-  end
-end
+# Location of the continuous shell script in repository.
+build_file: "grpc/tools/internal_ci/linux/grpc_fuzzer_http_request.sh"
+timeout_mins: 1440  # 24 hours is the maximum allowed value
+action {
+  define_artifacts {
+    regex: "git/grpc/fuzzer_output/**"
+  }
+}
diff --git a/src/ruby/tools/os_check.rb b/tools/internal_ci/linux/grpc_fuzzer_http_request.sh
old mode 100644
new mode 100755
similarity index 83%
copy from src/ruby/tools/os_check.rb
copy to tools/internal_ci/linux/grpc_fuzzer_http_request.sh
index 2677306..d412d92
--- a/src/ruby/tools/os_check.rb
+++ b/tools/internal_ci/linux/grpc_fuzzer_http_request.sh
@@ -1,3 +1,4 @@
+#!/bin/bash
 # Copyright 2016, Google Inc.
 # All rights reserved.
 #
@@ -27,19 +28,15 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-# This is based on http://stackoverflow.com/a/171011/159388 by Aaron Hinni
+set -ex
 
-require 'rbconfig'
+# change to grpc repo root
+cd $(dirname $0)/../../..
 
-module OS
-  def OS.os_name
-    case RbConfig::CONFIG['host_os']
-    when /cygwin|mswin|mingw|bccwin|wince|emx/
-      'windows'
-    when /darwin/
-      'macos'
-    else
-      'linux'
-    end
-  end
-end
+git submodule update --init
+
+# download fuzzer docker image from dockerhub
+export DOCKERHUB_ORGANIZATION=grpctesting
+# runtime 23 * 60 mins
+config=asan-trace-cmp tools/jenkins/run_fuzzer.sh http_request_fuzzer_test
+
diff --git a/src/ruby/tools/os_check.rb b/tools/internal_ci/linux/grpc_fuzzer_json.cfg
similarity index 81%
copy from src/ruby/tools/os_check.rb
copy to tools/internal_ci/linux/grpc_fuzzer_json.cfg
index 2677306..cab4f29 100644
--- a/src/ruby/tools/os_check.rb
+++ b/tools/internal_ci/linux/grpc_fuzzer_json.cfg
@@ -1,3 +1,4 @@
+#!/bin/bash
 # Copyright 2016, Google Inc.
 # All rights reserved.
 #
@@ -27,19 +28,13 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-# This is based on http://stackoverflow.com/a/171011/159388 by Aaron Hinni
+# Config file for the internal CI (in protobuf text format)
 
-require 'rbconfig'
-
-module OS
-  def OS.os_name
-    case RbConfig::CONFIG['host_os']
-    when /cygwin|mswin|mingw|bccwin|wince|emx/
-      'windows'
-    when /darwin/
-      'macos'
-    else
-      'linux'
-    end
-  end
-end
+# Location of the continuous shell script in repository.
+build_file: "grpc/tools/internal_ci/linux/grpc_fuzzer_json.sh"
+timeout_mins: 1440  # 24 hours is the maximum allowed value
+action {
+  define_artifacts {
+    regex: "git/grpc/fuzzer_output/**"
+  }
+}
diff --git a/src/ruby/tools/os_check.rb b/tools/internal_ci/linux/grpc_fuzzer_json.sh
old mode 100644
new mode 100755
similarity index 83%
copy from src/ruby/tools/os_check.rb
copy to tools/internal_ci/linux/grpc_fuzzer_json.sh
index 2677306..d9869f6
--- a/src/ruby/tools/os_check.rb
+++ b/tools/internal_ci/linux/grpc_fuzzer_json.sh
@@ -1,3 +1,4 @@
+#!/bin/bash
 # Copyright 2016, Google Inc.
 # All rights reserved.
 #
@@ -27,19 +28,15 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-# This is based on http://stackoverflow.com/a/171011/159388 by Aaron Hinni
+set -ex
 
-require 'rbconfig'
+# change to grpc repo root
+cd $(dirname $0)/../../..
 
-module OS
-  def OS.os_name
-    case RbConfig::CONFIG['host_os']
-    when /cygwin|mswin|mingw|bccwin|wince|emx/
-      'windows'
-    when /darwin/
-      'macos'
-    else
-      'linux'
-    end
-  end
-end
+git submodule update --init
+
+# download fuzzer docker image from dockerhub
+export DOCKERHUB_ORGANIZATION=grpctesting
+# runtime 23 * 60 mins
+config=asan-trace-cmp tools/jenkins/run_fuzzer.sh json_fuzzer_test
+
diff --git a/src/ruby/tools/os_check.rb b/tools/internal_ci/linux/grpc_fuzzer_nanopb_response.cfg
similarity index 81%
copy from src/ruby/tools/os_check.rb
copy to tools/internal_ci/linux/grpc_fuzzer_nanopb_response.cfg
index 2677306..c73aa81 100644
--- a/src/ruby/tools/os_check.rb
+++ b/tools/internal_ci/linux/grpc_fuzzer_nanopb_response.cfg
@@ -1,3 +1,4 @@
+#!/bin/bash
 # Copyright 2016, Google Inc.
 # All rights reserved.
 #
@@ -27,19 +28,13 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-# This is based on http://stackoverflow.com/a/171011/159388 by Aaron Hinni
+# Config file for the internal CI (in protobuf text format)
 
-require 'rbconfig'
-
-module OS
-  def OS.os_name
-    case RbConfig::CONFIG['host_os']
-    when /cygwin|mswin|mingw|bccwin|wince|emx/
-      'windows'
-    when /darwin/
-      'macos'
-    else
-      'linux'
-    end
-  end
-end
+# Location of the continuous shell script in repository.
+build_file: "grpc/tools/internal_ci/linux/grpc_fuzzer_nanopb_response.sh"
+timeout_mins: 1440  # 24 hours is the maximum allowed value
+action {
+  define_artifacts {
+    regex: "git/grpc/fuzzer_output/**"
+  }
+}
diff --git a/src/ruby/tools/os_check.rb b/tools/internal_ci/linux/grpc_fuzzer_nanopb_response.sh
old mode 100644
new mode 100755
similarity index 83%
copy from src/ruby/tools/os_check.rb
copy to tools/internal_ci/linux/grpc_fuzzer_nanopb_response.sh
index 2677306..0a7187f
--- a/src/ruby/tools/os_check.rb
+++ b/tools/internal_ci/linux/grpc_fuzzer_nanopb_response.sh
@@ -1,3 +1,4 @@
+#!/bin/bash
 # Copyright 2016, Google Inc.
 # All rights reserved.
 #
@@ -27,19 +28,14 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-# This is based on http://stackoverflow.com/a/171011/159388 by Aaron Hinni
+set -ex
 
-require 'rbconfig'
+# change to grpc repo root
+cd $(dirname $0)/../../..
 
-module OS
-  def OS.os_name
-    case RbConfig::CONFIG['host_os']
-    when /cygwin|mswin|mingw|bccwin|wince|emx/
-      'windows'
-    when /darwin/
-      'macos'
-    else
-      'linux'
-    end
-  end
-end
+git submodule update --init
+
+# download fuzzer docker image from dockerhub
+export DOCKERHUB_ORGANIZATION=grpctesting
+# runtime 23 * 60 mins
+config=asan-trace-cmp tools/jenkins/run_fuzzer.sh nanopb_fuzzer_response_test
diff --git a/src/ruby/tools/os_check.rb b/tools/internal_ci/linux/grpc_fuzzer_server.cfg
similarity index 81%
copy from src/ruby/tools/os_check.rb
copy to tools/internal_ci/linux/grpc_fuzzer_server.cfg
index 2677306..a1931cb 100644
--- a/src/ruby/tools/os_check.rb
+++ b/tools/internal_ci/linux/grpc_fuzzer_server.cfg
@@ -1,3 +1,4 @@
+#!/bin/bash
 # Copyright 2016, Google Inc.
 # All rights reserved.
 #
@@ -27,19 +28,13 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-# This is based on http://stackoverflow.com/a/171011/159388 by Aaron Hinni
+# Config file for the internal CI (in protobuf text format)
 
-require 'rbconfig'
-
-module OS
-  def OS.os_name
-    case RbConfig::CONFIG['host_os']
-    when /cygwin|mswin|mingw|bccwin|wince|emx/
-      'windows'
-    when /darwin/
-      'macos'
-    else
-      'linux'
-    end
-  end
-end
+# Location of the continuous shell script in repository.
+build_file: "grpc/tools/internal_ci/linux/grpc_fuzzer_server.sh"
+timeout_mins: 1440  # 24 hours is the maximum allowed value
+action {
+  define_artifacts {
+    regex: "git/grpc/fuzzer_output/**"
+  }
+}
diff --git a/src/ruby/tools/os_check.rb b/tools/internal_ci/linux/grpc_fuzzer_server.sh
old mode 100644
new mode 100755
similarity index 83%
copy from src/ruby/tools/os_check.rb
copy to tools/internal_ci/linux/grpc_fuzzer_server.sh
index 2677306..e00e940
--- a/src/ruby/tools/os_check.rb
+++ b/tools/internal_ci/linux/grpc_fuzzer_server.sh
@@ -1,3 +1,4 @@
+#!/bin/bash
 # Copyright 2016, Google Inc.
 # All rights reserved.
 #
@@ -27,19 +28,14 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-# This is based on http://stackoverflow.com/a/171011/159388 by Aaron Hinni
+set -ex
 
-require 'rbconfig'
+# change to grpc repo root
+cd $(dirname $0)/../../..
 
-module OS
-  def OS.os_name
-    case RbConfig::CONFIG['host_os']
-    when /cygwin|mswin|mingw|bccwin|wince|emx/
-      'windows'
-    when /darwin/
-      'macos'
-    else
-      'linux'
-    end
-  end
-end
+git submodule update --init
+
+# download fuzzer docker image from dockerhub
+export DOCKERHUB_ORGANIZATION=grpctesting
+# runtime 23 * 60 mins
+config=asan-trace-cmp runtime=86400 tools/jenkins/run_fuzzer.sh server_fuzzer
diff --git a/src/ruby/tools/os_check.rb b/tools/internal_ci/linux/grpc_fuzzer_uri.cfg
similarity index 81%
copy from src/ruby/tools/os_check.rb
copy to tools/internal_ci/linux/grpc_fuzzer_uri.cfg
index 2677306..c312ae0 100644
--- a/src/ruby/tools/os_check.rb
+++ b/tools/internal_ci/linux/grpc_fuzzer_uri.cfg
@@ -1,3 +1,4 @@
+#!/bin/bash
 # Copyright 2016, Google Inc.
 # All rights reserved.
 #
@@ -27,19 +28,13 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-# This is based on http://stackoverflow.com/a/171011/159388 by Aaron Hinni
+# Config file for the internal CI (in protobuf text format)
 
-require 'rbconfig'
-
-module OS
-  def OS.os_name
-    case RbConfig::CONFIG['host_os']
-    when /cygwin|mswin|mingw|bccwin|wince|emx/
-      'windows'
-    when /darwin/
-      'macos'
-    else
-      'linux'
-    end
-  end
-end
+# Location of the continuous shell script in repository.
+build_file: "grpc/tools/internal_ci/linux/grpc_fuzzer_uri.sh"
+timeout_mins: 1440  # 24 hours is the maximum allowed value
+action {
+  define_artifacts {
+    regex: "git/grpc/fuzzer_output/**"
+  }
+}
diff --git a/src/ruby/tools/os_check.rb b/tools/internal_ci/linux/grpc_fuzzer_uri.sh
old mode 100644
new mode 100755
similarity index 83%
copy from src/ruby/tools/os_check.rb
copy to tools/internal_ci/linux/grpc_fuzzer_uri.sh
index 2677306..4137f80
--- a/src/ruby/tools/os_check.rb
+++ b/tools/internal_ci/linux/grpc_fuzzer_uri.sh
@@ -1,3 +1,4 @@
+#!/bin/bash
 # Copyright 2016, Google Inc.
 # All rights reserved.
 #
@@ -27,19 +28,14 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-# This is based on http://stackoverflow.com/a/171011/159388 by Aaron Hinni
+set -ex
 
-require 'rbconfig'
+# change to grpc repo root
+cd $(dirname $0)/../../..
 
-module OS
-  def OS.os_name
-    case RbConfig::CONFIG['host_os']
-    when /cygwin|mswin|mingw|bccwin|wince|emx/
-      'windows'
-    when /darwin/
-      'macos'
-    else
-      'linux'
-    end
-  end
-end
+git submodule update --init
+
+# download fuzzer docker image from dockerhub
+export DOCKERHUB_ORGANIZATION=grpctesting
+# runtime 23 * 60 mins
+config=asan-trace-cmp tools/jenkins/run_fuzzer.sh uri_fuzzer_test
diff --git a/tools/jenkins/build_artifacts.sh b/tools/jenkins/build_artifacts.sh
index c0acbdf..b15db2c 100755
--- a/tools/jenkins/build_artifacts.sh
+++ b/tools/jenkins/build_artifacts.sh
@@ -40,7 +40,7 @@
 unset platform  # variable named 'platform' breaks the windows build
 
 if [ "$curr_platform" == "linux" ] && [ "$language" == "ruby" ] ; then
-  ./tools/run_tests/build_artifact_ruby.sh
+  ./tools/run_tests/artifacts/build_artifact_ruby.sh
 else
   python tools/run_tests/task_runner.py -f artifact $language $curr_platform $architecture
 fi
diff --git a/tools/run_tests/artifacts/build_artifact_protoc.bat b/tools/run_tests/artifacts/build_artifact_protoc.bat
index fd93318..b2bf86d 100644
--- a/tools/run_tests/artifacts/build_artifact_protoc.bat
+++ b/tools/run_tests/artifacts/build_artifact_protoc.bat
@@ -34,7 +34,7 @@
 
 mkdir build & cd build
 mkdir solution & cd solution
-cmake -G "%generator%" -Dprotobuf_BUILD_TESTS=OFF ../../.. || goto :error
+cmake -G "%generator%" -Dprotobuf_BUILD_TESTS=OFF ../.. || goto :error
 endlocal
 
 call vsprojects/build_plugins.bat || goto :error
diff --git a/tools/run_tests/generated/sources_and_headers.json b/tools/run_tests/generated/sources_and_headers.json
index 4005284..a7d2283 100644
--- a/tools/run_tests/generated/sources_and_headers.json
+++ b/tools/run_tests/generated/sources_and_headers.json
@@ -3370,19 +3370,21 @@
       "test/cpp/interop/client_helper.h", 
       "test/cpp/interop/interop_client.h", 
       "test/cpp/interop/stress_interop_client.h", 
+      "test/cpp/util/create_test_channel.h", 
       "test/cpp/util/metrics_server.h"
     ], 
     "is_filegroup": false, 
     "language": "c++", 
     "name": "stress_test", 
     "src": [
-      "test/cpp/interop/client_helper.cc", 
       "test/cpp/interop/client_helper.h", 
       "test/cpp/interop/interop_client.cc", 
       "test/cpp/interop/interop_client.h", 
       "test/cpp/interop/stress_interop_client.cc", 
       "test/cpp/interop/stress_interop_client.h", 
       "test/cpp/interop/stress_test.cc", 
+      "test/cpp/util/create_test_channel.cc", 
+      "test/cpp/util/create_test_channel.h", 
       "test/cpp/util/metrics_server.cc", 
       "test/cpp/util/metrics_server.h"
     ], 
@@ -3527,6 +3529,20 @@
   {
     "deps": [
       "boringssl", 
+      "boringssl_chacha_test_lib", 
+      "boringssl_test_util"
+    ], 
+    "headers": [], 
+    "is_filegroup": false, 
+    "language": "c++", 
+    "name": "boringssl_chacha_test", 
+    "src": [], 
+    "third_party": true, 
+    "type": "target"
+  }, 
+  {
+    "deps": [
+      "boringssl", 
       "boringssl_aead_test_lib", 
       "boringssl_test_util"
     ], 
@@ -3597,6 +3613,20 @@
   {
     "deps": [
       "boringssl", 
+      "boringssl_spake25519_test_lib", 
+      "boringssl_test_util"
+    ], 
+    "headers": [], 
+    "is_filegroup": false, 
+    "language": "c++", 
+    "name": "boringssl_spake25519_test", 
+    "src": [], 
+    "third_party": true, 
+    "type": "target"
+  }, 
+  {
+    "deps": [
+      "boringssl", 
       "boringssl_test_util", 
       "boringssl_x25519_test_lib"
     ], 
@@ -3681,6 +3711,34 @@
   {
     "deps": [
       "boringssl", 
+      "boringssl_ecdh_test_lib", 
+      "boringssl_test_util"
+    ], 
+    "headers": [], 
+    "is_filegroup": false, 
+    "language": "c++", 
+    "name": "boringssl_ecdh_test", 
+    "src": [], 
+    "third_party": true, 
+    "type": "target"
+  }, 
+  {
+    "deps": [
+      "boringssl", 
+      "boringssl_ecdsa_sign_test_lib", 
+      "boringssl_test_util"
+    ], 
+    "headers": [], 
+    "is_filegroup": false, 
+    "language": "c++", 
+    "name": "boringssl_ecdsa_sign_test", 
+    "src": [], 
+    "third_party": true, 
+    "type": "target"
+  }, 
+  {
+    "deps": [
+      "boringssl", 
       "boringssl_ecdsa_test_lib", 
       "boringssl_test_util"
     ], 
@@ -3695,6 +3753,20 @@
   {
     "deps": [
       "boringssl", 
+      "boringssl_ecdsa_verify_test_lib", 
+      "boringssl_test_util"
+    ], 
+    "headers": [], 
+    "is_filegroup": false, 
+    "language": "c++", 
+    "name": "boringssl_ecdsa_verify_test", 
+    "src": [], 
+    "third_party": true, 
+    "type": "target"
+  }, 
+  {
+    "deps": [
+      "boringssl", 
       "boringssl_err_test_lib", 
       "boringssl_test_util"
     ], 
@@ -3807,6 +3879,62 @@
   {
     "deps": [
       "boringssl", 
+      "boringssl_newhope_statistical_test_lib", 
+      "boringssl_test_util"
+    ], 
+    "headers": [], 
+    "is_filegroup": false, 
+    "language": "c++", 
+    "name": "boringssl_newhope_statistical_test", 
+    "src": [], 
+    "third_party": true, 
+    "type": "target"
+  }, 
+  {
+    "deps": [
+      "boringssl", 
+      "boringssl_newhope_test_lib", 
+      "boringssl_test_util"
+    ], 
+    "headers": [], 
+    "is_filegroup": false, 
+    "language": "c++", 
+    "name": "boringssl_newhope_test", 
+    "src": [], 
+    "third_party": true, 
+    "type": "target"
+  }, 
+  {
+    "deps": [
+      "boringssl", 
+      "boringssl_newhope_vectors_test_lib", 
+      "boringssl_test_util"
+    ], 
+    "headers": [], 
+    "is_filegroup": false, 
+    "language": "c++", 
+    "name": "boringssl_newhope_vectors_test", 
+    "src": [], 
+    "third_party": true, 
+    "type": "target"
+  }, 
+  {
+    "deps": [
+      "boringssl", 
+      "boringssl_obj_test_lib", 
+      "boringssl_test_util"
+    ], 
+    "headers": [], 
+    "is_filegroup": false, 
+    "language": "c++", 
+    "name": "boringssl_obj_test", 
+    "src": [], 
+    "third_party": true, 
+    "type": "target"
+  }, 
+  {
+    "deps": [
+      "boringssl", 
       "boringssl_pkcs12_test_lib", 
       "boringssl_test_util"
     ], 
@@ -3947,20 +4075,6 @@
   {
     "deps": [
       "boringssl", 
-      "boringssl_pqueue_test_lib", 
-      "boringssl_test_util"
-    ], 
-    "headers": [], 
-    "is_filegroup": false, 
-    "language": "c++", 
-    "name": "boringssl_pqueue_test", 
-    "src": [], 
-    "third_party": true, 
-    "type": "target"
-  }, 
-  {
-    "deps": [
-      "boringssl", 
       "boringssl_ssl_test_lib", 
       "boringssl_test_util"
     ], 
@@ -5621,7 +5735,6 @@
       "test/cpp/qps/driver.h", 
       "test/cpp/qps/histogram.h", 
       "test/cpp/qps/interarrival.h", 
-      "test/cpp/qps/limit_cores.h", 
       "test/cpp/qps/parse_json.h", 
       "test/cpp/qps/qps_worker.h", 
       "test/cpp/qps/report.h", 
@@ -5641,8 +5754,6 @@
       "test/cpp/qps/driver.h", 
       "test/cpp/qps/histogram.h", 
       "test/cpp/qps/interarrival.h", 
-      "test/cpp/qps/limit_cores.cc", 
-      "test/cpp/qps/limit_cores.h", 
       "test/cpp/qps/parse_json.cc", 
       "test/cpp/qps/parse_json.h", 
       "test/cpp/qps/qps_worker.cc", 
@@ -5690,23 +5801,22 @@
       "third_party/boringssl/crypto/conf/internal.h", 
       "third_party/boringssl/crypto/curve25519/internal.h", 
       "third_party/boringssl/crypto/des/internal.h", 
-      "third_party/boringssl/crypto/dh/internal.h", 
       "third_party/boringssl/crypto/digest/internal.h", 
       "third_party/boringssl/crypto/digest/md32_common.h", 
-      "third_party/boringssl/crypto/directory.h", 
       "third_party/boringssl/crypto/ec/internal.h", 
       "third_party/boringssl/crypto/ec/p256-x86_64-table.h", 
       "third_party/boringssl/crypto/evp/internal.h", 
       "third_party/boringssl/crypto/internal.h", 
       "third_party/boringssl/crypto/modes/internal.h", 
+      "third_party/boringssl/crypto/newhope/internal.h", 
       "third_party/boringssl/crypto/obj/obj_dat.h", 
       "third_party/boringssl/crypto/obj/obj_xref.h", 
       "third_party/boringssl/crypto/pkcs8/internal.h", 
+      "third_party/boringssl/crypto/poly1305/internal.h", 
       "third_party/boringssl/crypto/rand/internal.h", 
       "third_party/boringssl/crypto/rsa/internal.h", 
-      "third_party/boringssl/crypto/test/scoped_types.h", 
-      "third_party/boringssl/crypto/test/test_util.h", 
       "third_party/boringssl/crypto/x509/charmap.h", 
+      "third_party/boringssl/crypto/x509/internal.h", 
       "third_party/boringssl/crypto/x509/vpm_int.h", 
       "third_party/boringssl/crypto/x509v3/ext_dat.h", 
       "third_party/boringssl/crypto/x509v3/pcy_int.h", 
@@ -5752,10 +5862,12 @@
       "third_party/boringssl/include/openssl/md4.h", 
       "third_party/boringssl/include/openssl/md5.h", 
       "third_party/boringssl/include/openssl/mem.h", 
+      "third_party/boringssl/include/openssl/newhope.h", 
+      "third_party/boringssl/include/openssl/nid.h", 
       "third_party/boringssl/include/openssl/obj.h", 
       "third_party/boringssl/include/openssl/obj_mac.h", 
       "third_party/boringssl/include/openssl/objects.h", 
-      "third_party/boringssl/include/openssl/opensslfeatures.h", 
+      "third_party/boringssl/include/openssl/opensslconf.h", 
       "third_party/boringssl/include/openssl/opensslv.h", 
       "third_party/boringssl/include/openssl/ossl_typ.h", 
       "third_party/boringssl/include/openssl/pem.h", 
@@ -5763,9 +5875,9 @@
       "third_party/boringssl/include/openssl/pkcs7.h", 
       "third_party/boringssl/include/openssl/pkcs8.h", 
       "third_party/boringssl/include/openssl/poly1305.h", 
-      "third_party/boringssl/include/openssl/pqueue.h", 
       "third_party/boringssl/include/openssl/rand.h", 
       "third_party/boringssl/include/openssl/rc4.h", 
+      "third_party/boringssl/include/openssl/ripemd.h", 
       "third_party/boringssl/include/openssl/rsa.h", 
       "third_party/boringssl/include/openssl/safestack.h", 
       "third_party/boringssl/include/openssl/sha.h", 
@@ -5781,11 +5893,7 @@
       "third_party/boringssl/include/openssl/x509.h", 
       "third_party/boringssl/include/openssl/x509_vfy.h", 
       "third_party/boringssl/include/openssl/x509v3.h", 
-      "third_party/boringssl/ssl/internal.h", 
-      "third_party/boringssl/ssl/test/async_bio.h", 
-      "third_party/boringssl/ssl/test/packeted_bio.h", 
-      "third_party/boringssl/ssl/test/scoped_types.h", 
-      "third_party/boringssl/ssl/test/test_config.h"
+      "third_party/boringssl/ssl/internal.h"
     ], 
     "is_filegroup": false, 
     "language": "c", 
@@ -5892,6 +6000,19 @@
     "headers": [], 
     "is_filegroup": false, 
     "language": "c++", 
+    "name": "boringssl_chacha_test_lib", 
+    "src": [], 
+    "third_party": true, 
+    "type": "lib"
+  }, 
+  {
+    "deps": [
+      "boringssl", 
+      "boringssl_test_util"
+    ], 
+    "headers": [], 
+    "is_filegroup": false, 
+    "language": "c++", 
     "name": "boringssl_aead_test_lib", 
     "src": [], 
     "third_party": true, 
@@ -5957,6 +6078,19 @@
     "headers": [], 
     "is_filegroup": false, 
     "language": "c++", 
+    "name": "boringssl_spake25519_test_lib", 
+    "src": [], 
+    "third_party": true, 
+    "type": "lib"
+  }, 
+  {
+    "deps": [
+      "boringssl", 
+      "boringssl_test_util"
+    ], 
+    "headers": [], 
+    "is_filegroup": false, 
+    "language": "c++", 
     "name": "boringssl_x25519_test_lib", 
     "src": [], 
     "third_party": true, 
@@ -6035,6 +6169,32 @@
     "headers": [], 
     "is_filegroup": false, 
     "language": "c++", 
+    "name": "boringssl_ecdh_test_lib", 
+    "src": [], 
+    "third_party": true, 
+    "type": "lib"
+  }, 
+  {
+    "deps": [
+      "boringssl", 
+      "boringssl_test_util"
+    ], 
+    "headers": [], 
+    "is_filegroup": false, 
+    "language": "c++", 
+    "name": "boringssl_ecdsa_sign_test_lib", 
+    "src": [], 
+    "third_party": true, 
+    "type": "lib"
+  }, 
+  {
+    "deps": [
+      "boringssl", 
+      "boringssl_test_util"
+    ], 
+    "headers": [], 
+    "is_filegroup": false, 
+    "language": "c++", 
     "name": "boringssl_ecdsa_test_lib", 
     "src": [], 
     "third_party": true, 
@@ -6048,6 +6208,19 @@
     "headers": [], 
     "is_filegroup": false, 
     "language": "c++", 
+    "name": "boringssl_ecdsa_verify_test_lib", 
+    "src": [], 
+    "third_party": true, 
+    "type": "lib"
+  }, 
+  {
+    "deps": [
+      "boringssl", 
+      "boringssl_test_util"
+    ], 
+    "headers": [], 
+    "is_filegroup": false, 
+    "language": "c++", 
     "name": "boringssl_err_test_lib", 
     "src": [], 
     "third_party": true, 
@@ -6138,7 +6311,7 @@
     ], 
     "headers": [], 
     "is_filegroup": false, 
-    "language": "c", 
+    "language": "c++", 
     "name": "boringssl_gcm_test_lib", 
     "src": [], 
     "third_party": true, 
@@ -6152,6 +6325,58 @@
     "headers": [], 
     "is_filegroup": false, 
     "language": "c++", 
+    "name": "boringssl_newhope_statistical_test_lib", 
+    "src": [], 
+    "third_party": true, 
+    "type": "lib"
+  }, 
+  {
+    "deps": [
+      "boringssl", 
+      "boringssl_test_util"
+    ], 
+    "headers": [], 
+    "is_filegroup": false, 
+    "language": "c++", 
+    "name": "boringssl_newhope_test_lib", 
+    "src": [], 
+    "third_party": true, 
+    "type": "lib"
+  }, 
+  {
+    "deps": [
+      "boringssl", 
+      "boringssl_test_util"
+    ], 
+    "headers": [], 
+    "is_filegroup": false, 
+    "language": "c++", 
+    "name": "boringssl_newhope_vectors_test_lib", 
+    "src": [], 
+    "third_party": true, 
+    "type": "lib"
+  }, 
+  {
+    "deps": [
+      "boringssl", 
+      "boringssl_test_util"
+    ], 
+    "headers": [], 
+    "is_filegroup": false, 
+    "language": "c++", 
+    "name": "boringssl_obj_test_lib", 
+    "src": [], 
+    "third_party": true, 
+    "type": "lib"
+  }, 
+  {
+    "deps": [
+      "boringssl", 
+      "boringssl_test_util"
+    ], 
+    "headers": [], 
+    "is_filegroup": false, 
+    "language": "c++", 
     "name": "boringssl_pkcs12_test_lib", 
     "src": [], 
     "third_party": true, 
@@ -6281,19 +6506,6 @@
     ], 
     "headers": [], 
     "is_filegroup": false, 
-    "language": "c", 
-    "name": "boringssl_pqueue_test_lib", 
-    "src": [], 
-    "third_party": true, 
-    "type": "lib"
-  }, 
-  {
-    "deps": [
-      "boringssl", 
-      "boringssl_test_util"
-    ], 
-    "headers": [], 
-    "is_filegroup": false, 
     "language": "c++", 
     "name": "boringssl_ssl_test_lib", 
     "src": [], 
@@ -7117,6 +7329,7 @@
       "src/core/ext/client_channel/client_channel_factory.h", 
       "src/core/ext/client_channel/connector.h", 
       "src/core/ext/client_channel/http_connect_handshaker.h", 
+      "src/core/ext/client_channel/http_proxy.h", 
       "src/core/ext/client_channel/initial_connect_string.h", 
       "src/core/ext/client_channel/lb_policy.h", 
       "src/core/ext/client_channel/lb_policy_factory.h", 
@@ -7146,6 +7359,8 @@
       "src/core/ext/client_channel/default_initial_connect_string.c", 
       "src/core/ext/client_channel/http_connect_handshaker.c", 
       "src/core/ext/client_channel/http_connect_handshaker.h", 
+      "src/core/ext/client_channel/http_proxy.c", 
+      "src/core/ext/client_channel/http_proxy.h", 
       "src/core/ext/client_channel/initial_connect_string.c", 
       "src/core/ext/client_channel/initial_connect_string.h", 
       "src/core/ext/client_channel/lb_policy.c", 
@@ -7667,7 +7882,7 @@
       "include/grpc/grpc_cronet.h", 
       "include/grpc/grpc_security.h", 
       "include/grpc/grpc_security_constants.h", 
-      "third_party/objective_c/Cronet/cronet_c_for_grpc.h"
+      "third_party/Cronet/bidirectional_stream_c.h"
     ], 
     "is_filegroup": true, 
     "language": "c", 
diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json
index af5538f..2c7b0a6 100644
--- a/tools/run_tests/generated/tests.json
+++ b/tools/run_tests/generated/tests.json
@@ -3568,7 +3568,9 @@
     ]
   }, 
   {
-    "args": [], 
+    "args": [
+      "third_party/boringssl/crypto/bn/bn_tests.txt"
+    ], 
     "boringssl": true, 
     "ci_platforms": [
       "linux", 
@@ -3616,6 +3618,30 @@
     ]
   }, 
   {
+    "args": [], 
+    "boringssl": true, 
+    "ci_platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ], 
+    "cpu_cost": 1.0, 
+    "defaults": "boringssl", 
+    "exclude_configs": [
+      "asan"
+    ], 
+    "flaky": false, 
+    "language": "c++", 
+    "name": "boringssl_chacha_test", 
+    "platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ]
+  }, 
+  {
     "args": [
       "aes-128-gcm", 
       "third_party/boringssl/crypto/cipher/test/aes_128_gcm_tests.txt"
@@ -3779,60 +3805,6 @@
   }, 
   {
     "args": [
-      "rc4-md5-tls", 
-      "third_party/boringssl/crypto/cipher/test/rc4_md5_tls_tests.txt"
-    ], 
-    "boringssl": true, 
-    "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
-      "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "defaults": "boringssl", 
-    "exclude_configs": [
-      "asan"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "boringssl_aead_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
-      "windows"
-    ]
-  }, 
-  {
-    "args": [
-      "rc4-sha1-tls", 
-      "third_party/boringssl/crypto/cipher/test/rc4_sha1_tls_tests.txt"
-    ], 
-    "boringssl": true, 
-    "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
-      "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "defaults": "boringssl", 
-    "exclude_configs": [
-      "asan"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "boringssl_aead_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
-      "windows"
-    ]
-  }, 
-  {
-    "args": [
       "aes-128-cbc-sha1-tls", 
       "third_party/boringssl/crypto/cipher/test/aes_128_cbc_sha1_tls_tests.txt"
     ], 
@@ -4076,60 +4048,6 @@
   }, 
   {
     "args": [
-      "rc4-md5-ssl3", 
-      "third_party/boringssl/crypto/cipher/test/rc4_md5_ssl3_tests.txt"
-    ], 
-    "boringssl": true, 
-    "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
-      "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "defaults": "boringssl", 
-    "exclude_configs": [
-      "asan"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "boringssl_aead_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
-      "windows"
-    ]
-  }, 
-  {
-    "args": [
-      "rc4-sha1-ssl3", 
-      "third_party/boringssl/crypto/cipher/test/rc4_sha1_ssl3_tests.txt"
-    ], 
-    "boringssl": true, 
-    "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
-      "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "defaults": "boringssl", 
-    "exclude_configs": [
-      "asan"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
-    "name": "boringssl_aead_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
-      "windows"
-    ]
-  }, 
-  {
-    "args": [
       "aes-128-cbc-sha1-ssl3", 
       "third_party/boringssl/crypto/cipher/test/aes_128_cbc_sha1_ssl3_tests.txt"
     ], 
@@ -4265,7 +4183,7 @@
   }, 
   {
     "args": [
-      "third_party/boringssl/crypto/cipher/test/cipher_test.txt"
+      "third_party/boringssl/crypto/cipher/test/cipher_tests.txt"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -4403,6 +4321,30 @@
     ], 
     "flaky": false, 
     "language": "c++", 
+    "name": "boringssl_spake25519_test", 
+    "platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ]
+  }, 
+  {
+    "args": [], 
+    "boringssl": true, 
+    "ci_platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ], 
+    "cpu_cost": 1.0, 
+    "defaults": "boringssl", 
+    "exclude_configs": [
+      "asan"
+    ], 
+    "flaky": false, 
+    "language": "c++", 
     "name": "boringssl_dh_test", 
     "platforms": [
       "linux", 
@@ -4508,6 +4450,58 @@
     ]
   }, 
   {
+    "args": [
+      "third_party/boringssl/crypto/ecdh/ecdh_tests.txt"
+    ], 
+    "boringssl": true, 
+    "ci_platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ], 
+    "cpu_cost": 1.0, 
+    "defaults": "boringssl", 
+    "exclude_configs": [
+      "asan"
+    ], 
+    "flaky": false, 
+    "language": "c++", 
+    "name": "boringssl_ecdh_test", 
+    "platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ]
+  }, 
+  {
+    "args": [
+      "third_party/boringssl/crypto/ecdsa/ecdsa_sign_tests.txt"
+    ], 
+    "boringssl": true, 
+    "ci_platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ], 
+    "cpu_cost": 1.0, 
+    "defaults": "boringssl", 
+    "exclude_configs": [
+      "asan"
+    ], 
+    "flaky": false, 
+    "language": "c++", 
+    "name": "boringssl_ecdsa_sign_test", 
+    "platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ]
+  }, 
+  {
     "args": [], 
     "boringssl": true, 
     "ci_platforms": [
@@ -4532,6 +4526,32 @@
     ]
   }, 
   {
+    "args": [
+      "third_party/boringssl/crypto/ecdsa/ecdsa_verify_tests.txt"
+    ], 
+    "boringssl": true, 
+    "ci_platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ], 
+    "cpu_cost": 1.0, 
+    "defaults": "boringssl", 
+    "exclude_configs": [
+      "asan"
+    ], 
+    "flaky": false, 
+    "language": "c++", 
+    "name": "boringssl_ecdsa_verify_test", 
+    "platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ]
+  }, 
+  {
     "args": [], 
     "boringssl": true, 
     "ci_platforms": [
@@ -4743,7 +4763,81 @@
     ], 
     "flaky": false, 
     "language": "c++", 
-    "name": "boringssl_pkcs8_test", 
+    "name": "boringssl_newhope_test", 
+    "platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ]
+  }, 
+  {
+    "args": [], 
+    "boringssl": true, 
+    "ci_platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ], 
+    "cpu_cost": 1.0, 
+    "defaults": "boringssl", 
+    "exclude_configs": [
+      "asan"
+    ], 
+    "flaky": false, 
+    "language": "c++", 
+    "name": "boringssl_newhope_statistical_test", 
+    "platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ]
+  }, 
+  {
+    "args": [
+      "third_party/boringssl/crypto/newhope/newhope_tests.txt"
+    ], 
+    "boringssl": true, 
+    "ci_platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ], 
+    "cpu_cost": 1.0, 
+    "defaults": "boringssl", 
+    "exclude_configs": [
+      "asan"
+    ], 
+    "flaky": false, 
+    "language": "c++", 
+    "name": "boringssl_newhope_vectors_test", 
+    "platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ]
+  }, 
+  {
+    "args": [], 
+    "boringssl": true, 
+    "ci_platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ], 
+    "cpu_cost": 1.0, 
+    "defaults": "boringssl", 
+    "exclude_configs": [
+      "asan"
+    ], 
+    "flaky": false, 
+    "language": "c++", 
+    "name": "boringssl_obj_test", 
     "platforms": [
       "linux", 
       "mac", 
@@ -4776,8 +4870,32 @@
     ]
   }, 
   {
+    "args": [], 
+    "boringssl": true, 
+    "ci_platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ], 
+    "cpu_cost": 1.0, 
+    "defaults": "boringssl", 
+    "exclude_configs": [
+      "asan"
+    ], 
+    "flaky": false, 
+    "language": "c++", 
+    "name": "boringssl_pkcs8_test", 
+    "platforms": [
+      "linux", 
+      "mac", 
+      "posix", 
+      "windows"
+    ]
+  }, 
+  {
     "args": [
-      "third_party/boringssl/crypto/poly1305/poly1305_test.txt"
+      "third_party/boringssl/crypto/poly1305/poly1305_tests.txt"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -4985,30 +5103,6 @@
     ], 
     "flaky": false, 
     "language": "c++", 
-    "name": "boringssl_pqueue_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
-      "windows"
-    ]
-  }, 
-  {
-    "args": [], 
-    "boringssl": true, 
-    "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
-      "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "defaults": "boringssl", 
-    "exclude_configs": [
-      "asan"
-    ], 
-    "flaky": false, 
-    "language": "c++", 
     "name": "boringssl_ssl_test", 
     "platforms": [
       "linux", 
@@ -38216,7 +38310,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"core_limit\": 1, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"server_type\": \"ASYNC_GENERIC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"server_type\": \"ASYNC_GENERIC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -38240,7 +38334,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"server_type\": \"ASYNC_GENERIC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"server_type\": \"ASYNC_GENERIC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -38264,7 +38358,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_one_server_core_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"core_limit\": 1, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"server_type\": \"ASYNC_GENERIC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_one_server_core_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"server_type\": \"ASYNC_GENERIC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -38288,7 +38382,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_unary_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_unary_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -38312,7 +38406,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -38336,7 +38430,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"core_limit\": 1, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -38360,7 +38454,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -38384,7 +38478,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_qps_unconstrained_secure_500kib_resource_quota\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"resource_quota_size\": 512000, \"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_qps_unconstrained_secure_500kib_resource_quota\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"resource_quota_size\": 512000, \"async_server_threads\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -38408,7 +38502,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"core_limit\": 1, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -38432,7 +38526,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -38456,7 +38550,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_secure_500kib_resource_quota\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"resource_quota_size\": 512000, \"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_secure_500kib_resource_quota\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"resource_quota_size\": 512000, \"async_server_threads\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -38480,7 +38574,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"core_limit\": 1, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -38504,7 +38598,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -38528,7 +38622,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_secure_500kib_resource_quota\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"resource_quota_size\": 512000, \"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_secure_500kib_resource_quota\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"resource_quota_size\": 512000, \"async_server_threads\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -38552,7 +38646,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"core_limit\": 1, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -38576,7 +38670,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -38600,7 +38694,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_secure_500kib_resource_quota\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"resource_quota_size\": 512000, \"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_secure_500kib_resource_quota\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"resource_quota_size\": 512000, \"async_server_threads\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -38624,7 +38718,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"core_limit\": 1, \"security_params\": null, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"server_type\": \"ASYNC_GENERIC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"security_params\": null, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"server_type\": \"ASYNC_GENERIC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -38648,7 +38742,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": null, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"server_type\": \"ASYNC_GENERIC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"security_params\": null, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"server_type\": \"ASYNC_GENERIC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -38672,7 +38766,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_one_server_core_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"core_limit\": 1, \"security_params\": null, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"server_type\": \"ASYNC_GENERIC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_one_server_core_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"security_params\": null, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"server_type\": \"ASYNC_GENERIC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -38696,7 +38790,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_unary_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": null, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_unary_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"security_params\": null, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -38720,7 +38814,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": null, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"security_params\": null, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -38744,7 +38838,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"core_limit\": 1, \"security_params\": null, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"security_params\": null, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -38768,7 +38862,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": null, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"security_params\": null, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -38792,7 +38886,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_qps_unconstrained_insecure_500kib_resource_quota\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"resource_quota_size\": 512000, \"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": null, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_qps_unconstrained_insecure_500kib_resource_quota\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"resource_quota_size\": 512000, \"async_server_threads\": 0, \"security_params\": null, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -38816,7 +38910,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"core_limit\": 1, \"security_params\": null, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"security_params\": null, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -38840,7 +38934,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": null, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"security_params\": null, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -38864,7 +38958,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_insecure_500kib_resource_quota\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"resource_quota_size\": 512000, \"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": null, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_insecure_500kib_resource_quota\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"resource_quota_size\": 512000, \"async_server_threads\": 0, \"security_params\": null, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -38888,7 +38982,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"core_limit\": 1, \"security_params\": null, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"security_params\": null, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -38912,7 +39006,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": null, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"security_params\": null, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -38936,7 +39030,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_insecure_500kib_resource_quota\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"resource_quota_size\": 512000, \"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": null, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_insecure_500kib_resource_quota\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"resource_quota_size\": 512000, \"async_server_threads\": 0, \"security_params\": null, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 16, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -38960,7 +39054,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"core_limit\": 1, \"security_params\": null, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"security_params\": null, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -38984,7 +39078,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": null, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"security_params\": null, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -39008,7 +39102,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_insecure_500kib_resource_quota\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"resource_quota_size\": 512000, \"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": null, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_insecure_500kib_resource_quota\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"resource_quota_size\": 512000, \"async_server_threads\": 0, \"security_params\": null, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -39032,7 +39126,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"core_limit\": 1, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"server_type\": \"ASYNC_GENERIC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"server_type\": \"ASYNC_GENERIC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -39069,7 +39163,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"server_type\": \"ASYNC_GENERIC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"server_type\": \"ASYNC_GENERIC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -39106,7 +39200,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_one_server_core_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"core_limit\": 1, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"server_type\": \"ASYNC_GENERIC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_one_server_core_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"server_type\": \"ASYNC_GENERIC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -39143,7 +39237,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_unary_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 10, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_unary_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 10, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -39180,7 +39274,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 10, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 10, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -39217,7 +39311,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"core_limit\": 1, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -39254,7 +39348,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -39291,7 +39385,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_qps_unconstrained_secure_500kib_resource_quota\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"resource_quota_size\": 512000, \"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_qps_unconstrained_secure_500kib_resource_quota\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"resource_quota_size\": 512000, \"async_server_threads\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -39328,7 +39422,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"core_limit\": 1, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -39365,7 +39459,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -39402,7 +39496,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_secure_500kib_resource_quota\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"resource_quota_size\": 512000, \"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_secure_500kib_resource_quota\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"resource_quota_size\": 512000, \"async_server_threads\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -39439,7 +39533,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"core_limit\": 1, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -39476,7 +39570,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -39513,7 +39607,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_secure_500kib_resource_quota\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"resource_quota_size\": 512000, \"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_secure_500kib_resource_quota\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"resource_quota_size\": 512000, \"async_server_threads\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -39550,7 +39644,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"core_limit\": 1, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_ping_pong_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -39587,7 +39681,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_secure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -39624,7 +39718,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_secure_500kib_resource_quota\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"resource_quota_size\": 512000, \"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_secure_500kib_resource_quota\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"resource_quota_size\": 512000, \"async_server_threads\": 0, \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": {\"use_test_ca\": true, \"server_host_override\": \"foo.test.google.fr\"}, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -39661,7 +39755,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"core_limit\": 1, \"security_params\": null, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"server_type\": \"ASYNC_GENERIC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"security_params\": null, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"server_type\": \"ASYNC_GENERIC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -39698,7 +39792,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": null, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"server_type\": \"ASYNC_GENERIC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"security_params\": null, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"server_type\": \"ASYNC_GENERIC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -39735,7 +39829,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_one_server_core_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"core_limit\": 1, \"security_params\": null, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"server_type\": \"ASYNC_GENERIC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_generic_async_streaming_qps_one_server_core_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"security_params\": null, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"server_type\": \"ASYNC_GENERIC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"bytebuf_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -39772,7 +39866,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_unary_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": null, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 10, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_unary_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"security_params\": null, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 10, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -39809,7 +39903,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": null, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 10, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_client_sync_server_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"security_params\": null, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 10, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -39846,7 +39940,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"core_limit\": 1, \"security_params\": null, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"security_params\": null, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -39883,7 +39977,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": null, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"security_params\": null, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -39920,7 +40014,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_qps_unconstrained_insecure_500kib_resource_quota\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"resource_quota_size\": 512000, \"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": null, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_unary_qps_unconstrained_insecure_500kib_resource_quota\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"resource_quota_size\": 512000, \"async_server_threads\": 0, \"security_params\": null, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -39957,7 +40051,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"core_limit\": 1, \"security_params\": null, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"security_params\": null, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -39994,7 +40088,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": null, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"security_params\": null, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -40031,7 +40125,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_insecure_500kib_resource_quota\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"resource_quota_size\": 512000, \"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": null, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_unary_qps_unconstrained_insecure_500kib_resource_quota\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"resource_quota_size\": 512000, \"async_server_threads\": 0, \"security_params\": null, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"UNARY\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -40068,7 +40162,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"core_limit\": 1, \"security_params\": null, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"security_params\": null, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -40105,7 +40199,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": null, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"security_params\": null, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -40142,7 +40236,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_insecure_500kib_resource_quota\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"resource_quota_size\": 512000, \"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": null, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_sync_streaming_qps_unconstrained_insecure_500kib_resource_quota\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"resource_quota_size\": 512000, \"async_server_threads\": 0, \"security_params\": null, \"server_type\": \"SYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"SYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -40179,7 +40273,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"core_limit\": 1, \"security_params\": null, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_ping_pong_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 1, \"security_params\": null, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 1, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 1, \"async_client_threads\": 1, \"outstanding_rpcs_per_channel\": 1, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -40216,7 +40310,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": null, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_insecure\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"async_server_threads\": 0, \"security_params\": null, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
@@ -40253,7 +40347,7 @@
   {
     "args": [
       "--scenarios_json", 
-      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_insecure_500kib_resource_quota\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"resource_quota_size\": 512000, \"async_server_threads\": 0, \"core_limit\": 0, \"security_params\": null, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
+      "{\"scenarios\": [{\"name\": \"cpp_protobuf_async_streaming_qps_unconstrained_insecure_500kib_resource_quota\", \"warmup_seconds\": 0, \"benchmark_seconds\": 1, \"num_servers\": 1, \"server_config\": {\"resource_quota_size\": 512000, \"async_server_threads\": 0, \"security_params\": null, \"server_type\": \"ASYNC_SERVER\"}, \"num_clients\": 0, \"client_config\": {\"client_type\": \"ASYNC_CLIENT\", \"security_params\": null, \"payload_config\": {\"simple_params\": {\"resp_size\": 0, \"req_size\": 0}}, \"client_channels\": 64, \"async_client_threads\": 0, \"outstanding_rpcs_per_channel\": 100, \"rpc_type\": \"STREAMING\", \"load_params\": {\"closed_loop\": {}}, \"histogram_params\": {\"max_possible\": 60000000000.0, \"resolution\": 0.01}}}]}"
     ], 
     "boringssl": true, 
     "ci_platforms": [
diff --git a/tools/run_tests/helper_scripts/build_python.sh b/tools/run_tests/helper_scripts/build_python.sh
index 0e88e96..5647d9c 100755
--- a/tools/run_tests/helper_scripts/build_python.sh
+++ b/tools/run_tests/helper_scripts/build_python.sh
@@ -163,22 +163,18 @@
   PWD=`pwd`
   cd $1
   ($VENV_PYTHON setup.py build_ext -c $TOOLCHAIN || true)
-  # install the dependencies
-  $VENV_PYTHON -m pip install --upgrade .
-  # ensure that we've reinstalled the test packages
-  $VENV_PYTHON -m pip install --upgrade --force-reinstall --no-deps .
+  $VENV_PYTHON -m pip install --no-deps .
   cd $PWD
 }
 
 $VENV_PYTHON -m pip install --upgrade pip
 $VENV_PYTHON -m pip install setuptools
 $VENV_PYTHON -m pip install cython
+$VENV_PYTHON -m pip install six enum34 protobuf futures
 pip_install_dir $ROOT
+
 $VENV_PYTHON $ROOT/tools/distrib/python/make_grpcio_tools.py
 pip_install_dir $ROOT/tools/distrib/python/grpcio_tools
-# TODO(atash) figure out namespace packages and grpcio-tools and auditwheel
-# etc...
-pip_install_dir $ROOT
 
 # Build/install health checking
 $VENV_PYTHON $ROOT/src/python/grpcio_health_checking/setup.py preprocess
@@ -191,6 +187,7 @@
 pip_install_dir $ROOT/src/python/grpcio_reflection
 
 # Build/install tests
+$VENV_PYTHON -m pip install coverage oauth2client
 $VENV_PYTHON $ROOT/src/python/grpcio_tests/setup.py preprocess
 $VENV_PYTHON $ROOT/src/python/grpcio_tests/setup.py build_package_protos
 pip_install_dir $ROOT/src/python/grpcio_tests
diff --git a/tools/run_tests/performance/scenario_config.py b/tools/run_tests/performance/scenario_config.py
index c3c5ece..b20bb40 100644
--- a/tools/run_tests/performance/scenario_config.py
+++ b/tools/run_tests/performance/scenario_config.py
@@ -109,7 +109,6 @@
                         unconstrained_client=None,
                         client_language=None,
                         server_language=None,
-                        server_core_limit=0,
                         async_server_threads=0,
                         warmup_seconds=WARMUP_SECONDS,
                         categories=DEFAULT_CATEGORIES,
@@ -136,7 +135,6 @@
     'server_config': {
       'server_type': server_type,
       'security_params': _get_secargs(secure),
-      'core_limit': server_core_limit,
       'async_server_threads': async_server_threads,
     },
     'warmup_seconds': warmup_seconds,
@@ -200,7 +198,7 @@
           rpc_type='STREAMING',
           client_type='ASYNC_CLIENT',
           server_type='ASYNC_GENERIC_SERVER',
-          use_generic_payload=True, server_core_limit=1, async_server_threads=1,
+          use_generic_payload=True, async_server_threads=1,
           secure=secure,
           categories=smoketest_categories)
 
@@ -219,7 +217,7 @@
           client_type='ASYNC_CLIENT',
           server_type='ASYNC_GENERIC_SERVER',
           unconstrained_client='async', use_generic_payload=True,
-          server_core_limit=1, async_server_threads=1,
+          async_server_threads=1,
           secure=secure)
 
       yield _ping_pong_scenario(
@@ -248,7 +246,7 @@
               rpc_type=rpc_type.upper(),
               client_type='%s_CLIENT' % synchronicity.upper(),
               server_type='%s_SERVER' % synchronicity.upper(),
-              server_core_limit=1, async_server_threads=1,
+              async_server_threads=1,
               secure=secure)
 
           yield _ping_pong_scenario(
@@ -332,13 +330,13 @@
     yield _ping_pong_scenario(
         'csharp_to_cpp_protobuf_sync_unary_ping_pong', rpc_type='UNARY',
         client_type='SYNC_CLIENT', server_type='SYNC_SERVER',
-        server_language='c++', server_core_limit=1, async_server_threads=1,
+        server_language='c++', async_server_threads=1,
         categories=[SMOKETEST, SCALABLE])
 
     yield _ping_pong_scenario(
         'csharp_to_cpp_protobuf_async_streaming_ping_pong', rpc_type='STREAMING',
         client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER',
-        server_language='c++', server_core_limit=1, async_server_threads=1)
+        server_language='c++', async_server_threads=1)
 
     yield _ping_pong_scenario(
         'csharp_to_cpp_protobuf_async_unary_qps_unconstrained', rpc_type='UNARY',
@@ -414,13 +412,13 @@
     #yield _ping_pong_scenario(
     #    'node_to_cpp_protobuf_async_unary_ping_pong', rpc_type='UNARY',
     #    client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER',
-    #    server_language='c++', server_core_limit=1, async_server_threads=1)
+    #    server_language='c++', async_server_threads=1)
 
     # TODO(jtattermusch): make this scenario work
     #yield _ping_pong_scenario(
     #    'node_to_cpp_protobuf_async_streaming_ping_pong', rpc_type='STREAMING',
     #    client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER',
-    #    server_language='c++', server_core_limit=1, async_server_threads=1)
+    #    server_language='c++', async_server_threads=1)
 
   def __str__(self):
     return 'node'
@@ -469,13 +467,13 @@
     yield _ping_pong_scenario(
         'python_to_cpp_protobuf_sync_unary_ping_pong', rpc_type='UNARY',
         client_type='SYNC_CLIENT', server_type='ASYNC_SERVER',
-        server_language='c++', server_core_limit=1, async_server_threads=1,
+        server_language='c++', async_server_threads=1,
         categories=[SMOKETEST, SCALABLE])
 
     yield _ping_pong_scenario(
         'python_to_cpp_protobuf_sync_streaming_ping_pong', rpc_type='STREAMING',
         client_type='SYNC_CLIENT', server_type='ASYNC_SERVER',
-        server_language='c++', server_core_limit=1, async_server_threads=1)
+        server_language='c++', async_server_threads=1)
 
   def __str__(self):
     return 'python'
@@ -516,12 +514,12 @@
     yield _ping_pong_scenario(
         'ruby_to_cpp_protobuf_sync_unary_ping_pong', rpc_type='UNARY',
         client_type='SYNC_CLIENT', server_type='SYNC_SERVER',
-        server_language='c++', server_core_limit=1, async_server_threads=1)
+        server_language='c++', async_server_threads=1)
 
     yield _ping_pong_scenario(
         'ruby_to_cpp_protobuf_sync_streaming_ping_pong', rpc_type='STREAMING',
         client_type='SYNC_CLIENT', server_type='SYNC_SERVER',
-        server_language='c++', server_core_limit=1, async_server_threads=1)
+        server_language='c++', async_server_threads=1)
 
   def __str__(self):
     return 'ruby'
diff --git a/tools/run_tests/run_interop_tests.py b/tools/run_tests/run_interop_tests.py
index 56efac5..53df334 100755
--- a/tools/run_tests/run_interop_tests.py
+++ b/tools/run_tests/run_interop_tests.py
@@ -86,7 +86,7 @@
     return {}
 
   def server_cmd(self, args):
-    return ['bins/opt/interop_server', '--use_tls=true'] + args
+    return ['bins/opt/interop_server'] + args
 
   def global_env(self):
     return {}
@@ -115,7 +115,7 @@
     return {}
 
   def server_cmd(self, args):
-    return ['mono', 'Grpc.IntegrationTesting.Server.exe', '--use_tls=true'] + args
+    return ['mono', 'Grpc.IntegrationTesting.Server.exe'] + args
 
   def global_env(self):
     return {}
@@ -144,7 +144,7 @@
     return {}
 
   def server_cmd(self, args):
-    return ['dotnet', 'exec', 'Grpc.IntegrationTesting.Server.dll', '--use_tls=true'] + args
+    return ['dotnet', 'exec', 'Grpc.IntegrationTesting.Server.dll'] + args
 
   def global_env(self):
     return {}
@@ -170,13 +170,13 @@
     return ['./run-test-client.sh'] + args
 
   def client_cmd_http2interop(self, args):
-    return ['./run-http2-client.sh'] + args
+    return ['./interop-testing/build/install/grpc-interop-testing/bin/http2-client'] + args
 
   def cloud_to_prod_env(self):
     return {}
 
   def server_cmd(self, args):
-    return ['./run-test-server.sh', '--use_tls=true'] + args
+    return ['./run-test-server.sh'] + args
 
   def global_env(self):
     return {}
@@ -206,7 +206,7 @@
     return {}
 
   def server_cmd(self, args):
-    return ['go', 'run', 'server.go', '--use_tls=true'] + args
+    return ['go', 'run', 'server.go'] + args
 
   def global_env(self):
     return {}
@@ -292,8 +292,7 @@
 
   def server_cmd(self, args):
     return ['tools/run_tests/interop/with_nvm.sh',
-            'node', 'src/node/interop/interop_server.js',
-            '--use_tls=true'] + args
+            'node', 'src/node/interop/interop_server.js'] + args
 
   def global_env(self):
     return {}
@@ -374,7 +373,7 @@
 
   def server_cmd(self, args):
     return ['tools/run_tests/interop/with_rvm.sh',
-            'ruby', 'src/ruby/pb/test/server.rb', '--use_tls=true'] + args
+            'ruby', 'src/ruby/pb/test/server.rb'] + args
 
   def global_env(self):
     return {}
@@ -407,7 +406,7 @@
 
   def client_cmd_http2interop(self, args):
     return [ 'py27/bin/python',
-              'src/python/grpcio_tests/tests/http2/_negative_http2_client.py',
+              'src/python/grpcio_tests/tests/http2/negative_http2_client.py',
            ] + args
 
   def cloud_to_prod_env(self):
@@ -419,7 +418,7 @@
         'src/python/grpcio_tests/setup.py',
         'run_interop',
         '--server',
-        '--args="{}"'.format(' '.join(args) + ' --use_tls=true')
+        '--args="{}"'.format(' '.join(args))
     ]
 
   def global_env(self):
@@ -586,11 +585,11 @@
 
 
 def cloud_to_cloud_jobspec(language, test_case, server_name, server_host,
-                           server_port, docker_image=None):
+                           server_port, docker_image=None, insecure=False):
   """Creates jobspec for cloud-to-cloud interop test"""
   interop_only_options = [
       '--server_host_override=foo.test.google.fr',
-      '--use_tls=true',
+      '--use_tls=%s' % ('false' if insecure else 'true'),
       '--use_test_ca=true',
   ]
   common_options = [
@@ -634,11 +633,12 @@
   return test_job
 
 
-def server_jobspec(language, docker_image):
+def server_jobspec(language, docker_image, insecure=False):
   """Create jobspec for running a server"""
   container_name = dockerjob.random_name('interop_server_%s' % language.safename)
   cmdline = bash_cmdline(
-      language.server_cmd(['--port=%s' % _DEFAULT_SERVER_PORT]))
+      language.server_cmd(['--port=%s' % _DEFAULT_SERVER_PORT,
+                           '--use_tls=%s' % ('false' if insecure else 'true')]))
   environ = language.global_env()
   if language.safename == 'http2':
     # we are running the http2 interop server. Open next N ports beginning
@@ -803,6 +803,11 @@
                   action='store_const',
                   const=True,
                   help='Enable HTTP/2 server edge case testing. (Good client, bad server)')
+argp.add_argument('--insecure',
+                  default=False,
+                  action='store_const',
+                  const=True,
+                  help='Whether to use secure channel.')
 
 args = argp.parse_args()
 
@@ -868,7 +873,8 @@
 try:
   for s in servers:
     lang = str(s)
-    spec = server_jobspec(_LANGUAGES[lang], docker_images.get(lang))
+    spec = server_jobspec(_LANGUAGES[lang], docker_images.get(lang),
+                          args.insecure)
     job = dockerjob.DockerJob(spec)
     server_jobs[lang] = job
     server_addresses[lang] = ('localhost', job.mapped_port(_DEFAULT_SERVER_PORT))
@@ -883,6 +889,8 @@
 
   jobs = []
   if args.cloud_to_prod:
+    if args.insecure:
+      print('TLS is always enabled for cloud_to_prod scenarios.')
     for server_host_name in args.prod_servers:
       for language in languages:
         for test_case in _TEST_CASES:
@@ -903,6 +911,8 @@
           jobs.append(test_job)
 
   if args.cloud_to_prod_auth:
+    if args.insecure:
+      print('TLS is always enabled for cloud_to_prod scenarios.')
     for server_host_name in args.prod_servers:
       for language in languages:
         for test_case in _AUTH_TEST_CASES:
@@ -934,7 +944,8 @@
                                                 server_name,
                                                 server_host,
                                                 server_port,
-                                                docker_image=docker_images.get(str(language)))
+                                                docker_image=docker_images.get(str(language)),
+                                                insecure=args.insecure)
               jobs.append(test_job)
 
     if args.http2_interop:
@@ -947,7 +958,8 @@
                                           server_name,
                                           server_host,
                                           server_port,
-                                          docker_image=docker_images.get(str(http2Interop)))
+                                          docker_image=docker_images.get(str(http2Interop)),
+                                          insecure=args.insecure)
         jobs.append(test_job)
 
     if args.http2_badserver_interop:
diff --git a/tools/run_tests/sanity/check_submodules.sh b/tools/run_tests/sanity/check_submodules.sh
index 61e8185..0b68319 100755
--- a/tools/run_tests/sanity/check_submodules.sh
+++ b/tools/run_tests/sanity/check_submodules.sh
@@ -42,9 +42,9 @@
 git submodule | awk '{ print $1 }' | sort > $submodules
 cat << EOF | awk '{ print $1 }' | sort > $want_submodules
  44c25c892a6229b20db7cd9dc05584ea865896de third_party/benchmark (v0.1.0-343-g44c25c8)
- c880e42ba1c8032d4cdde2aba0541d8a9d9fa2e9 third_party/boringssl (c880e42)
+ 78684e5b222645828ca302e56b40b9daff2b2d27 third_party/boringssl (78684e5)
  886e7d75368e3f4fab3f4d0d3584e4abfc557755 third_party/boringssl-with-bazel (version_for_cocoapods_7.0-857-g886e7d7)
- 05b155ff59114735ec8cd089f669c4c3d8f59029 third_party/gflags (v2.1.0-45-g05b155f)
+ f8a0efe03aa69b3336d8e228b37d4ccb17324b88 third_party/gflags (v2.2.0)
  c99458533a9b4c743ed51537e25989ea55944908 third_party/googletest (release-1.7.0)
  a428e42072765993ff674fda72863c9f1aa2d268 third_party/protobuf (v3.1.0-alpha-1)
  bcad91771b7f0bff28a1cac1981d7ef2b9bcef3c third_party/thrift (bcad917)
diff --git a/tools/run_tests/sanity/sanity_tests.yaml b/tools/run_tests/sanity/sanity_tests.yaml
index 3781916..ce41da8 100644
--- a/tools/run_tests/sanity/sanity_tests.yaml
+++ b/tools/run_tests/sanity/sanity_tests.yaml
@@ -12,5 +12,6 @@
 - script: tools/distrib/check_trailing_newlines.sh
 - script: tools/distrib/check_nanopb_output.sh
 - script: tools/distrib/check_include_guards.py
+- script: tools/distrib/yapf_code.sh
 - script: tools/distrib/python/check_grpcio_tools.py
 
diff --git a/vsprojects/README.md b/vsprojects/README.md
index afd6430..f1663d2 100644
--- a/vsprojects/README.md
+++ b/vsprojects/README.md
@@ -1,8 +1,8 @@
-This directory contains MS Visual Studio project & solution files.
+#Pre-generated MS Visual Studio project & solution files
 
-#Supported Visual Studio versions
-
-Currently supported versions are Visual Studio 2013 (our primary focus).
+Versions 2013 and 2015 are both supported. You can use [their respective
+community
+editions](https://www.visualstudio.com/en-us/downloads/download-visual-studio-vs.aspx).
 
 #Building
 We are using [NuGet](http://www.nuget.org) to pull zlib and openssl dependencies.
@@ -16,8 +16,8 @@
 ```
 
 After that, you can build the solution using one of these options:
-1. open `grpc.sln` with Visual Studio and hit "Build".
-2. build from commandline using `msbuild grpc.sln /p:Configuration=Debug`
+  1. open `grpc.sln` with Visual Studio and hit "Build".
+  2. build from commandline using `msbuild grpc.sln /p:Configuration=Debug`
 
 #C/C++ Test Dependencies
    * gtest isn't available as a git repo like the other dependencies.  download it and add it to `/third_party/gtest/` (the folder will end up with `/build-aux/`, `/cmake/`, `/codegear/`, etc. folders in it).  
@@ -36,73 +36,18 @@
    * install [NuGet](http://www.nuget.org)
     * nuget should automatically bring in built versions of zlib and openssl when building grpc.sln (the versions in `/third_party/` are not used).  If it doesn't work use `tools->nuget...->manage...`.  The packages are put in `/vsprojects/packages/`
 
-#C/C++ Test Solution/Project Build Steps
-   * A basic git version of grpc only has templates for non-test items.  This checklist adds test items to grpc.sln and makes individual vs projects for them
-   * set up dependencies (above)
-   * add `"debug": true,` to the top of build.json.  This is the base file for all build tracking, see [templates](https://github.com/grpc/grpc/tree/master/templates) for more information
-    * `"debug": true,` gets picked up by `/tools/buildgen/plugins/generate_vsprojects.py`.  It tells the script to add visual studio GUIDs to all projects.  Otherwise only the projects that already have GUIDs in build.json will be built
-   * run `/templates/vsprojects/generate_debug_projects.sh` to make debug templates/projects.  This runs a regular visual studio buildgen process, which creates the `.sln` file with all of the new debug projects, then uses git diff to find the new project names from the `.sln` that need templates added.  It builds the new templates based on the diff, then re-runs the visual studio buildgen, which builds the vs projects for each of the new debug targets
-    * copy over the `/vsprojects/` folder to your windows build setup (assuming this was built on linux in order to have easy access to python/mako and shell scripts)
-   * run `/templates/vsprojects/build_test_protos.sh`
-    * this builds all `.proto` files in `/test/` in-place.  there might be a better place to put them that mirrors what happens in the linux build process (todo)
-    * each `.proto` file gets built into a `.grpc.pb.cc`, .`grpc.pb.h`, `.pb.cc`, and `.pb.h`.  These are included in each test project in lieu of the `.proto` includes specified in `build.json`.  This substitution is done by `/templates/vsprojects/vcxproj_defs.include`
-    * copy over the `/test/` folder in order to get the new files (assuming this was built on linux in order to have an easy protobuf+grpc plugin installation)
-
-#Making and running tests with `/tools/run_tests/run_tests.py` or `/vsprojects/make.bat`
-`run_tests.py` and `make.bat` both rely on `/vsprojects/grpc.mak`, an NMAKE script that includes C/C++ tests in addition to the base grpc projects.  It builds the base projects by calling grpc.sln, but most things are built with a command line similar to a makefile workflow.
-
- arguments for `/vsprojects/make.bat`:
-
- * no options or `all` or `buildtests`: builds all tests
- * `buildtests_c`: just c tests
- * `buildtests_cxx`: just c++ tests
- * names of individual tests: just those tests (example: `make.bat gpr_string_test`)
-
-using `run_tests.py` on windows:
-
- * when `run_tests.py` detects that it's running on windows it calls `make.bat` to build the tests and expects to find tests in `/vsprojects/test_bins/`
-
-`run_tests.py` options:
-
- * `run_tests.py --help`
- * `run_tests.py -l c`: run c language tests
- * `run_tests.py -l c++`: run c++ language tests
- * note: `run_tests.py` doesn't normally show build steps, so if a build fails it is best to fall back to `make.bat`
- * if `make.bat` fails, it might be easier to open up the `.sln` file in the visual studio gui (see above for how to build the test projects) and build the offending test from its project file.  The `.mak` and project file templates are slightly different, so it's possible that a project will build one way and not another.  Please report this if it happens.
-
-It can be helpful to disable the firewall when running tests so that 400 connection warnings don't pop up.
-
-Individual tests can be run by directly running the executable in `/vsprojects/run_tests/` (this is `/bins/opt/` on linux).  Many C tests have no output; they either pass or fail internally and communicate this with their exit code (`0=pass`, `nonzero=fail`)
-
-`run_tests.py` will fail if it can't build something, so not-building tests are disabled with a "platforms = posix" note in build.json.  The buildgen tools will not add a test to a windows build unless it is marked "windows" or has no platforms identified.  As tests are ported they will get this mark removed.
-
 # Building protoc plugins
 For generating service stub code, gRPC relies on plugins for `protoc` (the protocol buffer compiler). The solution `grpc_protoc_plugins.sln` allows you to build
 Windows .exe binaries of gRPC protoc plugins.
 
-1. Follow instructions in `third_party\protobuf\cmake\README.md` to create Visual Studio 2013 projects for protobuf.
-```
-$ cd third_party/protobuf/cmake
-$ mkdir build & cd build
-$ mkdir solution & cd solution
-$ cmake -G "Visual Studio 12 2013" -Dprotobuf_BUILD_TESTS=OFF ../..
-```
+- Follow instructions in `third_party\protobuf\cmake\README.md` to create Visual Studio 2013 projects for protobuf.
+  ```
+  $ cd third_party/protobuf/cmake
+  $ mkdir build & cd build
+  $ mkdir solution & cd solution
+  $ cmake -G "Visual Studio 12 2013" -Dprotobuf_BUILD_TESTS=OFF ../..
+  ```
 
-2. Open solution `third_party\protobuf\cmake\build\solution\protobuf.sln` and build it in Release mode. That will build libraries `libprotobuf.lib` and `libprotoc.lib` needed for the next step.
+- Open solution `third_party\protobuf\cmake\build\solution\protobuf.sln` and build it in Release mode. That will build libraries `libprotobuf.lib` and `libprotoc.lib` needed for the next step.
 
-3. Open solution `vsprojects\grpc_protoc_plugins.sln` and build it in Release mode. As a result, you should obtain a set of gRPC protoc plugin binaries (`grpc_cpp_plugin.exe`, `grpc_csharp_plugin.exe`, ...)
-
-#Building using CMake (with BoringSSL)
-1. Install [Active State Perl](http://www.activestate.com/activeperl/) (`choco install activeperl`)
-2. Install [Ninja](https://ninja-build.org/) (`choco install ninja`)
-2. Install [Go](https://golang.org/dl/) (`choco install golang`)
-3. Install [yasm](http://yasm.tortall.net/) and add it to `PATH` (`choco install yasm`)
-4. Update boringssl sumbodule to `master`
-5. Run this commads in grpc directory:
-```
-> md .build
-> cd .build
-> call "%VS140COMNTOOLS%..\..\VC\vcvarsall.bat" x64
-> cmake .. -GNinja -DCMAKE_BUILD_TYPE=Release
-> cmake --build .
-```
+- Open solution `vsprojects\grpc_protoc_plugins.sln` and build it in Release mode. As a result, you should obtain a set of gRPC protoc plugin binaries (`grpc_cpp_plugin.exe`, `grpc_csharp_plugin.exe`, ...)
diff --git a/vsprojects/vcxproj/boringssl/boringssl.vcxproj b/vsprojects/vcxproj/boringssl/boringssl.vcxproj
index 59db775..a67b2c3 100644
--- a/vsprojects/vcxproj/boringssl/boringssl.vcxproj
+++ b/vsprojects/vcxproj/boringssl/boringssl.vcxproj
@@ -158,23 +158,22 @@
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\conf\internal.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\curve25519\internal.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\des\internal.h" />
-    <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\dh\internal.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\digest\internal.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\digest\md32_common.h" />
-    <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\directory.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\ec\internal.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\ec\p256-x86_64-table.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\evp\internal.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\internal.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\modes\internal.h" />
+    <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\newhope\internal.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\obj\obj_dat.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\obj\obj_xref.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\pkcs8\internal.h" />
+    <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\poly1305\internal.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\rand\internal.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\rsa\internal.h" />
-    <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\test\scoped_types.h" />
-    <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\test\test_util.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\x509\charmap.h" />
+    <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\x509\internal.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\x509\vpm_int.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\x509v3\ext_dat.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\x509v3\pcy_int.h" />
@@ -220,10 +219,12 @@
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\md4.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\md5.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\mem.h" />
+    <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\newhope.h" />
+    <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\nid.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\obj.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\obj_mac.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\objects.h" />
-    <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\opensslfeatures.h" />
+    <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\opensslconf.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\opensslv.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\ossl_typ.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\pem.h" />
@@ -231,9 +232,9 @@
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\pkcs7.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\pkcs8.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\poly1305.h" />
-    <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\pqueue.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\rand.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\rc4.h" />
+    <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\ripemd.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\rsa.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\safestack.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\sha.h" />
@@ -250,10 +251,6 @@
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\x509_vfy.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\x509v3.h" />
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\ssl\internal.h" />
-    <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\ssl\test\async_bio.h" />
-    <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\ssl\test\packeted_bio.h" />
-    <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\ssl\test\scoped_types.h" />
-    <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\ssl\test\test_config.h" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="$(SolutionDir)\..\src\boringssl\err_data.c">
@@ -266,8 +263,6 @@
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\asn1\a_bool.c">
     </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\asn1\a_bytes.c">
-    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\asn1\a_d2i_fp.c">
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\asn1\a_dup.c">
@@ -304,10 +299,6 @@
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\asn1\asn_pack.c">
     </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\asn1\bio_asn1.c">
-    </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\asn1\bio_ndef.c">
-    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\asn1\f_enum.c">
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\asn1\f_int.c">
@@ -316,8 +307,6 @@
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\asn1\t_bitst.c">
     </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\asn1\t_pkey.c">
-    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\asn1\tasn_dec.c">
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\asn1\tasn_enc.c">
@@ -326,8 +315,6 @@
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\asn1\tasn_new.c">
     </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\asn1\tasn_prn.c">
-    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\asn1\tasn_typ.c">
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\asn1\tasn_utl.c">
@@ -386,6 +373,8 @@
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\bn\montgomery.c">
     </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\bn\montgomery_inv.c">
+    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\bn\mul.c">
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\bn\prime.c">
@@ -408,9 +397,7 @@
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\bytestring\cbs.c">
     </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\chacha\chacha_generic.c">
-    </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\chacha\chacha_vec.c">
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\chacha\chacha.c">
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\cipher\aead.c">
     </ClCompile>
@@ -440,14 +427,22 @@
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\conf\conf.c">
     </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\cpu-aarch64-linux.c">
+    </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\cpu-arm-linux.c">
+    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\cpu-arm.c">
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\cpu-intel.c">
     </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\cpu-ppc64le.c">
+    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\crypto.c">
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\curve25519\curve25519.c">
     </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\curve25519\spake25519.c">
+    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\curve25519\x25519-x86_64.c">
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\des\des.c">
@@ -464,10 +459,6 @@
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\digest\digests.c">
     </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\directory_posix.c">
-    </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\directory_win.c">
-    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\dsa\dsa.c">
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\dsa\dsa_asn1.c">
@@ -504,8 +495,6 @@
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\err\err.c">
     </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\evp\algorithm.c">
-    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\evp\digestsign.c">
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\evp\evp.c">
@@ -526,6 +515,8 @@
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\evp\pbkdf.c">
     </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\evp\print.c">
+    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\evp\sign.c">
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\ex_data.c">
@@ -552,6 +543,18 @@
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\modes\ofb.c">
     </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\newhope\error_correction.c">
+    </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\newhope\newhope.c">
+    </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\newhope\ntt.c">
+    </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\newhope\poly.c">
+    </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\newhope\precomp.c">
+    </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\newhope\reduce.c">
+    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\obj\obj.c">
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\obj\obj_xref.c">
@@ -586,6 +589,8 @@
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\poly1305\poly1305_vec.c">
     </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\rand\deterministic.c">
+    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\rand\rand.c">
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\rand\urandom.c">
@@ -634,6 +639,8 @@
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\x509\a_verify.c">
     </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\x509\algorithm.c">
+    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\x509\asn1_gen.c">
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\x509\by_dir.c">
@@ -644,6 +651,8 @@
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\x509\pkcs7.c">
     </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\x509\rsa_pss.c">
+    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\x509\t_crl.c">
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\x509\t_req.c">
@@ -792,36 +801,28 @@
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\d1_both.c">
     </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\d1_clnt.c">
-    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\d1_lib.c">
     </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\d1_meth.c">
-    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\d1_pkt.c">
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\d1_srtp.c">
     </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\d1_srvr.c">
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\dtls_method.c">
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\dtls_record.c">
     </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\pqueue\pqueue.c">
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\handshake_client.c">
+    </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\handshake_server.c">
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\s3_both.c">
     </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\s3_clnt.c">
-    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\s3_enc.c">
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\s3_lib.c">
     </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\s3_meth.c">
-    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\s3_pkt.c">
     </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\s3_srvr.c">
-    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\ssl_aead_ctx.c">
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\ssl_asn1.c">
@@ -848,6 +849,16 @@
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\t1_lib.c">
     </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\tls13_both.c">
+    </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\tls13_client.c">
+    </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\tls13_enc.c">
+    </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\tls13_server.c">
+    </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\tls_method.c">
+    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\tls_record.c">
     </ClCompile>
   </ItemGroup>
diff --git a/vsprojects/vcxproj/boringssl/boringssl.vcxproj.filters b/vsprojects/vcxproj/boringssl/boringssl.vcxproj.filters
index bd996bd..09aa067 100644
--- a/vsprojects/vcxproj/boringssl/boringssl.vcxproj.filters
+++ b/vsprojects/vcxproj/boringssl/boringssl.vcxproj.filters
@@ -16,9 +16,6 @@
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\asn1\a_bool.c">
       <Filter>third_party\boringssl\crypto\asn1</Filter>
     </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\asn1\a_bytes.c">
-      <Filter>third_party\boringssl\crypto\asn1</Filter>
-    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\asn1\a_d2i_fp.c">
       <Filter>third_party\boringssl\crypto\asn1</Filter>
     </ClCompile>
@@ -73,12 +70,6 @@
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\asn1\asn_pack.c">
       <Filter>third_party\boringssl\crypto\asn1</Filter>
     </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\asn1\bio_asn1.c">
-      <Filter>third_party\boringssl\crypto\asn1</Filter>
-    </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\asn1\bio_ndef.c">
-      <Filter>third_party\boringssl\crypto\asn1</Filter>
-    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\asn1\f_enum.c">
       <Filter>third_party\boringssl\crypto\asn1</Filter>
     </ClCompile>
@@ -91,9 +82,6 @@
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\asn1\t_bitst.c">
       <Filter>third_party\boringssl\crypto\asn1</Filter>
     </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\asn1\t_pkey.c">
-      <Filter>third_party\boringssl\crypto\asn1</Filter>
-    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\asn1\tasn_dec.c">
       <Filter>third_party\boringssl\crypto\asn1</Filter>
     </ClCompile>
@@ -106,9 +94,6 @@
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\asn1\tasn_new.c">
       <Filter>third_party\boringssl\crypto\asn1</Filter>
     </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\asn1\tasn_prn.c">
-      <Filter>third_party\boringssl\crypto\asn1</Filter>
-    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\asn1\tasn_typ.c">
       <Filter>third_party\boringssl\crypto\asn1</Filter>
     </ClCompile>
@@ -196,6 +181,9 @@
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\bn\montgomery.c">
       <Filter>third_party\boringssl\crypto\bn</Filter>
     </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\bn\montgomery_inv.c">
+      <Filter>third_party\boringssl\crypto\bn</Filter>
+    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\bn\mul.c">
       <Filter>third_party\boringssl\crypto\bn</Filter>
     </ClCompile>
@@ -229,10 +217,7 @@
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\bytestring\cbs.c">
       <Filter>third_party\boringssl\crypto\bytestring</Filter>
     </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\chacha\chacha_generic.c">
-      <Filter>third_party\boringssl\crypto\chacha</Filter>
-    </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\chacha\chacha_vec.c">
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\chacha\chacha.c">
       <Filter>third_party\boringssl\crypto\chacha</Filter>
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\cipher\aead.c">
@@ -277,18 +262,30 @@
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\conf\conf.c">
       <Filter>third_party\boringssl\crypto\conf</Filter>
     </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\cpu-aarch64-linux.c">
+      <Filter>third_party\boringssl\crypto</Filter>
+    </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\cpu-arm-linux.c">
+      <Filter>third_party\boringssl\crypto</Filter>
+    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\cpu-arm.c">
       <Filter>third_party\boringssl\crypto</Filter>
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\cpu-intel.c">
       <Filter>third_party\boringssl\crypto</Filter>
     </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\cpu-ppc64le.c">
+      <Filter>third_party\boringssl\crypto</Filter>
+    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\crypto.c">
       <Filter>third_party\boringssl\crypto</Filter>
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\curve25519\curve25519.c">
       <Filter>third_party\boringssl\crypto\curve25519</Filter>
     </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\curve25519\spake25519.c">
+      <Filter>third_party\boringssl\crypto\curve25519</Filter>
+    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\curve25519\x25519-x86_64.c">
       <Filter>third_party\boringssl\crypto\curve25519</Filter>
     </ClCompile>
@@ -313,12 +310,6 @@
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\digest\digests.c">
       <Filter>third_party\boringssl\crypto\digest</Filter>
     </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\directory_posix.c">
-      <Filter>third_party\boringssl\crypto</Filter>
-    </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\directory_win.c">
-      <Filter>third_party\boringssl\crypto</Filter>
-    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\dsa\dsa.c">
       <Filter>third_party\boringssl\crypto\dsa</Filter>
     </ClCompile>
@@ -373,9 +364,6 @@
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\err\err.c">
       <Filter>third_party\boringssl\crypto\err</Filter>
     </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\evp\algorithm.c">
-      <Filter>third_party\boringssl\crypto\evp</Filter>
-    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\evp\digestsign.c">
       <Filter>third_party\boringssl\crypto\evp</Filter>
     </ClCompile>
@@ -406,6 +394,9 @@
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\evp\pbkdf.c">
       <Filter>third_party\boringssl\crypto\evp</Filter>
     </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\evp\print.c">
+      <Filter>third_party\boringssl\crypto\evp</Filter>
+    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\evp\sign.c">
       <Filter>third_party\boringssl\crypto\evp</Filter>
     </ClCompile>
@@ -445,6 +436,24 @@
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\modes\ofb.c">
       <Filter>third_party\boringssl\crypto\modes</Filter>
     </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\newhope\error_correction.c">
+      <Filter>third_party\boringssl\crypto\newhope</Filter>
+    </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\newhope\newhope.c">
+      <Filter>third_party\boringssl\crypto\newhope</Filter>
+    </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\newhope\ntt.c">
+      <Filter>third_party\boringssl\crypto\newhope</Filter>
+    </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\newhope\poly.c">
+      <Filter>third_party\boringssl\crypto\newhope</Filter>
+    </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\newhope\precomp.c">
+      <Filter>third_party\boringssl\crypto\newhope</Filter>
+    </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\newhope\reduce.c">
+      <Filter>third_party\boringssl\crypto\newhope</Filter>
+    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\obj\obj.c">
       <Filter>third_party\boringssl\crypto\obj</Filter>
     </ClCompile>
@@ -496,6 +505,9 @@
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\poly1305\poly1305_vec.c">
       <Filter>third_party\boringssl\crypto\poly1305</Filter>
     </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\rand\deterministic.c">
+      <Filter>third_party\boringssl\crypto\rand</Filter>
+    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\rand\rand.c">
       <Filter>third_party\boringssl\crypto\rand</Filter>
     </ClCompile>
@@ -568,6 +580,9 @@
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\x509\a_verify.c">
       <Filter>third_party\boringssl\crypto\x509</Filter>
     </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\x509\algorithm.c">
+      <Filter>third_party\boringssl\crypto\x509</Filter>
+    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\x509\asn1_gen.c">
       <Filter>third_party\boringssl\crypto\x509</Filter>
     </ClCompile>
@@ -583,6 +598,9 @@
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\x509\pkcs7.c">
       <Filter>third_party\boringssl\crypto\x509</Filter>
     </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\x509\rsa_pss.c">
+      <Filter>third_party\boringssl\crypto\x509</Filter>
+    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\x509\t_crl.c">
       <Filter>third_party\boringssl\crypto\x509</Filter>
     </ClCompile>
@@ -805,34 +823,28 @@
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\d1_both.c">
       <Filter>third_party\boringssl\ssl</Filter>
     </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\d1_clnt.c">
-      <Filter>third_party\boringssl\ssl</Filter>
-    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\d1_lib.c">
       <Filter>third_party\boringssl\ssl</Filter>
     </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\d1_meth.c">
-      <Filter>third_party\boringssl\ssl</Filter>
-    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\d1_pkt.c">
       <Filter>third_party\boringssl\ssl</Filter>
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\d1_srtp.c">
       <Filter>third_party\boringssl\ssl</Filter>
     </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\d1_srvr.c">
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\dtls_method.c">
       <Filter>third_party\boringssl\ssl</Filter>
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\dtls_record.c">
       <Filter>third_party\boringssl\ssl</Filter>
     </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\pqueue\pqueue.c">
-      <Filter>third_party\boringssl\ssl\pqueue</Filter>
-    </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\s3_both.c">
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\handshake_client.c">
       <Filter>third_party\boringssl\ssl</Filter>
     </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\s3_clnt.c">
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\handshake_server.c">
+      <Filter>third_party\boringssl\ssl</Filter>
+    </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\s3_both.c">
       <Filter>third_party\boringssl\ssl</Filter>
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\s3_enc.c">
@@ -841,15 +853,9 @@
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\s3_lib.c">
       <Filter>third_party\boringssl\ssl</Filter>
     </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\s3_meth.c">
-      <Filter>third_party\boringssl\ssl</Filter>
-    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\s3_pkt.c">
       <Filter>third_party\boringssl\ssl</Filter>
     </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\s3_srvr.c">
-      <Filter>third_party\boringssl\ssl</Filter>
-    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\ssl_aead_ctx.c">
       <Filter>third_party\boringssl\ssl</Filter>
     </ClCompile>
@@ -889,6 +895,21 @@
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\t1_lib.c">
       <Filter>third_party\boringssl\ssl</Filter>
     </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\tls13_both.c">
+      <Filter>third_party\boringssl\ssl</Filter>
+    </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\tls13_client.c">
+      <Filter>third_party\boringssl\ssl</Filter>
+    </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\tls13_enc.c">
+      <Filter>third_party\boringssl\ssl</Filter>
+    </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\tls13_server.c">
+      <Filter>third_party\boringssl\ssl</Filter>
+    </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\tls_method.c">
+      <Filter>third_party\boringssl\ssl</Filter>
+    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\tls_record.c">
       <Filter>third_party\boringssl\ssl</Filter>
     </ClCompile>
@@ -927,18 +948,12 @@
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\des\internal.h">
       <Filter>third_party\boringssl\crypto\des</Filter>
     </ClInclude>
-    <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\dh\internal.h">
-      <Filter>third_party\boringssl\crypto\dh</Filter>
-    </ClInclude>
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\digest\internal.h">
       <Filter>third_party\boringssl\crypto\digest</Filter>
     </ClInclude>
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\digest\md32_common.h">
       <Filter>third_party\boringssl\crypto\digest</Filter>
     </ClInclude>
-    <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\directory.h">
-      <Filter>third_party\boringssl\crypto</Filter>
-    </ClInclude>
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\ec\internal.h">
       <Filter>third_party\boringssl\crypto\ec</Filter>
     </ClInclude>
@@ -954,6 +969,9 @@
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\modes\internal.h">
       <Filter>third_party\boringssl\crypto\modes</Filter>
     </ClInclude>
+    <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\newhope\internal.h">
+      <Filter>third_party\boringssl\crypto\newhope</Filter>
+    </ClInclude>
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\obj\obj_dat.h">
       <Filter>third_party\boringssl\crypto\obj</Filter>
     </ClInclude>
@@ -963,21 +981,21 @@
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\pkcs8\internal.h">
       <Filter>third_party\boringssl\crypto\pkcs8</Filter>
     </ClInclude>
+    <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\poly1305\internal.h">
+      <Filter>third_party\boringssl\crypto\poly1305</Filter>
+    </ClInclude>
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\rand\internal.h">
       <Filter>third_party\boringssl\crypto\rand</Filter>
     </ClInclude>
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\rsa\internal.h">
       <Filter>third_party\boringssl\crypto\rsa</Filter>
     </ClInclude>
-    <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\test\scoped_types.h">
-      <Filter>third_party\boringssl\crypto\test</Filter>
-    </ClInclude>
-    <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\test\test_util.h">
-      <Filter>third_party\boringssl\crypto\test</Filter>
-    </ClInclude>
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\x509\charmap.h">
       <Filter>third_party\boringssl\crypto\x509</Filter>
     </ClInclude>
+    <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\x509\internal.h">
+      <Filter>third_party\boringssl\crypto\x509</Filter>
+    </ClInclude>
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\crypto\x509\vpm_int.h">
       <Filter>third_party\boringssl\crypto\x509</Filter>
     </ClInclude>
@@ -1113,6 +1131,12 @@
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\mem.h">
       <Filter>third_party\boringssl\include\openssl</Filter>
     </ClInclude>
+    <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\newhope.h">
+      <Filter>third_party\boringssl\include\openssl</Filter>
+    </ClInclude>
+    <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\nid.h">
+      <Filter>third_party\boringssl\include\openssl</Filter>
+    </ClInclude>
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\obj.h">
       <Filter>third_party\boringssl\include\openssl</Filter>
     </ClInclude>
@@ -1122,7 +1146,7 @@
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\objects.h">
       <Filter>third_party\boringssl\include\openssl</Filter>
     </ClInclude>
-    <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\opensslfeatures.h">
+    <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\opensslconf.h">
       <Filter>third_party\boringssl\include\openssl</Filter>
     </ClInclude>
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\opensslv.h">
@@ -1146,15 +1170,15 @@
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\poly1305.h">
       <Filter>third_party\boringssl\include\openssl</Filter>
     </ClInclude>
-    <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\pqueue.h">
-      <Filter>third_party\boringssl\include\openssl</Filter>
-    </ClInclude>
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\rand.h">
       <Filter>third_party\boringssl\include\openssl</Filter>
     </ClInclude>
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\rc4.h">
       <Filter>third_party\boringssl\include\openssl</Filter>
     </ClInclude>
+    <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\ripemd.h">
+      <Filter>third_party\boringssl\include\openssl</Filter>
+    </ClInclude>
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\include\openssl\rsa.h">
       <Filter>third_party\boringssl\include\openssl</Filter>
     </ClInclude>
@@ -1203,18 +1227,6 @@
     <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\ssl\internal.h">
       <Filter>third_party\boringssl\ssl</Filter>
     </ClInclude>
-    <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\ssl\test\async_bio.h">
-      <Filter>third_party\boringssl\ssl\test</Filter>
-    </ClInclude>
-    <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\ssl\test\packeted_bio.h">
-      <Filter>third_party\boringssl\ssl\test</Filter>
-    </ClInclude>
-    <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\ssl\test\scoped_types.h">
-      <Filter>third_party\boringssl\ssl\test</Filter>
-    </ClInclude>
-    <ClInclude Include="$(SolutionDir)\..\third_party\boringssl\ssl\test\test_config.h">
-      <Filter>third_party\boringssl\ssl\test</Filter>
-    </ClInclude>
   </ItemGroup>
 
   <ItemGroup>
@@ -1320,6 +1332,9 @@
     <Filter Include="third_party\boringssl\crypto\modes">
       <UniqueIdentifier>{63ca8fcd-7644-61d6-4357-5a0bcfdc395b}</UniqueIdentifier>
     </Filter>
+    <Filter Include="third_party\boringssl\crypto\newhope">
+      <UniqueIdentifier>{2a39f7c3-62df-5021-0825-36f18f10ad12}</UniqueIdentifier>
+    </Filter>
     <Filter Include="third_party\boringssl\crypto\obj">
       <UniqueIdentifier>{59349deb-4276-df4c-f4cd-e2cf707c3b4c}</UniqueIdentifier>
     </Filter>
@@ -1347,9 +1362,6 @@
     <Filter Include="third_party\boringssl\crypto\stack">
       <UniqueIdentifier>{7b1c1e89-c813-5ccd-fa2a-dd1b187f8da9}</UniqueIdentifier>
     </Filter>
-    <Filter Include="third_party\boringssl\crypto\test">
-      <UniqueIdentifier>{eec8fd39-7429-3d4d-be78-028791b4b927}</UniqueIdentifier>
-    </Filter>
     <Filter Include="third_party\boringssl\crypto\x509">
       <UniqueIdentifier>{74c9e47d-193b-84c0-95d9-4b33703b7890}</UniqueIdentifier>
     </Filter>
@@ -1365,12 +1377,6 @@
     <Filter Include="third_party\boringssl\ssl">
       <UniqueIdentifier>{e6e8c0c0-1755-4978-209e-5429ee3a2f5f}</UniqueIdentifier>
     </Filter>
-    <Filter Include="third_party\boringssl\ssl\pqueue">
-      <UniqueIdentifier>{89eb7fc9-98ec-dee5-ea8c-f7d23760aa94}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="third_party\boringssl\ssl\test">
-      <UniqueIdentifier>{8dda7bd5-b246-84a4-20c9-c92101caeb48}</UniqueIdentifier>
-    </Filter>
   </ItemGroup>
 </Project>
 
diff --git a/vsprojects/vcxproj/grpc/grpc.vcxproj b/vsprojects/vcxproj/grpc/grpc.vcxproj
index 50f1a94..b531c6f 100644
--- a/vsprojects/vcxproj/grpc/grpc.vcxproj
+++ b/vsprojects/vcxproj/grpc/grpc.vcxproj
@@ -449,6 +449,7 @@
     <ClInclude Include="$(SolutionDir)\..\src\core\ext\client_channel\client_channel_factory.h" />
     <ClInclude Include="$(SolutionDir)\..\src\core\ext\client_channel\connector.h" />
     <ClInclude Include="$(SolutionDir)\..\src\core\ext\client_channel\http_connect_handshaker.h" />
+    <ClInclude Include="$(SolutionDir)\..\src\core\ext\client_channel\http_proxy.h" />
     <ClInclude Include="$(SolutionDir)\..\src\core\ext\client_channel\initial_connect_string.h" />
     <ClInclude Include="$(SolutionDir)\..\src\core\ext\client_channel\lb_policy.h" />
     <ClInclude Include="$(SolutionDir)\..\src\core\ext\client_channel\lb_policy_factory.h" />
@@ -833,6 +834,8 @@
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\src\core\ext\client_channel\http_connect_handshaker.c">
     </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\src\core\ext\client_channel\http_proxy.c">
+    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\src\core\ext\client_channel\initial_connect_string.c">
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\src\core\ext\client_channel\lb_policy.c">
diff --git a/vsprojects/vcxproj/grpc/grpc.vcxproj.filters b/vsprojects/vcxproj/grpc/grpc.vcxproj.filters
index 86f0f3c..79bbaec 100644
--- a/vsprojects/vcxproj/grpc/grpc.vcxproj.filters
+++ b/vsprojects/vcxproj/grpc/grpc.vcxproj.filters
@@ -523,6 +523,9 @@
     <ClCompile Include="$(SolutionDir)\..\src\core\ext\client_channel\http_connect_handshaker.c">
       <Filter>src\core\ext\client_channel</Filter>
     </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\src\core\ext\client_channel\http_proxy.c">
+      <Filter>src\core\ext\client_channel</Filter>
+    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\src\core\ext\client_channel\initial_connect_string.c">
       <Filter>src\core\ext\client_channel</Filter>
     </ClCompile>
@@ -1202,6 +1205,9 @@
     <ClInclude Include="$(SolutionDir)\..\src\core\ext\client_channel\http_connect_handshaker.h">
       <Filter>src\core\ext\client_channel</Filter>
     </ClInclude>
+    <ClInclude Include="$(SolutionDir)\..\src\core\ext\client_channel\http_proxy.h">
+      <Filter>src\core\ext\client_channel</Filter>
+    </ClInclude>
     <ClInclude Include="$(SolutionDir)\..\src\core\ext\client_channel\initial_connect_string.h">
       <Filter>src\core\ext\client_channel</Filter>
     </ClInclude>
diff --git a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj
index 8f22782..66dc430 100644
--- a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj
+++ b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj
@@ -416,6 +416,7 @@
     <ClInclude Include="$(SolutionDir)\..\src\core\ext\client_channel\client_channel_factory.h" />
     <ClInclude Include="$(SolutionDir)\..\src\core\ext\client_channel\connector.h" />
     <ClInclude Include="$(SolutionDir)\..\src\core\ext\client_channel\http_connect_handshaker.h" />
+    <ClInclude Include="$(SolutionDir)\..\src\core\ext\client_channel\http_proxy.h" />
     <ClInclude Include="$(SolutionDir)\..\src\core\ext\client_channel\initial_connect_string.h" />
     <ClInclude Include="$(SolutionDir)\..\src\core\ext\client_channel\lb_policy.h" />
     <ClInclude Include="$(SolutionDir)\..\src\core\ext\client_channel\lb_policy_factory.h" />
@@ -753,6 +754,8 @@
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\src\core\ext\client_channel\http_connect_handshaker.c">
     </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\src\core\ext\client_channel\http_proxy.c">
+    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\src\core\ext\client_channel\initial_connect_string.c">
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\src\core\ext\client_channel\lb_policy.c">
diff --git a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters
index da2df3a..67592b2 100644
--- a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters
+++ b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters
@@ -454,6 +454,9 @@
     <ClCompile Include="$(SolutionDir)\..\src\core\ext\client_channel\http_connect_handshaker.c">
       <Filter>src\core\ext\client_channel</Filter>
     </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\src\core\ext\client_channel\http_proxy.c">
+      <Filter>src\core\ext\client_channel</Filter>
+    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\src\core\ext\client_channel\initial_connect_string.c">
       <Filter>src\core\ext\client_channel</Filter>
     </ClCompile>
@@ -1046,6 +1049,9 @@
     <ClInclude Include="$(SolutionDir)\..\src\core\ext\client_channel\http_connect_handshaker.h">
       <Filter>src\core\ext\client_channel</Filter>
     </ClInclude>
+    <ClInclude Include="$(SolutionDir)\..\src\core\ext\client_channel\http_proxy.h">
+      <Filter>src\core\ext\client_channel</Filter>
+    </ClInclude>
     <ClInclude Include="$(SolutionDir)\..\src\core\ext\client_channel\initial_connect_string.h">
       <Filter>src\core\ext\client_channel</Filter>
     </ClInclude>
diff --git a/vsprojects/vcxproj/qps/qps.vcxproj b/vsprojects/vcxproj/qps/qps.vcxproj
index 004cf7c..2d78926 100644
--- a/vsprojects/vcxproj/qps/qps.vcxproj
+++ b/vsprojects/vcxproj/qps/qps.vcxproj
@@ -151,7 +151,6 @@
     <ClInclude Include="$(SolutionDir)\..\test\cpp\qps\driver.h" />
     <ClInclude Include="$(SolutionDir)\..\test\cpp\qps\histogram.h" />
     <ClInclude Include="$(SolutionDir)\..\test\cpp\qps\interarrival.h" />
-    <ClInclude Include="$(SolutionDir)\..\test\cpp\qps\limit_cores.h" />
     <ClInclude Include="$(SolutionDir)\..\test\cpp\qps\parse_json.h" />
     <ClInclude Include="$(SolutionDir)\..\test\cpp\qps\qps_worker.h" />
     <ClInclude Include="$(SolutionDir)\..\test\cpp\qps\report.h" />
@@ -207,8 +206,6 @@
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\test\cpp\qps\driver.cc">
     </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\test\cpp\qps\limit_cores.cc">
-    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\test\cpp\qps\parse_json.cc">
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\test\cpp\qps\qps_worker.cc">
diff --git a/vsprojects/vcxproj/qps/qps.vcxproj.filters b/vsprojects/vcxproj/qps/qps.vcxproj.filters
index d3a440b..f25be9a 100644
--- a/vsprojects/vcxproj/qps/qps.vcxproj.filters
+++ b/vsprojects/vcxproj/qps/qps.vcxproj.filters
@@ -25,9 +25,6 @@
     <ClCompile Include="$(SolutionDir)\..\test\cpp\qps\driver.cc">
       <Filter>test\cpp\qps</Filter>
     </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\test\cpp\qps\limit_cores.cc">
-      <Filter>test\cpp\qps</Filter>
-    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\test\cpp\qps\parse_json.cc">
       <Filter>test\cpp\qps</Filter>
     </ClCompile>
@@ -63,9 +60,6 @@
     <ClInclude Include="$(SolutionDir)\..\test\cpp\qps\interarrival.h">
       <Filter>test\cpp\qps</Filter>
     </ClInclude>
-    <ClInclude Include="$(SolutionDir)\..\test\cpp\qps\limit_cores.h">
-      <Filter>test\cpp\qps</Filter>
-    </ClInclude>
     <ClInclude Include="$(SolutionDir)\..\test\cpp\qps\parse_json.h">
       <Filter>test\cpp\qps</Filter>
     </ClInclude>
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj b/vsprojects/vcxproj/test/boringssl/boringssl_chacha_test/boringssl_chacha_test.vcxproj
similarity index 97%
rename from vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj
rename to vsprojects/vcxproj/test/boringssl/boringssl_chacha_test/boringssl_chacha_test.vcxproj
index 7c0189b..f893298 100644
--- a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj
+++ b/vsprojects/vcxproj/test/boringssl/boringssl_chacha_test/boringssl_chacha_test.vcxproj
@@ -20,7 +20,7 @@
     </ProjectConfiguration>
   </ItemGroup>
   <PropertyGroup Label="Globals">
-    <ProjectGuid>{CCAA2ACD-B171-6011-0646-93010DCF8BC5}</ProjectGuid>
+    <ProjectGuid>{0F12358C-9F7A-E3B5-23EC-250C29C9D3A2}</ProjectGuid>
     <IgnoreWarnIntDirInTempDetected>true</IgnoreWarnIntDirInTempDetected>
     <IntDir>$(SolutionDir)IntDir\$(MSBuildProjectName)\</IntDir>
   </PropertyGroup>
@@ -62,14 +62,14 @@
   </ImportGroup>
   <PropertyGroup Label="UserMacros" />
   <PropertyGroup Condition="'$(Configuration)'=='Debug'">
-    <TargetName>boringssl_pqueue_test</TargetName>
+    <TargetName>boringssl_chacha_test</TargetName>
     <Linkage-grpc_dependencies_zlib>static</Linkage-grpc_dependencies_zlib>
     <Configuration-grpc_dependencies_zlib>Debug</Configuration-grpc_dependencies_zlib>
     <Linkage-grpc_dependencies_openssl>static</Linkage-grpc_dependencies_openssl>
     <Configuration-grpc_dependencies_openssl>Debug</Configuration-grpc_dependencies_openssl>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)'=='Release'">
-    <TargetName>boringssl_pqueue_test</TargetName>
+    <TargetName>boringssl_chacha_test</TargetName>
     <Linkage-grpc_dependencies_zlib>static</Linkage-grpc_dependencies_zlib>
     <Configuration-grpc_dependencies_zlib>Release</Configuration-grpc_dependencies_zlib>
     <Linkage-grpc_dependencies_openssl>static</Linkage-grpc_dependencies_openssl>
@@ -164,8 +164,8 @@
     </ClCompile>
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\test/boringssl\boringssl_pqueue_test_lib\boringssl_pqueue_test_lib.vcxproj">
-      <Project>{D03600F9-540A-2691-69F6-3A1DC2874D24}</Project>
+    <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\test/boringssl\boringssl_chacha_test_lib\boringssl_chacha_test_lib.vcxproj">
+      <Project>{D15F1CF5-EC88-FDD5-55A0-CBE5DC8A9F29}</Project>
     </ProjectReference>
     <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\boringssl_test_util\boringssl_test_util.vcxproj">
       <Project>{427037B1-B51B-D6F1-5025-AD12B200266A}</Project>
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj.filters b/vsprojects/vcxproj/test/boringssl/boringssl_chacha_test/boringssl_chacha_test.vcxproj.filters
similarity index 100%
rename from vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj.filters
rename to vsprojects/vcxproj/test/boringssl/boringssl_chacha_test/boringssl_chacha_test.vcxproj.filters
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test_lib/boringssl_pqueue_test_lib.vcxproj b/vsprojects/vcxproj/test/boringssl/boringssl_chacha_test_lib/boringssl_chacha_test_lib.vcxproj
similarity index 97%
copy from vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test_lib/boringssl_pqueue_test_lib.vcxproj
copy to vsprojects/vcxproj/test/boringssl/boringssl_chacha_test_lib/boringssl_chacha_test_lib.vcxproj
index 12198c1..3c4c382 100644
--- a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test_lib/boringssl_pqueue_test_lib.vcxproj
+++ b/vsprojects/vcxproj/test/boringssl/boringssl_chacha_test_lib/boringssl_chacha_test_lib.vcxproj
@@ -19,7 +19,7 @@
     </ProjectConfiguration>
   </ItemGroup>
   <PropertyGroup Label="Globals">
-    <ProjectGuid>{D03600F9-540A-2691-69F6-3A1DC2874D24}</ProjectGuid>
+    <ProjectGuid>{D15F1CF5-EC88-FDD5-55A0-CBE5DC8A9F29}</ProjectGuid>
     <IgnoreWarnIntDirInTempDetected>true</IgnoreWarnIntDirInTempDetected>
     <IntDir>$(SolutionDir)IntDir\$(MSBuildProjectName)\</IntDir>
   </PropertyGroup>
@@ -57,10 +57,10 @@
   </ImportGroup>
   <PropertyGroup Label="UserMacros" />
   <PropertyGroup Condition="'$(Configuration)'=='Debug'">
-    <TargetName>boringssl_pqueue_test_lib</TargetName>
+    <TargetName>boringssl_chacha_test_lib</TargetName>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)'=='Release'">
-    <TargetName>boringssl_pqueue_test_lib</TargetName>
+    <TargetName>boringssl_chacha_test_lib</TargetName>
   </PropertyGroup>
     <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <ClCompile>
@@ -147,7 +147,7 @@
   </ItemDefinitionGroup>
 
   <ItemGroup>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\pqueue\pqueue_test.c">
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\chacha\chacha_test.cc">
     </ClCompile>
   </ItemGroup>
   <ItemGroup>
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_chacha_test_lib/boringssl_chacha_test_lib.vcxproj.filters b/vsprojects/vcxproj/test/boringssl/boringssl_chacha_test_lib/boringssl_chacha_test_lib.vcxproj.filters
new file mode 100644
index 0000000..5fb3e2f
--- /dev/null
+++ b/vsprojects/vcxproj/test/boringssl/boringssl_chacha_test_lib/boringssl_chacha_test_lib.vcxproj.filters
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\chacha\chacha_test.cc">
+      <Filter>third_party\boringssl\crypto\chacha</Filter>
+    </ClCompile>
+  </ItemGroup>
+
+  <ItemGroup>
+    <Filter Include="third_party">
+      <UniqueIdentifier>{4b736811-6554-6004-024b-74e526459c17}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="third_party\boringssl">
+      <UniqueIdentifier>{256ad378-581e-bc4f-e018-f4a4e4098091}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="third_party\boringssl\crypto">
+      <UniqueIdentifier>{7e6857c0-cc2b-da3a-bdf7-cf9f82aba586}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="third_party\boringssl\crypto\chacha">
+      <UniqueIdentifier>{02432684-f62e-6b57-5847-af2e296fbbab}</UniqueIdentifier>
+    </Filter>
+  </ItemGroup>
+</Project>
+
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj b/vsprojects/vcxproj/test/boringssl/boringssl_ecdh_test/boringssl_ecdh_test.vcxproj
similarity index 97%
copy from vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj
copy to vsprojects/vcxproj/test/boringssl/boringssl_ecdh_test/boringssl_ecdh_test.vcxproj
index 7c0189b..cb85dd5 100644
--- a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj
+++ b/vsprojects/vcxproj/test/boringssl/boringssl_ecdh_test/boringssl_ecdh_test.vcxproj
@@ -20,7 +20,7 @@
     </ProjectConfiguration>
   </ItemGroup>
   <PropertyGroup Label="Globals">
-    <ProjectGuid>{CCAA2ACD-B171-6011-0646-93010DCF8BC5}</ProjectGuid>
+    <ProjectGuid>{8B7A464C-BC82-53A0-656A-0215D2BCE85D}</ProjectGuid>
     <IgnoreWarnIntDirInTempDetected>true</IgnoreWarnIntDirInTempDetected>
     <IntDir>$(SolutionDir)IntDir\$(MSBuildProjectName)\</IntDir>
   </PropertyGroup>
@@ -62,14 +62,14 @@
   </ImportGroup>
   <PropertyGroup Label="UserMacros" />
   <PropertyGroup Condition="'$(Configuration)'=='Debug'">
-    <TargetName>boringssl_pqueue_test</TargetName>
+    <TargetName>boringssl_ecdh_test</TargetName>
     <Linkage-grpc_dependencies_zlib>static</Linkage-grpc_dependencies_zlib>
     <Configuration-grpc_dependencies_zlib>Debug</Configuration-grpc_dependencies_zlib>
     <Linkage-grpc_dependencies_openssl>static</Linkage-grpc_dependencies_openssl>
     <Configuration-grpc_dependencies_openssl>Debug</Configuration-grpc_dependencies_openssl>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)'=='Release'">
-    <TargetName>boringssl_pqueue_test</TargetName>
+    <TargetName>boringssl_ecdh_test</TargetName>
     <Linkage-grpc_dependencies_zlib>static</Linkage-grpc_dependencies_zlib>
     <Configuration-grpc_dependencies_zlib>Release</Configuration-grpc_dependencies_zlib>
     <Linkage-grpc_dependencies_openssl>static</Linkage-grpc_dependencies_openssl>
@@ -164,8 +164,8 @@
     </ClCompile>
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\test/boringssl\boringssl_pqueue_test_lib\boringssl_pqueue_test_lib.vcxproj">
-      <Project>{D03600F9-540A-2691-69F6-3A1DC2874D24}</Project>
+    <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\test/boringssl\boringssl_ecdh_test_lib\boringssl_ecdh_test_lib.vcxproj">
+      <Project>{04FA7804-13C6-D0E4-144D-BD3736334565}</Project>
     </ProjectReference>
     <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\boringssl_test_util\boringssl_test_util.vcxproj">
       <Project>{427037B1-B51B-D6F1-5025-AD12B200266A}</Project>
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj.filters b/vsprojects/vcxproj/test/boringssl/boringssl_ecdh_test/boringssl_ecdh_test.vcxproj.filters
similarity index 100%
copy from vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj.filters
copy to vsprojects/vcxproj/test/boringssl/boringssl_ecdh_test/boringssl_ecdh_test.vcxproj.filters
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test_lib/boringssl_pqueue_test_lib.vcxproj b/vsprojects/vcxproj/test/boringssl/boringssl_ecdh_test_lib/boringssl_ecdh_test_lib.vcxproj
similarity index 97%
rename from vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test_lib/boringssl_pqueue_test_lib.vcxproj
rename to vsprojects/vcxproj/test/boringssl/boringssl_ecdh_test_lib/boringssl_ecdh_test_lib.vcxproj
index 12198c1..22c033c 100644
--- a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test_lib/boringssl_pqueue_test_lib.vcxproj
+++ b/vsprojects/vcxproj/test/boringssl/boringssl_ecdh_test_lib/boringssl_ecdh_test_lib.vcxproj
@@ -19,7 +19,7 @@
     </ProjectConfiguration>
   </ItemGroup>
   <PropertyGroup Label="Globals">
-    <ProjectGuid>{D03600F9-540A-2691-69F6-3A1DC2874D24}</ProjectGuid>
+    <ProjectGuid>{04FA7804-13C6-D0E4-144D-BD3736334565}</ProjectGuid>
     <IgnoreWarnIntDirInTempDetected>true</IgnoreWarnIntDirInTempDetected>
     <IntDir>$(SolutionDir)IntDir\$(MSBuildProjectName)\</IntDir>
   </PropertyGroup>
@@ -57,10 +57,10 @@
   </ImportGroup>
   <PropertyGroup Label="UserMacros" />
   <PropertyGroup Condition="'$(Configuration)'=='Debug'">
-    <TargetName>boringssl_pqueue_test_lib</TargetName>
+    <TargetName>boringssl_ecdh_test_lib</TargetName>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)'=='Release'">
-    <TargetName>boringssl_pqueue_test_lib</TargetName>
+    <TargetName>boringssl_ecdh_test_lib</TargetName>
   </PropertyGroup>
     <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <ClCompile>
@@ -147,7 +147,7 @@
   </ItemDefinitionGroup>
 
   <ItemGroup>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\pqueue\pqueue_test.c">
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\ecdh\ecdh_test.cc">
     </ClCompile>
   </ItemGroup>
   <ItemGroup>
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_ecdh_test_lib/boringssl_ecdh_test_lib.vcxproj.filters b/vsprojects/vcxproj/test/boringssl/boringssl_ecdh_test_lib/boringssl_ecdh_test_lib.vcxproj.filters
new file mode 100644
index 0000000..51393f5
--- /dev/null
+++ b/vsprojects/vcxproj/test/boringssl/boringssl_ecdh_test_lib/boringssl_ecdh_test_lib.vcxproj.filters
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\ecdh\ecdh_test.cc">
+      <Filter>third_party\boringssl\crypto\ecdh</Filter>
+    </ClCompile>
+  </ItemGroup>
+
+  <ItemGroup>
+    <Filter Include="third_party">
+      <UniqueIdentifier>{100930cd-7241-d92b-da6a-a84ea68e24bd}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="third_party\boringssl">
+      <UniqueIdentifier>{2f0bb152-1c3a-5f3a-7512-ca92fef36751}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="third_party\boringssl\crypto">
+      <UniqueIdentifier>{c004f731-666a-9d7d-c448-96a16069cbc4}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="third_party\boringssl\crypto\ecdh">
+      <UniqueIdentifier>{74176a90-7b93-c871-7de7-0048a1a55076}</UniqueIdentifier>
+    </Filter>
+  </ItemGroup>
+</Project>
+
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj b/vsprojects/vcxproj/test/boringssl/boringssl_ecdsa_sign_test/boringssl_ecdsa_sign_test.vcxproj
similarity index 96%
copy from vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj
copy to vsprojects/vcxproj/test/boringssl/boringssl_ecdsa_sign_test/boringssl_ecdsa_sign_test.vcxproj
index 7c0189b..db7fc98 100644
--- a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj
+++ b/vsprojects/vcxproj/test/boringssl/boringssl_ecdsa_sign_test/boringssl_ecdsa_sign_test.vcxproj
@@ -20,7 +20,7 @@
     </ProjectConfiguration>
   </ItemGroup>
   <PropertyGroup Label="Globals">
-    <ProjectGuid>{CCAA2ACD-B171-6011-0646-93010DCF8BC5}</ProjectGuid>
+    <ProjectGuid>{B9368314-B4D2-DEB2-A448-26D327059447}</ProjectGuid>
     <IgnoreWarnIntDirInTempDetected>true</IgnoreWarnIntDirInTempDetected>
     <IntDir>$(SolutionDir)IntDir\$(MSBuildProjectName)\</IntDir>
   </PropertyGroup>
@@ -62,14 +62,14 @@
   </ImportGroup>
   <PropertyGroup Label="UserMacros" />
   <PropertyGroup Condition="'$(Configuration)'=='Debug'">
-    <TargetName>boringssl_pqueue_test</TargetName>
+    <TargetName>boringssl_ecdsa_sign_test</TargetName>
     <Linkage-grpc_dependencies_zlib>static</Linkage-grpc_dependencies_zlib>
     <Configuration-grpc_dependencies_zlib>Debug</Configuration-grpc_dependencies_zlib>
     <Linkage-grpc_dependencies_openssl>static</Linkage-grpc_dependencies_openssl>
     <Configuration-grpc_dependencies_openssl>Debug</Configuration-grpc_dependencies_openssl>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)'=='Release'">
-    <TargetName>boringssl_pqueue_test</TargetName>
+    <TargetName>boringssl_ecdsa_sign_test</TargetName>
     <Linkage-grpc_dependencies_zlib>static</Linkage-grpc_dependencies_zlib>
     <Configuration-grpc_dependencies_zlib>Release</Configuration-grpc_dependencies_zlib>
     <Linkage-grpc_dependencies_openssl>static</Linkage-grpc_dependencies_openssl>
@@ -164,8 +164,8 @@
     </ClCompile>
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\test/boringssl\boringssl_pqueue_test_lib\boringssl_pqueue_test_lib.vcxproj">
-      <Project>{D03600F9-540A-2691-69F6-3A1DC2874D24}</Project>
+    <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\test/boringssl\boringssl_ecdsa_sign_test_lib\boringssl_ecdsa_sign_test_lib.vcxproj">
+      <Project>{8F0F763A-31D1-6710-6286-FD91EAC75EDB}</Project>
     </ProjectReference>
     <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\boringssl_test_util\boringssl_test_util.vcxproj">
       <Project>{427037B1-B51B-D6F1-5025-AD12B200266A}</Project>
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj.filters b/vsprojects/vcxproj/test/boringssl/boringssl_ecdsa_sign_test/boringssl_ecdsa_sign_test.vcxproj.filters
similarity index 100%
copy from vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj.filters
copy to vsprojects/vcxproj/test/boringssl/boringssl_ecdsa_sign_test/boringssl_ecdsa_sign_test.vcxproj.filters
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test_lib/boringssl_pqueue_test_lib.vcxproj b/vsprojects/vcxproj/test/boringssl/boringssl_ecdsa_sign_test_lib/boringssl_ecdsa_sign_test_lib.vcxproj
similarity index 96%
copy from vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test_lib/boringssl_pqueue_test_lib.vcxproj
copy to vsprojects/vcxproj/test/boringssl/boringssl_ecdsa_sign_test_lib/boringssl_ecdsa_sign_test_lib.vcxproj
index 12198c1..947dcdd 100644
--- a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test_lib/boringssl_pqueue_test_lib.vcxproj
+++ b/vsprojects/vcxproj/test/boringssl/boringssl_ecdsa_sign_test_lib/boringssl_ecdsa_sign_test_lib.vcxproj
@@ -19,7 +19,7 @@
     </ProjectConfiguration>
   </ItemGroup>
   <PropertyGroup Label="Globals">
-    <ProjectGuid>{D03600F9-540A-2691-69F6-3A1DC2874D24}</ProjectGuid>
+    <ProjectGuid>{8F0F763A-31D1-6710-6286-FD91EAC75EDB}</ProjectGuid>
     <IgnoreWarnIntDirInTempDetected>true</IgnoreWarnIntDirInTempDetected>
     <IntDir>$(SolutionDir)IntDir\$(MSBuildProjectName)\</IntDir>
   </PropertyGroup>
@@ -57,10 +57,10 @@
   </ImportGroup>
   <PropertyGroup Label="UserMacros" />
   <PropertyGroup Condition="'$(Configuration)'=='Debug'">
-    <TargetName>boringssl_pqueue_test_lib</TargetName>
+    <TargetName>boringssl_ecdsa_sign_test_lib</TargetName>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)'=='Release'">
-    <TargetName>boringssl_pqueue_test_lib</TargetName>
+    <TargetName>boringssl_ecdsa_sign_test_lib</TargetName>
   </PropertyGroup>
     <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <ClCompile>
@@ -147,7 +147,7 @@
   </ItemDefinitionGroup>
 
   <ItemGroup>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\pqueue\pqueue_test.c">
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\ecdsa\ecdsa_sign_test.cc">
     </ClCompile>
   </ItemGroup>
   <ItemGroup>
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_ecdsa_sign_test_lib/boringssl_ecdsa_sign_test_lib.vcxproj.filters b/vsprojects/vcxproj/test/boringssl/boringssl_ecdsa_sign_test_lib/boringssl_ecdsa_sign_test_lib.vcxproj.filters
new file mode 100644
index 0000000..69fb20c
--- /dev/null
+++ b/vsprojects/vcxproj/test/boringssl/boringssl_ecdsa_sign_test_lib/boringssl_ecdsa_sign_test_lib.vcxproj.filters
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\ecdsa\ecdsa_sign_test.cc">
+      <Filter>third_party\boringssl\crypto\ecdsa</Filter>
+    </ClCompile>
+  </ItemGroup>
+
+  <ItemGroup>
+    <Filter Include="third_party">
+      <UniqueIdentifier>{2407663e-0b17-cfb0-0aaa-fe639ecda00a}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="third_party\boringssl">
+      <UniqueIdentifier>{9ad9cf54-8113-a6e1-0689-09b051b5acf9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="third_party\boringssl\crypto">
+      <UniqueIdentifier>{8057866a-62e2-5309-70fa-f98800b682a8}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="third_party\boringssl\crypto\ecdsa">
+      <UniqueIdentifier>{76196bab-7843-c0ca-4f97-32c3336af99b}</UniqueIdentifier>
+    </Filter>
+  </ItemGroup>
+</Project>
+
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj b/vsprojects/vcxproj/test/boringssl/boringssl_ecdsa_verify_test/boringssl_ecdsa_verify_test.vcxproj
similarity index 96%
copy from vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj
copy to vsprojects/vcxproj/test/boringssl/boringssl_ecdsa_verify_test/boringssl_ecdsa_verify_test.vcxproj
index 7c0189b..ddf4b0c 100644
--- a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj
+++ b/vsprojects/vcxproj/test/boringssl/boringssl_ecdsa_verify_test/boringssl_ecdsa_verify_test.vcxproj
@@ -20,7 +20,7 @@
     </ProjectConfiguration>
   </ItemGroup>
   <PropertyGroup Label="Globals">
-    <ProjectGuid>{CCAA2ACD-B171-6011-0646-93010DCF8BC5}</ProjectGuid>
+    <ProjectGuid>{BF550763-A8E9-1C98-89C5-7A4A00364E06}</ProjectGuid>
     <IgnoreWarnIntDirInTempDetected>true</IgnoreWarnIntDirInTempDetected>
     <IntDir>$(SolutionDir)IntDir\$(MSBuildProjectName)\</IntDir>
   </PropertyGroup>
@@ -62,14 +62,14 @@
   </ImportGroup>
   <PropertyGroup Label="UserMacros" />
   <PropertyGroup Condition="'$(Configuration)'=='Debug'">
-    <TargetName>boringssl_pqueue_test</TargetName>
+    <TargetName>boringssl_ecdsa_verify_test</TargetName>
     <Linkage-grpc_dependencies_zlib>static</Linkage-grpc_dependencies_zlib>
     <Configuration-grpc_dependencies_zlib>Debug</Configuration-grpc_dependencies_zlib>
     <Linkage-grpc_dependencies_openssl>static</Linkage-grpc_dependencies_openssl>
     <Configuration-grpc_dependencies_openssl>Debug</Configuration-grpc_dependencies_openssl>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)'=='Release'">
-    <TargetName>boringssl_pqueue_test</TargetName>
+    <TargetName>boringssl_ecdsa_verify_test</TargetName>
     <Linkage-grpc_dependencies_zlib>static</Linkage-grpc_dependencies_zlib>
     <Configuration-grpc_dependencies_zlib>Release</Configuration-grpc_dependencies_zlib>
     <Linkage-grpc_dependencies_openssl>static</Linkage-grpc_dependencies_openssl>
@@ -164,8 +164,8 @@
     </ClCompile>
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\test/boringssl\boringssl_pqueue_test_lib\boringssl_pqueue_test_lib.vcxproj">
-      <Project>{D03600F9-540A-2691-69F6-3A1DC2874D24}</Project>
+    <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\test/boringssl\boringssl_ecdsa_verify_test_lib\boringssl_ecdsa_verify_test_lib.vcxproj">
+      <Project>{3F79C89D-E5CA-4C28-DE1C-27E0E1BFCA43}</Project>
     </ProjectReference>
     <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\boringssl_test_util\boringssl_test_util.vcxproj">
       <Project>{427037B1-B51B-D6F1-5025-AD12B200266A}</Project>
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj.filters b/vsprojects/vcxproj/test/boringssl/boringssl_ecdsa_verify_test/boringssl_ecdsa_verify_test.vcxproj.filters
similarity index 100%
copy from vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj.filters
copy to vsprojects/vcxproj/test/boringssl/boringssl_ecdsa_verify_test/boringssl_ecdsa_verify_test.vcxproj.filters
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test_lib/boringssl_pqueue_test_lib.vcxproj b/vsprojects/vcxproj/test/boringssl/boringssl_ecdsa_verify_test_lib/boringssl_ecdsa_verify_test_lib.vcxproj
similarity index 96%
copy from vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test_lib/boringssl_pqueue_test_lib.vcxproj
copy to vsprojects/vcxproj/test/boringssl/boringssl_ecdsa_verify_test_lib/boringssl_ecdsa_verify_test_lib.vcxproj
index 12198c1..5287bbe 100644
--- a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test_lib/boringssl_pqueue_test_lib.vcxproj
+++ b/vsprojects/vcxproj/test/boringssl/boringssl_ecdsa_verify_test_lib/boringssl_ecdsa_verify_test_lib.vcxproj
@@ -19,7 +19,7 @@
     </ProjectConfiguration>
   </ItemGroup>
   <PropertyGroup Label="Globals">
-    <ProjectGuid>{D03600F9-540A-2691-69F6-3A1DC2874D24}</ProjectGuid>
+    <ProjectGuid>{3F79C89D-E5CA-4C28-DE1C-27E0E1BFCA43}</ProjectGuid>
     <IgnoreWarnIntDirInTempDetected>true</IgnoreWarnIntDirInTempDetected>
     <IntDir>$(SolutionDir)IntDir\$(MSBuildProjectName)\</IntDir>
   </PropertyGroup>
@@ -57,10 +57,10 @@
   </ImportGroup>
   <PropertyGroup Label="UserMacros" />
   <PropertyGroup Condition="'$(Configuration)'=='Debug'">
-    <TargetName>boringssl_pqueue_test_lib</TargetName>
+    <TargetName>boringssl_ecdsa_verify_test_lib</TargetName>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)'=='Release'">
-    <TargetName>boringssl_pqueue_test_lib</TargetName>
+    <TargetName>boringssl_ecdsa_verify_test_lib</TargetName>
   </PropertyGroup>
     <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <ClCompile>
@@ -147,7 +147,7 @@
   </ItemDefinitionGroup>
 
   <ItemGroup>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\pqueue\pqueue_test.c">
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\ecdsa\ecdsa_verify_test.cc">
     </ClCompile>
   </ItemGroup>
   <ItemGroup>
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_ecdsa_verify_test_lib/boringssl_ecdsa_verify_test_lib.vcxproj.filters b/vsprojects/vcxproj/test/boringssl/boringssl_ecdsa_verify_test_lib/boringssl_ecdsa_verify_test_lib.vcxproj.filters
new file mode 100644
index 0000000..01169e3
--- /dev/null
+++ b/vsprojects/vcxproj/test/boringssl/boringssl_ecdsa_verify_test_lib/boringssl_ecdsa_verify_test_lib.vcxproj.filters
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\ecdsa\ecdsa_verify_test.cc">
+      <Filter>third_party\boringssl\crypto\ecdsa</Filter>
+    </ClCompile>
+  </ItemGroup>
+
+  <ItemGroup>
+    <Filter Include="third_party">
+      <UniqueIdentifier>{62c752a3-7d35-4a52-4e3e-af92d1ef7ae0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="third_party\boringssl">
+      <UniqueIdentifier>{cf981be6-06c7-d75e-bb01-bdcf6cbac573}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="third_party\boringssl\crypto">
+      <UniqueIdentifier>{f4955fa6-0694-bb47-d2e7-59ee77f72e37}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="third_party\boringssl\crypto\ecdsa">
+      <UniqueIdentifier>{bc349ef0-99fd-5724-06c0-0c6f6e1f7b69}</UniqueIdentifier>
+    </Filter>
+  </ItemGroup>
+</Project>
+
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_gcm_test_lib/boringssl_gcm_test_lib.vcxproj b/vsprojects/vcxproj/test/boringssl/boringssl_gcm_test_lib/boringssl_gcm_test_lib.vcxproj
index 7b5ffa1..8b3f5f4 100644
--- a/vsprojects/vcxproj/test/boringssl/boringssl_gcm_test_lib/boringssl_gcm_test_lib.vcxproj
+++ b/vsprojects/vcxproj/test/boringssl/boringssl_gcm_test_lib/boringssl_gcm_test_lib.vcxproj
@@ -147,7 +147,7 @@
   </ItemDefinitionGroup>
 
   <ItemGroup>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\modes\gcm_test.c">
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\modes\gcm_test.cc">
     </ClCompile>
   </ItemGroup>
   <ItemGroup>
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_gcm_test_lib/boringssl_gcm_test_lib.vcxproj.filters b/vsprojects/vcxproj/test/boringssl/boringssl_gcm_test_lib/boringssl_gcm_test_lib.vcxproj.filters
index 7260136..fbc3a07 100644
--- a/vsprojects/vcxproj/test/boringssl/boringssl_gcm_test_lib/boringssl_gcm_test_lib.vcxproj.filters
+++ b/vsprojects/vcxproj/test/boringssl/boringssl_gcm_test_lib/boringssl_gcm_test_lib.vcxproj.filters
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\modes\gcm_test.c">
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\modes\gcm_test.cc">
       <Filter>third_party\boringssl\crypto\modes</Filter>
     </ClCompile>
   </ItemGroup>
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj b/vsprojects/vcxproj/test/boringssl/boringssl_newhope_statistical_test/boringssl_newhope_statistical_test.vcxproj
similarity index 96%
copy from vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj
copy to vsprojects/vcxproj/test/boringssl/boringssl_newhope_statistical_test/boringssl_newhope_statistical_test.vcxproj
index 7c0189b..f3dde15 100644
--- a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj
+++ b/vsprojects/vcxproj/test/boringssl/boringssl_newhope_statistical_test/boringssl_newhope_statistical_test.vcxproj
@@ -20,7 +20,7 @@
     </ProjectConfiguration>
   </ItemGroup>
   <PropertyGroup Label="Globals">
-    <ProjectGuid>{CCAA2ACD-B171-6011-0646-93010DCF8BC5}</ProjectGuid>
+    <ProjectGuid>{2DFF4B39-A402-0C88-ACE5-58BD7E5F7686}</ProjectGuid>
     <IgnoreWarnIntDirInTempDetected>true</IgnoreWarnIntDirInTempDetected>
     <IntDir>$(SolutionDir)IntDir\$(MSBuildProjectName)\</IntDir>
   </PropertyGroup>
@@ -62,14 +62,14 @@
   </ImportGroup>
   <PropertyGroup Label="UserMacros" />
   <PropertyGroup Condition="'$(Configuration)'=='Debug'">
-    <TargetName>boringssl_pqueue_test</TargetName>
+    <TargetName>boringssl_newhope_statistical_test</TargetName>
     <Linkage-grpc_dependencies_zlib>static</Linkage-grpc_dependencies_zlib>
     <Configuration-grpc_dependencies_zlib>Debug</Configuration-grpc_dependencies_zlib>
     <Linkage-grpc_dependencies_openssl>static</Linkage-grpc_dependencies_openssl>
     <Configuration-grpc_dependencies_openssl>Debug</Configuration-grpc_dependencies_openssl>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)'=='Release'">
-    <TargetName>boringssl_pqueue_test</TargetName>
+    <TargetName>boringssl_newhope_statistical_test</TargetName>
     <Linkage-grpc_dependencies_zlib>static</Linkage-grpc_dependencies_zlib>
     <Configuration-grpc_dependencies_zlib>Release</Configuration-grpc_dependencies_zlib>
     <Linkage-grpc_dependencies_openssl>static</Linkage-grpc_dependencies_openssl>
@@ -164,8 +164,8 @@
     </ClCompile>
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\test/boringssl\boringssl_pqueue_test_lib\boringssl_pqueue_test_lib.vcxproj">
-      <Project>{D03600F9-540A-2691-69F6-3A1DC2874D24}</Project>
+    <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\test/boringssl\boringssl_newhope_statistical_test_lib\boringssl_newhope_statistical_test_lib.vcxproj">
+      <Project>{95B2444A-04E1-7F0A-049C-30099AA62E84}</Project>
     </ProjectReference>
     <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\boringssl_test_util\boringssl_test_util.vcxproj">
       <Project>{427037B1-B51B-D6F1-5025-AD12B200266A}</Project>
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj.filters b/vsprojects/vcxproj/test/boringssl/boringssl_newhope_statistical_test/boringssl_newhope_statistical_test.vcxproj.filters
similarity index 100%
copy from vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj.filters
copy to vsprojects/vcxproj/test/boringssl/boringssl_newhope_statistical_test/boringssl_newhope_statistical_test.vcxproj.filters
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test_lib/boringssl_pqueue_test_lib.vcxproj b/vsprojects/vcxproj/test/boringssl/boringssl_newhope_statistical_test_lib/boringssl_newhope_statistical_test_lib.vcxproj
similarity index 96%
copy from vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test_lib/boringssl_pqueue_test_lib.vcxproj
copy to vsprojects/vcxproj/test/boringssl/boringssl_newhope_statistical_test_lib/boringssl_newhope_statistical_test_lib.vcxproj
index 12198c1..c9cb80a 100644
--- a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test_lib/boringssl_pqueue_test_lib.vcxproj
+++ b/vsprojects/vcxproj/test/boringssl/boringssl_newhope_statistical_test_lib/boringssl_newhope_statistical_test_lib.vcxproj
@@ -19,7 +19,7 @@
     </ProjectConfiguration>
   </ItemGroup>
   <PropertyGroup Label="Globals">
-    <ProjectGuid>{D03600F9-540A-2691-69F6-3A1DC2874D24}</ProjectGuid>
+    <ProjectGuid>{95B2444A-04E1-7F0A-049C-30099AA62E84}</ProjectGuid>
     <IgnoreWarnIntDirInTempDetected>true</IgnoreWarnIntDirInTempDetected>
     <IntDir>$(SolutionDir)IntDir\$(MSBuildProjectName)\</IntDir>
   </PropertyGroup>
@@ -57,10 +57,10 @@
   </ImportGroup>
   <PropertyGroup Label="UserMacros" />
   <PropertyGroup Condition="'$(Configuration)'=='Debug'">
-    <TargetName>boringssl_pqueue_test_lib</TargetName>
+    <TargetName>boringssl_newhope_statistical_test_lib</TargetName>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)'=='Release'">
-    <TargetName>boringssl_pqueue_test_lib</TargetName>
+    <TargetName>boringssl_newhope_statistical_test_lib</TargetName>
   </PropertyGroup>
     <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <ClCompile>
@@ -147,7 +147,7 @@
   </ItemDefinitionGroup>
 
   <ItemGroup>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\pqueue\pqueue_test.c">
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\newhope\newhope_statistical_test.cc">
     </ClCompile>
   </ItemGroup>
   <ItemGroup>
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_newhope_statistical_test_lib/boringssl_newhope_statistical_test_lib.vcxproj.filters b/vsprojects/vcxproj/test/boringssl/boringssl_newhope_statistical_test_lib/boringssl_newhope_statistical_test_lib.vcxproj.filters
new file mode 100644
index 0000000..95945c2
--- /dev/null
+++ b/vsprojects/vcxproj/test/boringssl/boringssl_newhope_statistical_test_lib/boringssl_newhope_statistical_test_lib.vcxproj.filters
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\newhope\newhope_statistical_test.cc">
+      <Filter>third_party\boringssl\crypto\newhope</Filter>
+    </ClCompile>
+  </ItemGroup>
+
+  <ItemGroup>
+    <Filter Include="third_party">
+      <UniqueIdentifier>{25a9ae19-5707-441e-6d97-13ff38322368}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="third_party\boringssl">
+      <UniqueIdentifier>{e6e1e1f9-31eb-463f-a882-01c72cbe7a6e}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="third_party\boringssl\crypto">
+      <UniqueIdentifier>{37a6d595-952d-a224-060b-ea246359d76a}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="third_party\boringssl\crypto\newhope">
+      <UniqueIdentifier>{e0473499-9b3e-c3c3-5463-4706bd005f6c}</UniqueIdentifier>
+    </Filter>
+  </ItemGroup>
+</Project>
+
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj b/vsprojects/vcxproj/test/boringssl/boringssl_newhope_test/boringssl_newhope_test.vcxproj
similarity index 96%
copy from vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj
copy to vsprojects/vcxproj/test/boringssl/boringssl_newhope_test/boringssl_newhope_test.vcxproj
index 7c0189b..7a085b6 100644
--- a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj
+++ b/vsprojects/vcxproj/test/boringssl/boringssl_newhope_test/boringssl_newhope_test.vcxproj
@@ -20,7 +20,7 @@
     </ProjectConfiguration>
   </ItemGroup>
   <PropertyGroup Label="Globals">
-    <ProjectGuid>{CCAA2ACD-B171-6011-0646-93010DCF8BC5}</ProjectGuid>
+    <ProjectGuid>{105DF9D7-2B9F-501B-9FC4-C98BF16FC9D3}</ProjectGuid>
     <IgnoreWarnIntDirInTempDetected>true</IgnoreWarnIntDirInTempDetected>
     <IntDir>$(SolutionDir)IntDir\$(MSBuildProjectName)\</IntDir>
   </PropertyGroup>
@@ -62,14 +62,14 @@
   </ImportGroup>
   <PropertyGroup Label="UserMacros" />
   <PropertyGroup Condition="'$(Configuration)'=='Debug'">
-    <TargetName>boringssl_pqueue_test</TargetName>
+    <TargetName>boringssl_newhope_test</TargetName>
     <Linkage-grpc_dependencies_zlib>static</Linkage-grpc_dependencies_zlib>
     <Configuration-grpc_dependencies_zlib>Debug</Configuration-grpc_dependencies_zlib>
     <Linkage-grpc_dependencies_openssl>static</Linkage-grpc_dependencies_openssl>
     <Configuration-grpc_dependencies_openssl>Debug</Configuration-grpc_dependencies_openssl>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)'=='Release'">
-    <TargetName>boringssl_pqueue_test</TargetName>
+    <TargetName>boringssl_newhope_test</TargetName>
     <Linkage-grpc_dependencies_zlib>static</Linkage-grpc_dependencies_zlib>
     <Configuration-grpc_dependencies_zlib>Release</Configuration-grpc_dependencies_zlib>
     <Linkage-grpc_dependencies_openssl>static</Linkage-grpc_dependencies_openssl>
@@ -164,8 +164,8 @@
     </ClCompile>
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\test/boringssl\boringssl_pqueue_test_lib\boringssl_pqueue_test_lib.vcxproj">
-      <Project>{D03600F9-540A-2691-69F6-3A1DC2874D24}</Project>
+    <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\test/boringssl\boringssl_newhope_test_lib\boringssl_newhope_test_lib.vcxproj">
+      <Project>{2E791A00-9907-8B9A-D201-4E0C357A6BB3}</Project>
     </ProjectReference>
     <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\boringssl_test_util\boringssl_test_util.vcxproj">
       <Project>{427037B1-B51B-D6F1-5025-AD12B200266A}</Project>
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj.filters b/vsprojects/vcxproj/test/boringssl/boringssl_newhope_test/boringssl_newhope_test.vcxproj.filters
similarity index 100%
copy from vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj.filters
copy to vsprojects/vcxproj/test/boringssl/boringssl_newhope_test/boringssl_newhope_test.vcxproj.filters
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test_lib/boringssl_pqueue_test_lib.vcxproj b/vsprojects/vcxproj/test/boringssl/boringssl_newhope_test_lib/boringssl_newhope_test_lib.vcxproj
similarity index 96%
copy from vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test_lib/boringssl_pqueue_test_lib.vcxproj
copy to vsprojects/vcxproj/test/boringssl/boringssl_newhope_test_lib/boringssl_newhope_test_lib.vcxproj
index 12198c1..5504636 100644
--- a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test_lib/boringssl_pqueue_test_lib.vcxproj
+++ b/vsprojects/vcxproj/test/boringssl/boringssl_newhope_test_lib/boringssl_newhope_test_lib.vcxproj
@@ -19,7 +19,7 @@
     </ProjectConfiguration>
   </ItemGroup>
   <PropertyGroup Label="Globals">
-    <ProjectGuid>{D03600F9-540A-2691-69F6-3A1DC2874D24}</ProjectGuid>
+    <ProjectGuid>{2E791A00-9907-8B9A-D201-4E0C357A6BB3}</ProjectGuid>
     <IgnoreWarnIntDirInTempDetected>true</IgnoreWarnIntDirInTempDetected>
     <IntDir>$(SolutionDir)IntDir\$(MSBuildProjectName)\</IntDir>
   </PropertyGroup>
@@ -57,10 +57,10 @@
   </ImportGroup>
   <PropertyGroup Label="UserMacros" />
   <PropertyGroup Condition="'$(Configuration)'=='Debug'">
-    <TargetName>boringssl_pqueue_test_lib</TargetName>
+    <TargetName>boringssl_newhope_test_lib</TargetName>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)'=='Release'">
-    <TargetName>boringssl_pqueue_test_lib</TargetName>
+    <TargetName>boringssl_newhope_test_lib</TargetName>
   </PropertyGroup>
     <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <ClCompile>
@@ -147,7 +147,7 @@
   </ItemDefinitionGroup>
 
   <ItemGroup>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\pqueue\pqueue_test.c">
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\newhope\newhope_test.cc">
     </ClCompile>
   </ItemGroup>
   <ItemGroup>
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_newhope_test_lib/boringssl_newhope_test_lib.vcxproj.filters b/vsprojects/vcxproj/test/boringssl/boringssl_newhope_test_lib/boringssl_newhope_test_lib.vcxproj.filters
new file mode 100644
index 0000000..f2dc0e6
--- /dev/null
+++ b/vsprojects/vcxproj/test/boringssl/boringssl_newhope_test_lib/boringssl_newhope_test_lib.vcxproj.filters
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\newhope\newhope_test.cc">
+      <Filter>third_party\boringssl\crypto\newhope</Filter>
+    </ClCompile>
+  </ItemGroup>
+
+  <ItemGroup>
+    <Filter Include="third_party">
+      <UniqueIdentifier>{f6eddde4-4559-9adb-797f-897631281a89}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="third_party\boringssl">
+      <UniqueIdentifier>{81b307de-7498-3465-2ad4-7b634bf4788a}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="third_party\boringssl\crypto">
+      <UniqueIdentifier>{af9d3e32-2f0f-f0f3-f63f-4a8bd7f07c46}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="third_party\boringssl\crypto\newhope">
+      <UniqueIdentifier>{ea48f773-5060-8693-62ef-f257ccd47b21}</UniqueIdentifier>
+    </Filter>
+  </ItemGroup>
+</Project>
+
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj b/vsprojects/vcxproj/test/boringssl/boringssl_newhope_vectors_test/boringssl_newhope_vectors_test.vcxproj
similarity index 96%
copy from vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj
copy to vsprojects/vcxproj/test/boringssl/boringssl_newhope_vectors_test/boringssl_newhope_vectors_test.vcxproj
index 7c0189b..505f7cf 100644
--- a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj
+++ b/vsprojects/vcxproj/test/boringssl/boringssl_newhope_vectors_test/boringssl_newhope_vectors_test.vcxproj
@@ -20,7 +20,7 @@
     </ProjectConfiguration>
   </ItemGroup>
   <PropertyGroup Label="Globals">
-    <ProjectGuid>{CCAA2ACD-B171-6011-0646-93010DCF8BC5}</ProjectGuid>
+    <ProjectGuid>{E4C140A1-B7A3-0D00-A02F-CC90C9972F00}</ProjectGuid>
     <IgnoreWarnIntDirInTempDetected>true</IgnoreWarnIntDirInTempDetected>
     <IntDir>$(SolutionDir)IntDir\$(MSBuildProjectName)\</IntDir>
   </PropertyGroup>
@@ -62,14 +62,14 @@
   </ImportGroup>
   <PropertyGroup Label="UserMacros" />
   <PropertyGroup Condition="'$(Configuration)'=='Debug'">
-    <TargetName>boringssl_pqueue_test</TargetName>
+    <TargetName>boringssl_newhope_vectors_test</TargetName>
     <Linkage-grpc_dependencies_zlib>static</Linkage-grpc_dependencies_zlib>
     <Configuration-grpc_dependencies_zlib>Debug</Configuration-grpc_dependencies_zlib>
     <Linkage-grpc_dependencies_openssl>static</Linkage-grpc_dependencies_openssl>
     <Configuration-grpc_dependencies_openssl>Debug</Configuration-grpc_dependencies_openssl>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)'=='Release'">
-    <TargetName>boringssl_pqueue_test</TargetName>
+    <TargetName>boringssl_newhope_vectors_test</TargetName>
     <Linkage-grpc_dependencies_zlib>static</Linkage-grpc_dependencies_zlib>
     <Configuration-grpc_dependencies_zlib>Release</Configuration-grpc_dependencies_zlib>
     <Linkage-grpc_dependencies_openssl>static</Linkage-grpc_dependencies_openssl>
@@ -164,8 +164,8 @@
     </ClCompile>
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\test/boringssl\boringssl_pqueue_test_lib\boringssl_pqueue_test_lib.vcxproj">
-      <Project>{D03600F9-540A-2691-69F6-3A1DC2874D24}</Project>
+    <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\test/boringssl\boringssl_newhope_vectors_test_lib\boringssl_newhope_vectors_test_lib.vcxproj">
+      <Project>{0993166D-33B9-2E51-B0A9-5035A9086A2E}</Project>
     </ProjectReference>
     <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\boringssl_test_util\boringssl_test_util.vcxproj">
       <Project>{427037B1-B51B-D6F1-5025-AD12B200266A}</Project>
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj.filters b/vsprojects/vcxproj/test/boringssl/boringssl_newhope_vectors_test/boringssl_newhope_vectors_test.vcxproj.filters
similarity index 100%
copy from vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj.filters
copy to vsprojects/vcxproj/test/boringssl/boringssl_newhope_vectors_test/boringssl_newhope_vectors_test.vcxproj.filters
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test_lib/boringssl_pqueue_test_lib.vcxproj b/vsprojects/vcxproj/test/boringssl/boringssl_newhope_vectors_test_lib/boringssl_newhope_vectors_test_lib.vcxproj
similarity index 96%
copy from vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test_lib/boringssl_pqueue_test_lib.vcxproj
copy to vsprojects/vcxproj/test/boringssl/boringssl_newhope_vectors_test_lib/boringssl_newhope_vectors_test_lib.vcxproj
index 12198c1..4f01ec4 100644
--- a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test_lib/boringssl_pqueue_test_lib.vcxproj
+++ b/vsprojects/vcxproj/test/boringssl/boringssl_newhope_vectors_test_lib/boringssl_newhope_vectors_test_lib.vcxproj
@@ -19,7 +19,7 @@
     </ProjectConfiguration>
   </ItemGroup>
   <PropertyGroup Label="Globals">
-    <ProjectGuid>{D03600F9-540A-2691-69F6-3A1DC2874D24}</ProjectGuid>
+    <ProjectGuid>{0993166D-33B9-2E51-B0A9-5035A9086A2E}</ProjectGuid>
     <IgnoreWarnIntDirInTempDetected>true</IgnoreWarnIntDirInTempDetected>
     <IntDir>$(SolutionDir)IntDir\$(MSBuildProjectName)\</IntDir>
   </PropertyGroup>
@@ -57,10 +57,10 @@
   </ImportGroup>
   <PropertyGroup Label="UserMacros" />
   <PropertyGroup Condition="'$(Configuration)'=='Debug'">
-    <TargetName>boringssl_pqueue_test_lib</TargetName>
+    <TargetName>boringssl_newhope_vectors_test_lib</TargetName>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)'=='Release'">
-    <TargetName>boringssl_pqueue_test_lib</TargetName>
+    <TargetName>boringssl_newhope_vectors_test_lib</TargetName>
   </PropertyGroup>
     <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <ClCompile>
@@ -147,7 +147,7 @@
   </ItemDefinitionGroup>
 
   <ItemGroup>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\pqueue\pqueue_test.c">
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\newhope\newhope_vectors_test.cc">
     </ClCompile>
   </ItemGroup>
   <ItemGroup>
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_newhope_vectors_test_lib/boringssl_newhope_vectors_test_lib.vcxproj.filters b/vsprojects/vcxproj/test/boringssl/boringssl_newhope_vectors_test_lib/boringssl_newhope_vectors_test_lib.vcxproj.filters
new file mode 100644
index 0000000..27b208d
--- /dev/null
+++ b/vsprojects/vcxproj/test/boringssl/boringssl_newhope_vectors_test_lib/boringssl_newhope_vectors_test_lib.vcxproj.filters
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\newhope\newhope_vectors_test.cc">
+      <Filter>third_party\boringssl\crypto\newhope</Filter>
+    </ClCompile>
+  </ItemGroup>
+
+  <ItemGroup>
+    <Filter Include="third_party">
+      <UniqueIdentifier>{678cf897-2d02-4bb5-1872-b6d6d61c528f}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="third_party\boringssl">
+      <UniqueIdentifier>{3cc5b2df-8409-e2e8-9504-748004a314f3}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="third_party\boringssl\crypto">
+      <UniqueIdentifier>{2a4fb92f-e756-007b-f6fc-d8f55fee6096}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="third_party\boringssl\crypto\newhope">
+      <UniqueIdentifier>{09155346-c8e7-ffdb-7791-4f623ac5d521}</UniqueIdentifier>
+    </Filter>
+  </ItemGroup>
+</Project>
+
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj b/vsprojects/vcxproj/test/boringssl/boringssl_obj_test/boringssl_obj_test.vcxproj
similarity index 97%
copy from vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj
copy to vsprojects/vcxproj/test/boringssl/boringssl_obj_test/boringssl_obj_test.vcxproj
index 7c0189b..188663c 100644
--- a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj
+++ b/vsprojects/vcxproj/test/boringssl/boringssl_obj_test/boringssl_obj_test.vcxproj
@@ -20,7 +20,7 @@
     </ProjectConfiguration>
   </ItemGroup>
   <PropertyGroup Label="Globals">
-    <ProjectGuid>{CCAA2ACD-B171-6011-0646-93010DCF8BC5}</ProjectGuid>
+    <ProjectGuid>{CAF4E45E-3BA1-0EFD-2551-F16B4E43D0AB}</ProjectGuid>
     <IgnoreWarnIntDirInTempDetected>true</IgnoreWarnIntDirInTempDetected>
     <IntDir>$(SolutionDir)IntDir\$(MSBuildProjectName)\</IntDir>
   </PropertyGroup>
@@ -62,14 +62,14 @@
   </ImportGroup>
   <PropertyGroup Label="UserMacros" />
   <PropertyGroup Condition="'$(Configuration)'=='Debug'">
-    <TargetName>boringssl_pqueue_test</TargetName>
+    <TargetName>boringssl_obj_test</TargetName>
     <Linkage-grpc_dependencies_zlib>static</Linkage-grpc_dependencies_zlib>
     <Configuration-grpc_dependencies_zlib>Debug</Configuration-grpc_dependencies_zlib>
     <Linkage-grpc_dependencies_openssl>static</Linkage-grpc_dependencies_openssl>
     <Configuration-grpc_dependencies_openssl>Debug</Configuration-grpc_dependencies_openssl>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)'=='Release'">
-    <TargetName>boringssl_pqueue_test</TargetName>
+    <TargetName>boringssl_obj_test</TargetName>
     <Linkage-grpc_dependencies_zlib>static</Linkage-grpc_dependencies_zlib>
     <Configuration-grpc_dependencies_zlib>Release</Configuration-grpc_dependencies_zlib>
     <Linkage-grpc_dependencies_openssl>static</Linkage-grpc_dependencies_openssl>
@@ -164,8 +164,8 @@
     </ClCompile>
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\test/boringssl\boringssl_pqueue_test_lib\boringssl_pqueue_test_lib.vcxproj">
-      <Project>{D03600F9-540A-2691-69F6-3A1DC2874D24}</Project>
+    <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\test/boringssl\boringssl_obj_test_lib\boringssl_obj_test_lib.vcxproj">
+      <Project>{9C5FF985-A7D0-185E-4982-8166BC8267EF}</Project>
     </ProjectReference>
     <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\boringssl_test_util\boringssl_test_util.vcxproj">
       <Project>{427037B1-B51B-D6F1-5025-AD12B200266A}</Project>
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj.filters b/vsprojects/vcxproj/test/boringssl/boringssl_obj_test/boringssl_obj_test.vcxproj.filters
similarity index 100%
copy from vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj.filters
copy to vsprojects/vcxproj/test/boringssl/boringssl_obj_test/boringssl_obj_test.vcxproj.filters
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test_lib/boringssl_pqueue_test_lib.vcxproj b/vsprojects/vcxproj/test/boringssl/boringssl_obj_test_lib/boringssl_obj_test_lib.vcxproj
similarity index 97%
copy from vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test_lib/boringssl_pqueue_test_lib.vcxproj
copy to vsprojects/vcxproj/test/boringssl/boringssl_obj_test_lib/boringssl_obj_test_lib.vcxproj
index 12198c1..5cff5dc 100644
--- a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test_lib/boringssl_pqueue_test_lib.vcxproj
+++ b/vsprojects/vcxproj/test/boringssl/boringssl_obj_test_lib/boringssl_obj_test_lib.vcxproj
@@ -19,7 +19,7 @@
     </ProjectConfiguration>
   </ItemGroup>
   <PropertyGroup Label="Globals">
-    <ProjectGuid>{D03600F9-540A-2691-69F6-3A1DC2874D24}</ProjectGuid>
+    <ProjectGuid>{9C5FF985-A7D0-185E-4982-8166BC8267EF}</ProjectGuid>
     <IgnoreWarnIntDirInTempDetected>true</IgnoreWarnIntDirInTempDetected>
     <IntDir>$(SolutionDir)IntDir\$(MSBuildProjectName)\</IntDir>
   </PropertyGroup>
@@ -57,10 +57,10 @@
   </ImportGroup>
   <PropertyGroup Label="UserMacros" />
   <PropertyGroup Condition="'$(Configuration)'=='Debug'">
-    <TargetName>boringssl_pqueue_test_lib</TargetName>
+    <TargetName>boringssl_obj_test_lib</TargetName>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)'=='Release'">
-    <TargetName>boringssl_pqueue_test_lib</TargetName>
+    <TargetName>boringssl_obj_test_lib</TargetName>
   </PropertyGroup>
     <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <ClCompile>
@@ -147,7 +147,7 @@
   </ItemDefinitionGroup>
 
   <ItemGroup>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\pqueue\pqueue_test.c">
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\obj\obj_test.cc">
     </ClCompile>
   </ItemGroup>
   <ItemGroup>
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_obj_test_lib/boringssl_obj_test_lib.vcxproj.filters b/vsprojects/vcxproj/test/boringssl/boringssl_obj_test_lib/boringssl_obj_test_lib.vcxproj.filters
new file mode 100644
index 0000000..e860a95
--- /dev/null
+++ b/vsprojects/vcxproj/test/boringssl/boringssl_obj_test_lib/boringssl_obj_test_lib.vcxproj.filters
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\obj\obj_test.cc">
+      <Filter>third_party\boringssl\crypto\obj</Filter>
+    </ClCompile>
+  </ItemGroup>
+
+  <ItemGroup>
+    <Filter Include="third_party">
+      <UniqueIdentifier>{1e65df99-429c-84ab-e85c-2a74292dff99}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="third_party\boringssl">
+      <UniqueIdentifier>{f67c8934-df62-47c5-ab21-f2670e0624d4}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="third_party\boringssl\crypto">
+      <UniqueIdentifier>{a1c37911-be8c-bf36-9263-c4db89aa11dc}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="third_party\boringssl\crypto\obj">
+      <UniqueIdentifier>{26163139-0b8e-2ee1-11ac-7be64498bbab}</UniqueIdentifier>
+    </Filter>
+  </ItemGroup>
+</Project>
+
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test_lib/boringssl_pqueue_test_lib.vcxproj.filters b/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test_lib/boringssl_pqueue_test_lib.vcxproj.filters
deleted file mode 100644
index 50a1935..0000000
--- a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test_lib/boringssl_pqueue_test_lib.vcxproj.filters
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\pqueue\pqueue_test.c">
-      <Filter>third_party\boringssl\ssl\pqueue</Filter>
-    </ClCompile>
-  </ItemGroup>
-
-  <ItemGroup>
-    <Filter Include="third_party">
-      <UniqueIdentifier>{5abc2e4b-4b3e-76f3-af5b-32b49bed5734}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="third_party\boringssl">
-      <UniqueIdentifier>{ba7fa262-1d79-278b-6d33-494ef09bc0b0}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="third_party\boringssl\ssl">
-      <UniqueIdentifier>{bbe38f66-e869-8d99-4ef8-a477041fda28}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="third_party\boringssl\ssl\pqueue">
-      <UniqueIdentifier>{c6deeb40-d424-ed7a-bcf9-8b33d62d603d}</UniqueIdentifier>
-    </Filter>
-  </ItemGroup>
-</Project>
-
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj b/vsprojects/vcxproj/test/boringssl/boringssl_spake25519_test/boringssl_spake25519_test.vcxproj
similarity index 96%
copy from vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj
copy to vsprojects/vcxproj/test/boringssl/boringssl_spake25519_test/boringssl_spake25519_test.vcxproj
index 7c0189b..dd9022b 100644
--- a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj
+++ b/vsprojects/vcxproj/test/boringssl/boringssl_spake25519_test/boringssl_spake25519_test.vcxproj
@@ -20,7 +20,7 @@
     </ProjectConfiguration>
   </ItemGroup>
   <PropertyGroup Label="Globals">
-    <ProjectGuid>{CCAA2ACD-B171-6011-0646-93010DCF8BC5}</ProjectGuid>
+    <ProjectGuid>{6E1688D7-E3F2-8F4A-0748-8DEB832397A6}</ProjectGuid>
     <IgnoreWarnIntDirInTempDetected>true</IgnoreWarnIntDirInTempDetected>
     <IntDir>$(SolutionDir)IntDir\$(MSBuildProjectName)\</IntDir>
   </PropertyGroup>
@@ -62,14 +62,14 @@
   </ImportGroup>
   <PropertyGroup Label="UserMacros" />
   <PropertyGroup Condition="'$(Configuration)'=='Debug'">
-    <TargetName>boringssl_pqueue_test</TargetName>
+    <TargetName>boringssl_spake25519_test</TargetName>
     <Linkage-grpc_dependencies_zlib>static</Linkage-grpc_dependencies_zlib>
     <Configuration-grpc_dependencies_zlib>Debug</Configuration-grpc_dependencies_zlib>
     <Linkage-grpc_dependencies_openssl>static</Linkage-grpc_dependencies_openssl>
     <Configuration-grpc_dependencies_openssl>Debug</Configuration-grpc_dependencies_openssl>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)'=='Release'">
-    <TargetName>boringssl_pqueue_test</TargetName>
+    <TargetName>boringssl_spake25519_test</TargetName>
     <Linkage-grpc_dependencies_zlib>static</Linkage-grpc_dependencies_zlib>
     <Configuration-grpc_dependencies_zlib>Release</Configuration-grpc_dependencies_zlib>
     <Linkage-grpc_dependencies_openssl>static</Linkage-grpc_dependencies_openssl>
@@ -164,8 +164,8 @@
     </ClCompile>
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\test/boringssl\boringssl_pqueue_test_lib\boringssl_pqueue_test_lib.vcxproj">
-      <Project>{D03600F9-540A-2691-69F6-3A1DC2874D24}</Project>
+    <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\test/boringssl\boringssl_spake25519_test_lib\boringssl_spake25519_test_lib.vcxproj">
+      <Project>{B5EDD577-C90C-F122-313E-6D9803E91FEB}</Project>
     </ProjectReference>
     <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\boringssl_test_util\boringssl_test_util.vcxproj">
       <Project>{427037B1-B51B-D6F1-5025-AD12B200266A}</Project>
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj.filters b/vsprojects/vcxproj/test/boringssl/boringssl_spake25519_test/boringssl_spake25519_test.vcxproj.filters
similarity index 100%
copy from vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test/boringssl_pqueue_test.vcxproj.filters
copy to vsprojects/vcxproj/test/boringssl/boringssl_spake25519_test/boringssl_spake25519_test.vcxproj.filters
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test_lib/boringssl_pqueue_test_lib.vcxproj b/vsprojects/vcxproj/test/boringssl/boringssl_spake25519_test_lib/boringssl_spake25519_test_lib.vcxproj
similarity index 96%
copy from vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test_lib/boringssl_pqueue_test_lib.vcxproj
copy to vsprojects/vcxproj/test/boringssl/boringssl_spake25519_test_lib/boringssl_spake25519_test_lib.vcxproj
index 12198c1..f0347a4 100644
--- a/vsprojects/vcxproj/test/boringssl/boringssl_pqueue_test_lib/boringssl_pqueue_test_lib.vcxproj
+++ b/vsprojects/vcxproj/test/boringssl/boringssl_spake25519_test_lib/boringssl_spake25519_test_lib.vcxproj
@@ -19,7 +19,7 @@
     </ProjectConfiguration>
   </ItemGroup>
   <PropertyGroup Label="Globals">
-    <ProjectGuid>{D03600F9-540A-2691-69F6-3A1DC2874D24}</ProjectGuid>
+    <ProjectGuid>{B5EDD577-C90C-F122-313E-6D9803E91FEB}</ProjectGuid>
     <IgnoreWarnIntDirInTempDetected>true</IgnoreWarnIntDirInTempDetected>
     <IntDir>$(SolutionDir)IntDir\$(MSBuildProjectName)\</IntDir>
   </PropertyGroup>
@@ -57,10 +57,10 @@
   </ImportGroup>
   <PropertyGroup Label="UserMacros" />
   <PropertyGroup Condition="'$(Configuration)'=='Debug'">
-    <TargetName>boringssl_pqueue_test_lib</TargetName>
+    <TargetName>boringssl_spake25519_test_lib</TargetName>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)'=='Release'">
-    <TargetName>boringssl_pqueue_test_lib</TargetName>
+    <TargetName>boringssl_spake25519_test_lib</TargetName>
   </PropertyGroup>
     <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <ClCompile>
@@ -147,7 +147,7 @@
   </ItemDefinitionGroup>
 
   <ItemGroup>
-    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\ssl\pqueue\pqueue_test.c">
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\curve25519\spake25519_test.cc">
     </ClCompile>
   </ItemGroup>
   <ItemGroup>
diff --git a/vsprojects/vcxproj/test/boringssl/boringssl_spake25519_test_lib/boringssl_spake25519_test_lib.vcxproj.filters b/vsprojects/vcxproj/test/boringssl/boringssl_spake25519_test_lib/boringssl_spake25519_test_lib.vcxproj.filters
new file mode 100644
index 0000000..a94780c
--- /dev/null
+++ b/vsprojects/vcxproj/test/boringssl/boringssl_spake25519_test_lib/boringssl_spake25519_test_lib.vcxproj.filters
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <ClCompile Include="$(SolutionDir)\..\third_party\boringssl\crypto\curve25519\spake25519_test.cc">
+      <Filter>third_party\boringssl\crypto\curve25519</Filter>
+    </ClCompile>
+  </ItemGroup>
+
+  <ItemGroup>
+    <Filter Include="third_party">
+      <UniqueIdentifier>{88324f4e-8e00-0e8c-b6ab-d9406be0cccf}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="third_party\boringssl">
+      <UniqueIdentifier>{067bed6d-c308-8eee-2225-771546a4eb5c}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="third_party\boringssl\crypto">
+      <UniqueIdentifier>{08b844f4-9df6-ff01-d951-1c944f9e5b6b}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="third_party\boringssl\crypto\curve25519">
+      <UniqueIdentifier>{2f6416cc-d016-dedd-4e2f-d0ebd4d78fdb}</UniqueIdentifier>
+    </Filter>
+  </ItemGroup>
+</Project>
+
diff --git a/vsprojects/vcxproj/test/grpclb_test/grpclb_test.vcxproj b/vsprojects/vcxproj/test/grpclb_test/grpclb_test.vcxproj
index 91b9a6e..cd5aa4c 100644
--- a/vsprojects/vcxproj/test/grpclb_test/grpclb_test.vcxproj
+++ b/vsprojects/vcxproj/test/grpclb_test/grpclb_test.vcxproj
@@ -172,24 +172,24 @@
     </ClCompile>
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\gpr\gpr.vcxproj">
-      <Project>{B23D3D1A-9438-4EDA-BEB6-9A0A03D17792}</Project>
-    </ProjectReference>
-    <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\gpr_test_util\gpr_test_util.vcxproj">
-      <Project>{EAB0A629-17A9-44DB-B5FF-E91A721FE037}</Project>
-    </ProjectReference>
-    <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\grpc\grpc.vcxproj">
-      <Project>{29D16885-7228-4C31-81ED-5F9187C7F2A9}</Project>
-    </ProjectReference>
-    <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\grpc++\grpc++.vcxproj">
-      <Project>{C187A093-A0FE-489D-A40A-6E33DE0F9FEB}</Project>
-    </ProjectReference>
     <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\grpc++_test_util\grpc++_test_util.vcxproj">
       <Project>{0BE77741-552A-929B-A497-4EF7ECE17A64}</Project>
     </ProjectReference>
     <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\grpc_test_util\grpc_test_util.vcxproj">
       <Project>{17BCAFC0-5FDC-4C94-AEB9-95F3E220614B}</Project>
     </ProjectReference>
+    <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\grpc++\grpc++.vcxproj">
+      <Project>{C187A093-A0FE-489D-A40A-6E33DE0F9FEB}</Project>
+    </ProjectReference>
+    <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\grpc\grpc.vcxproj">
+      <Project>{29D16885-7228-4C31-81ED-5F9187C7F2A9}</Project>
+    </ProjectReference>
+    <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\gpr_test_util\gpr_test_util.vcxproj">
+      <Project>{EAB0A629-17A9-44DB-B5FF-E91A721FE037}</Project>
+    </ProjectReference>
+    <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\gpr\gpr.vcxproj">
+      <Project>{B23D3D1A-9438-4EDA-BEB6-9A0A03D17792}</Project>
+    </ProjectReference>
   </ItemGroup>
   <ItemGroup>
     <None Include="packages.config" />
diff --git a/vsprojects/vcxproj/test/stress_test/stress_test.vcxproj b/vsprojects/vcxproj/test/stress_test/stress_test.vcxproj
index 8e1b6bb..fed916f 100644
--- a/vsprojects/vcxproj/test/stress_test/stress_test.vcxproj
+++ b/vsprojects/vcxproj/test/stress_test/stress_test.vcxproj
@@ -163,6 +163,7 @@
     <ClInclude Include="$(SolutionDir)\..\test\cpp\interop\client_helper.h" />
     <ClInclude Include="$(SolutionDir)\..\test\cpp\interop\interop_client.h" />
     <ClInclude Include="$(SolutionDir)\..\test\cpp\interop\stress_interop_client.h" />
+    <ClInclude Include="$(SolutionDir)\..\test\cpp\util\create_test_channel.h" />
     <ClInclude Include="$(SolutionDir)\..\test\cpp\util\metrics_server.h" />
   </ItemGroup>
   <ItemGroup>
@@ -198,14 +199,14 @@
     </ClCompile>
     <ClInclude Include="$(SolutionDir)\..\src\proto\grpc\testing\test.grpc.pb.h">
     </ClInclude>
-    <ClCompile Include="$(SolutionDir)\..\test\cpp\interop\client_helper.cc">
-    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\test\cpp\interop\interop_client.cc">
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\test\cpp\interop\stress_interop_client.cc">
     </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\test\cpp\interop\stress_test.cc">
     </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\test\cpp\util\create_test_channel.cc">
+    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\test\cpp\util\metrics_server.cc">
     </ClCompile>
   </ItemGroup>
diff --git a/vsprojects/vcxproj/test/stress_test/stress_test.vcxproj.filters b/vsprojects/vcxproj/test/stress_test/stress_test.vcxproj.filters
index 476c04e..9339621 100644
--- a/vsprojects/vcxproj/test/stress_test/stress_test.vcxproj.filters
+++ b/vsprojects/vcxproj/test/stress_test/stress_test.vcxproj.filters
@@ -13,9 +13,6 @@
     <ClCompile Include="$(SolutionDir)\..\src\proto\grpc\testing\test.proto">
       <Filter>src\proto\grpc\testing</Filter>
     </ClCompile>
-    <ClCompile Include="$(SolutionDir)\..\test\cpp\interop\client_helper.cc">
-      <Filter>test\cpp\interop</Filter>
-    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\test\cpp\interop\interop_client.cc">
       <Filter>test\cpp\interop</Filter>
     </ClCompile>
@@ -25,6 +22,9 @@
     <ClCompile Include="$(SolutionDir)\..\test\cpp\interop\stress_test.cc">
       <Filter>test\cpp\interop</Filter>
     </ClCompile>
+    <ClCompile Include="$(SolutionDir)\..\test\cpp\util\create_test_channel.cc">
+      <Filter>test\cpp\util</Filter>
+    </ClCompile>
     <ClCompile Include="$(SolutionDir)\..\test\cpp\util\metrics_server.cc">
       <Filter>test\cpp\util</Filter>
     </ClCompile>
@@ -39,6 +39,9 @@
     <ClInclude Include="$(SolutionDir)\..\test\cpp\interop\stress_interop_client.h">
       <Filter>test\cpp\interop</Filter>
     </ClInclude>
+    <ClInclude Include="$(SolutionDir)\..\test\cpp\util\create_test_channel.h">
+      <Filter>test\cpp\util</Filter>
+    </ClInclude>
     <ClInclude Include="$(SolutionDir)\..\test\cpp\util\metrics_server.h">
       <Filter>test\cpp\util</Filter>
     </ClInclude>